web-dev-qa-db-ja.com

Ansible:ホストごとに1つのタスクホストを実行する方法は?

プレイレベルでは、serial: 1ホスト全体で一度に1つのホスト全体を実行できるようにします。しかし、これを単一のタスクで実行する簡単な方法は見つかりませんでした。問題のタスクが(何らかの理由で)適切なロックを実行しない場合、これは特に関連があります。

明らかな答えの1つは、タスクを独自の方法で実行することです。しかし、それは役割には役立ちません。 (置く必要があるserial: 1役割を使った演劇の演技は本当に直感的ではありません。)

17
Elrond

プレイブックの手順を並行して実行したくない場合は、フォークレベルを1に設定します。

ansible-playbook --forks=1 ...

これをansible cfgファイルに含めることもできます。

[defaults]
forks=1

ただし、個別に必要な場合は、上記のコマンドラインオプションを使用してください。

編集:

serial: 1は、まったく異なることを行います。つまり、各ホストのプレイブックを順番に実行し、完全なプレイブックの完了を待ってから次のホストに進むようなものです。 forks=1は、次のホストで同じタスクを実行する前に、1つのホストでプレイの最初のタスクを実行することを意味します。したがって、最初のタスクは、次のタスクがタッチされる前に各ホストに対して実行されます。

あなたが望んでいるのは forks=1たった1回のプレイ。残念ながらそれは現在不可能です。

13
wurtel

この問題には回避策があります。ホスト(またはグループ)のリストをwith_itemsに渡し、このリストでdelegate_toを使用できます。このようにして、タスクはホストごとに実行されます。

例えば:

- name: start and enable rabbitmq (run task Host by Host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true
2

単一のマシンでそれを実行している場合、複数のホストに対して排他ロックの問題が発生します。したがって、すべてのホストに対して1つずつ実行する必要があります。これには、ansibleプレイブックを呼び出すときに--forks=1を設定する必要がありますコマンド。例:ansible-playbook webserver.yml --forks=1ここで、webserver.ymlには[webserver]内にapp01 and app02があります。

1
Rohan Seth

ローカルで実行できるコマンドの場合は、ループを使用して、プレイ内のすべてのホストを反復します。これは、コマンドをローカルで実行できる場合にのみ機能します。このように、sshを使用してリモートマシンに対してコマンドを1つずつ実行することもできますが、キーが設定されている場合はエスカレーションについて話すと難しくなります。

例えば:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"
0
Michele

throttle: 1に。

例:

---

- hosts: all
  tasks:
      - name: wait in parallel
        command: sleep 20
      - name: wait  in serial
        command: sleep 30
        throttle: 1

参照:

0
maxschlepzig

あなたが欲しいものだと思います

run_once:true

0
user19151