プレイレベルでは、serial: 1
ホスト全体で一度に1つのホスト全体を実行できるようにします。しかし、これを単一のタスクで実行する簡単な方法は見つかりませんでした。問題のタスクが(何らかの理由で)適切なロックを実行しない場合、これは特に関連があります。
明らかな答えの1つは、タスクを独自の方法で実行することです。しかし、それは役割には役立ちません。 (置く必要があるserial: 1
役割を使った演劇の演技は本当に直感的ではありません。)
プレイブックの手順を並行して実行したくない場合は、フォークレベルを1に設定します。
ansible-playbook --forks=1 ...
これをansible cfgファイルに含めることもできます。
[defaults]
forks=1
ただし、個別に必要な場合は、上記のコマンドラインオプションを使用してください。
編集:
serial: 1
は、まったく異なることを行います。つまり、各ホストのプレイブックを順番に実行し、完全なプレイブックの完了を待ってから次のホストに進むようなものです。 forks=1
は、次のホストで同じタスクを実行する前に、1つのホストでプレイの最初のタスクを実行することを意味します。したがって、最初のタスクは、次のタスクがタッチされる前に各ホストに対して実行されます。
あなたが望んでいるのは forks=1
たった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
単一のマシンでそれを実行している場合、複数のホストに対して排他ロックの問題が発生します。したがって、すべてのホストに対して1つずつ実行する必要があります。これには、ansibleプレイブックを呼び出すときに--forks=1
を設定する必要がありますコマンド。例:ansible-playbook webserver.yml --forks=1
ここで、webserver.ymlには[webserver]
内にapp01 and app02があります。
ローカルで実行できるコマンドの場合は、ループを使用して、プレイ内のすべてのホストを反復します。これは、コマンドをローカルで実行できる場合にのみ機能します。このように、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 }}"
throttle: 1
に。
例:
---
- hosts: all
tasks:
- name: wait in parallel
command: sleep 20
- name: wait in serial
command: sleep 30
throttle: 1
参照:
あなたが欲しいものだと思います
run_once:true