템플릿 파일이 있습니다 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
플레이북의 한 가지 해결책은 빈 목록을 초기화한 다음 여기에 추가하는 것입니다.인벤토리 그룹에서 호스트 이름 순환:
- 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 %}
참고: 코드는 한 줄에 있어야 합니다.