web-dev-qa-db-ja.com

テンプレート内のグループ変数を介したループ

Ansibleテンプレートで在庫変数をプルするパターンに苦労しています。助けてください。 :)

監視サーバーをセットアップしていますが、Ansibleを使用してサーバーを自動的にプロビジョニングできるようにしたいと考えています。これを可能にするために、テンプレートのループに苦労しています。

これまでの私の準作業ソリューションは、私が持っているテンプレートタスクを呼び出すプレイブックにあります。

monitoringserver.yml

 vars:
       servers_to_monitor:
         - {cname: web1, ip_address: 192.168.33.111}
         - {cname: web2, ip_address: 192.168.33.112}
         - {cname: db1, ip_address: 192.168.33.211}
         - {cname: db2, ip_address: 192.168.33.212}

template.yml

all_hosts += [
           {% for Host in servers_to_monitor %}
                   "{{ Host.cname }}{{ Host.ip }}|cmk-agent|prod|lan|tcp|wato|/" + FOLDER_PATH + "/",
           {% endfor %}
] 

ただし、監視するサーバーごとに異なるIPアドレスを定義することはできないため、これは理想的ではありません。他の人はどうやってこれをやったの?それは些細なことであるに違いないと確信していますが、私の脳は構文に苦労しています。

ありがとう

アラン

編集:結果のテンプレートを明確にするには、次のようになります。

all_hosts += [
                        "web1|cmk-agent|prod|lan|tcp|wato|/" + FOLDER_PATH + "/",
                        "web2|cmk-agent|prod|lan|tcp|wato|/" + FOLDER_PATH + "/",
                        "db1|cmk-agent|prod|lan|tcp|wato|/" + FOLDER_PATH + "/",
                        "db2|cmk-agent|prod|lan|tcp|wato|/" + FOLDER_PATH + "/",
]

私が望むのは、運用インベントリファイルを使用するか開発インベントリファイルを使用するかによって、web1/web2/db1/db2の値が異なることです。

18
Alan Hollis

理想的には、生産とステージングに異なるインベントリファイルを使用し、同じ{{ inventory_hostname }}値ですが、異なるマシンをターゲットにします。

異なるグループをループすることもできます...

ホスト:

[web]
web1
web2

[db]
db1
db2

プレイブック:

- name: play that sets a group to loop over
  vars:
    servers_to_monitor: "{{ groups['db'] }}"

  tasks:
    - template:
      src: set-vars.j2
      dest: set-vars.js

テンプレート:

all_hosts += [
{% for Host in servers_to_monitor %}
  "{{ hostvars[Host].inventory_hostname }}{{ hostvars[Host].ansible_default_ipv4.address }}|cmk-agent|prod|lan|tcp|wato|/" + FOLDER_PATH + "/",
{% endfor %}
] 
33
Conrado