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


14

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

明らかな答えの1つは、タスクを独自に実行することです。しかし、それは役割には役立ちません。(serial: 1ロールを使用してプレイすることは、本当に直感的ではありません。)

回答:


10

プレイブックの手順を実行する際に並列処理が必要ない場合は、フォークレベルを1に設定します。

ansible-playbook --forks=1 ...

これをansible cfgファイルに入れることもできます:

[defaults]
forks=1

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

編集:

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

だから、あなたforks=1はたった一回のプレーが欲しい。残念ながら、現在は不可能です。


2
これを脚本全体に設定するつもりはありませんでした。それは非粒状に大したことです。serial: 1少なくとも演劇に設定させてください。しかし、私はそれを演劇のサブアイテムに設定したいだけです(それの正しい名前は何でも。私はそれが「タスク」であると考えましたが、上記のコメントは同意しないようです)。
エルロン

3
serial: 1完全に異なることを行います。つまり、各ホストのプレイブックを順番に実行し、完全なプレイブックの完了を待ってから次のホストに移動するようなものです。forks=1は、次のホストで同じタスクを実行する前に、あるホストでプレイの最初のタスクを実行することを意味します。したがって、次のタスクに触れる前に、各ホストで最初のタスクが実行されます。だから、あなたforks=1はたった一回のプレーが欲しい。残念ながら、現在は不可能です。
ウルテル

いい視点ね!それを答えに追加してもいいですか?
エルロン

1

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


1

この問題には回避策があります-ホスト(またはグループ)のリストをに渡し、このリストで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

なぜrun_once: trueそこにあるのか疑問に思う人のために、それを取り出してみてください。何が起こるのか気に入らないでしょう。(非常に多くの繰り返しaaaahhhh)
アルメノン

0

何が欲しいと思う

run_once:true


4
nope: "run_once:true"は、ホストのリスト内の1つのホストに対してタスクを実行することを意味します。リスト内の各ホストに対して実行しますが、次々に実行します。
エルロン

0

ローカルで実行できるコマンドの場合、ループを使用して、プレイ内のすべてのホストを反復処理します。これは、コマンドをローカルで実行できる場合にのみ機能します。キーがセットアップされている場合、この方法でリモートマシンに対して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 }}"

1
という名前のホストだけでなく、ホストのリストを提供する必要がありますinventory_hostname。そうでない場合、ループは意味をなしません。
コンスタンチンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.