2017-01-09 25 views
1

ハンドブックをプレイハンド全体で1回だけ実行したいとします。実行可能なハンドラは、プレイブック全体に対して1回だけ実行してください。

私は脚本ファイルに次のincludeステートメントを使用して試みたが、これは各プレイのために一回、複数回実行されているハンドラの結果:ここ

- name: Configure common config 
    hosts: all 
    become: true 
    vars: 
     OE: "{{ ansible_hostname[5] }}" 
    roles: 
    - { role: common } 
    handlers: 
    - include: handlers/main.yml 

- name: Configure metadata config 
    hosts: metadata 
    become: true 
    vars: 
     OE: "{{ ansible_hostname[5] }}" 
    roles: 
    - { role: metadata } 
    handlers: 
    - include: handlers/main.yml 

はメインハンドラ/の内容です。 YML:ここ

- name: restart autofs 
    service: 
    name: autofs.service 
    state: restarted 

は、ハンドラに通知タスクの1の例である:

- name: Configure automount - /opt/local/xxx in /etc/auto.direct 
    lineinfile: 
    dest: /etc/auto.direct 
    regexp: "^/opt/local/xxx" 
    line: "/opt/local/xxx -acdirmin=0,acdirmax=0,rdirplus,rw,hard,intr,bg,retry=2 nfs_server:/vol/xxx" 
    notify: restart autofs 

ハンドブック全体を1回だけ実行するようにするにはどうすればよいですか?

+0

あなたのプレイブックは少し野生のようです。このプレイブックの一般的な考え方は何ですか?なぜこのハンドラをここに含めるのですか?ハンドラはタスクによって通知される必要があるため、ロールの一部です。 ハンドブックの使用方法については、https://docs.ansible.com/ansible/playbooks_intro.htmlを参照してください。 特定のタスクを1回実行するもう1つの方法は、次のとおりです。https://docs.ansible.com/ansible/playbooks_delegation.html#run-once –

+0

野生の意味がわかりません。プレイブックは一連のプレイであり、その例では2つあります。私は複数の演劇のための単一のハンドラを使い、それがプレイブック全体のために一度実行するようにしたい。私はそれが理にかなったことを願うタスクを1回だけ実行する必要はなく、ハンドラを1回だけ実行する必要があります。 – user3155618

+0

@techrafハンドラーに通知する再生には、複数のタスクがあります。質問を編集してタスクの1つを追加しました。 – user3155618

答えて

4

タイトルの質問に対するリテラルの回答は、次のとおりです。ただし、問題の解決方法は可能ですが、「プレイブックハンドラ」(下記参照)ではなく、追加のプレイを使用します。

プレイブックを主張Ansibleドキュメントで長い入門ノートにもかかわらず答え

は、オーケストレーションのための基礎となる、プレイブックは、演劇のリストだけが現実です。

プレイブックには名前空間、変数、状態がありません。すべての設定、ロジック、タスクはプレイに含まれます。

ハンドラは、別の呼び出しスケジュール(順序は異なりますが、条件付きではなく、末尾に1回またはmeta: flush_handlers)で実行されます。

したがって、ハンドラはプレイブックに属し、プレイブックには属しません。


前記溶液

、ハンドブック毎に一度サービスを再起動する問題に対する解決策は、メモリ内のインベントリを使用して解決することができます。

あなたは別の場にあなたの質問からハンドラをオンにし、脚本の終わりにそれを置くことができます。

- hosts: hosts_to_restart_autofs 
    tasks: 
    - name: Perform autofs restart 
     service: 
     name: autofs.service 
     state: restarted 

続いてhosts_to_restart_autofsリストにホストを追加するために各プレイにハンドラを使用しますadd_host module

handlers: 
    - name: restart autofs 
    add_host: 
     name: "{{ inventory_hostname }}" 
     groups: hosts_to_restart_autofs 

この方法でハンドラの代わりに、ターゲット・ノードに直接サービスを再起動して、代わりにメモリ内のインベントリに、そのノードのホスト名を追加します。 2回目の再生でハンドラが通知される場合、ホスト名はすでにリストに登録されています。

最後の再生は、複数の再生からのハンドラによってリストに追加されたターゲットノードでサービスを再開するタスクを実行します。

+0

ありがとう@techraf!答えは有用であり、ソリューションはテストされたときに機能します。 – user3155618

0

ハンドラーが何をすべきかはわかりません。とにかく、official documentation用として、ハンドラ

は、劇中のタスクの各ブロックの最後でトリガ とだけのよう[...]複数の異なる タスクで通知しても一度トリガされていますハンドラは一般的なトピックを「聴く」ことができ、タスクはこれらのトピックに次のように通知することができます。

したがって、ハンドラはタスクのブロックごとに1回通知され/実行されます。 「すべての」ターゲットホストの後にハンドラを置くだけで目標を達成できますが、ハンドラをきれいに使うことはできません。 。

+0

ハンドラが「すべての」ターゲットホストのプレイにのみ含まれている場合は、他のプレイで通知されたときに実行されません。 – user3155618

+0

あなたは正しいです。しかし、あなたの "ハンドラー/ main.yml"は何をしていますか? – gile

+0

元の質問を編集しました。投稿の "handlers/main.yml"の内容をご覧ください。 – user3155618

関連する問題