テンプレートファイルがありますconfig.j2
。
{% for host in groups['dbs'] %}
ips= {{ hostvars[host].ansible_default_ipv4.address }}
{% endfor %}
私の結果は次のとおりです
ips= 192.168.231.91
ips= 192.168.231.92
ips= 192.168.231.93
次のように配列変数に出力を保存したいと思います。
ips=192.168.231.91,192.168.231.92,192.168.231.93
どうすればいいですか?ありがとうございます。
解決策を見つけて編集して出力します。
- set_fact:
ips: []
run_once: true
- set_fact:
ips: "{{ips}} + ['{{hostvars[item].ansible_default_ipv4.address}}']"
with_inventory_hostnames:
- dbs
run_once: true
- name: Save ip servers
template: src=conf.j2 dest=/root
TASK [Gathering Facts] *************************************************************************************************************************
ok: [db1]
ok: [db2]
ok: [db3]
TASK [get-var : set_fact] **********************************************************************************************************************
ok: [db1]
TASK [get-var : set_fact] **********************************************************************************************************************
ok: [db1] => (item=db1)
ok: [db1] => (item=db3)
ok: [db1] => (item=db2)
TASK [get-var : Save ip servers] ***************************************************************************************************************
ok: [db1]
ok: [db2]
ok: [db3]
PLAY RECAP *************************************************************************************************************************************
db1 : ok=4 changed=0 unreachable=0 failed=0
db2 : ok=2 changed=0 unreachable=0 failed=0
db3 : ok=2 changed=0 unreachable=0 failed=0
最後に、ホスト(db)のテンプレートに出力されます。
[root@db1 ~]# cat conf.j2
ips=[]
[root@db1 ~]#
答え1
PlayBookの1つの解決策は、空のリストを初期化してからここに追加することです。在庫グループのホスト名の循環:
- set_fact:
ips: []
run_once: true
- set_fact:
ips: "{{ips}} + ['{{hostvars[item].ansible_default_ipv4.address}}']"
with_inventory_hostnames:
- dbs
run_once: true
- template:
src: config.j2
dest: /tmp/whatever
config.j2
テンプレートファイルが含まれています。
ips={{ ips|to_yaml }}
答え2
私が働いた方法は次のとおりです。
- set_fact:
ips="[]"
run_once: true
- set_fact:
ips="{{ ips }} + ['{{ hostvars[item].ansible_default_ipv4.address }}']"
with_inventory_hostnames:
- dbs
run_once: true
- name: get ip list locally
local_action: copy content="{{ ips }}" dest=files/nodes
run_once: true
ファイル/ノード
["192.168.1.13", "192.168.1.8", "192.168.1.14", "192.168.1.6", "192.168.1.9"]
答え3
インベントリの各ホストに対して ansible_host 変数を使用すると、次のことができます。
- set_fact: nodelist={%for host in groups['dbs']%}{{hostvars[host].ansible_host}}{%
if not loop.last %},{% endif %}{% endfor %}
またはあなたの条件に従って:
- set_fact: nodelist={%for host in groups['dbs']%}
{{ hostvars[host].ansible_default_ipv4.address }}{% if not loop.last %},{% endif %}{%
endfor %}
注:コードは1行にする必要があります。