Ansible 배열 변수

Ansible 배열 변수

템플릿 파일이 있습니다 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 %}

참고: 코드는 한 줄에 있어야 합니다.

관련 정보