2016-12-20 8 views
4

私は、Webサーバ(すべて同じホスト上)のリストを含むAnsible変数を持っている:実行Ansibleハンドラ

servers: 
    - foo 
    - bar 
    - baz 

そして、その設定ファイルを変更したタスク、およびレジスタ変数に結果:

- name: create server configs 
    template: ... 
    with_items: "{{ servers }}" 
    notify: restart changed servers 
    register: servers_changed 

し、そのタスクの実行時に変更されただけのサーバーを再起動し、ハンドラ:

- name: restart changed servers 
    command: restart-my-server {{ item.item.name }} 
    when: item.changed 
    with_items: "{{ servers_changed.results }}" 

私の問題は、異なる設定ファイルを変更する上記のような複数のタスクが必要になることです。しかし、そうすれば、servers_changed変数を上書きするので、最後の変数だけが使用されます。

私はそれぞれのタスクで異なる変数を登録することができましたが、それぞれのハンドラーごとに異なるハンドラーが必要でした。これは乱雑になるでしょう。より良い方法がありますか?

答えて

0

私が好むアプローチを発見しました。これにより、再起動が必要なサーバー名の配列を含む変数restart_serversが作成されます。設定ファイルを更新した後、変更された項目を変数に追加します。

VARS:

servers: 
- name: server1 
    port: 1000 
- name: server2 
    port: 1001 

タスク:

- name: create server configs 
    template: ... 
    with_items: "{{ servers }}" 
    notify: restart changed servers 
    register: servers_changed 

- name: remember which servers need to restart 
    set_fact: 
    restart_servers: "{{ restart_servers | default([]) + [item.item.name] }}" 
    when: item.changed 
    with_items: "{{ servers_changed.results }}" 

ハンドラ:

- name: restart changed servers 
    command: restart-my-server {{ item.name }} 
    when: item.name in restart_servers | default([]) 
    with_items: "{{ servers }}" 

欠点は、再起動をトリガーする可能性がある各タスクの後に、あなたは2番目のタスクを必要とするということです変更されたサーバーに基づいてset_factを呼び出します。

利点は理解しやすく、重複するハンドラや再起動の重複を避けることができるという利点があります。

+0

クール。しかし、なぜ 'with_items:" {{restart_servers}} "をハンドラ内で直接使用しないで、この' when'を...削除するのですか? –

+1

@WojciechKaczmarek私は、私の事例ではあまりにも単純すぎるものを単純化したと思う。私の本当のセットアップでは、 'servers'は各サーバの詳細を含むdictsのリストですが、' restart_servers'は各サーバを識別する名前のリストです。代わりに 'restart_servers'にハンドラループを持たせることもできますが、' servers'をループすることで、再起動する各サーバの詳細にアクセスすることができます。一例として、私は自分のハンドラに各サーバのポート番号を見て、それがオープンするのを待ってから続行します。 –

+0

私はこの例を更新しました。 –

3

複合リストとして使用servers_changed各タスクの結果を連結:

- name: create server configs 
    template: ... 
    with_items: "{{ servers }}" 
    notify: restart changed servers 
    register: servers_changed_now 

- set_fact: 
    servers_changed: "{{ servers_changed | default([]) | union(servers_changed_now.results|default([]) }}" 

- name: restart changed servers 
    command: restart-my-server {{ item.item.name }} 
    when: item.changed 
    with_items: "{{ servers_changed }}" 
+1

私は、登録された変数をマージするset_factで使用するカスタムフィルタを作成しましたが、重複したサーバは無視します(サーバを複数回再起動するのを避けるため)。 –

+0

実際にカスタムフィルタは必要ありません。空のリストを処理してエントリを複製する答えが更新されました。 – techraf

+0

サーバ名を見つけるためにitem.itemを調べなければならないので、重複したサーバを排除するとは思えません。 –

関連する問題