Ansible을 사용하여 IP 사전에 호스트 이름 만들기

Ansible을 사용하여 IP 사전에 호스트 이름 만들기

4개의 독립 Docker 호스트에서 Docker Swarm 클러스터를 생성하기 위한 플레이북을 작성하려고 합니다. 그 일환으로 저는 Ansible 사실을 통해 각 노드에서 Ansible 호스트 이름과 특정 이더넷 장치 IPv4 주소를 수집하고 사전을 만들었습니다.

- name: "Clear swarm_ips dictionary"
 set_fact:
    swarm_ips: "{{ swarm_ips | default([]) }}"


- name: "Create dictionary with enp42s0 IP and hostname of manager"
 set_fact:
    swarm_ips: "{{ swarm_ips | combine ({item.key : item.value}) }}"
 with_items:
    - { 'key': '{{ ansible_facts.hostname | string }}.ip' , 'value': '{{ ansible_facts.enp42s0.ipv4.address | string }}' }
 when: (ansible_facts.hostname == "manager") 

    
- name: "Add eth0 IP and hostname of worker[1,2] to swarm_ips"
 set_fact:
    swarm_ips: "{{ swarm_ips | combine ({item.key : item.value}) }}"
 with_items:
    - { 'key': '{{ ansible_facts.hostname | string }}.ip' , 'value': '{{ ansible_facts.eth0.ipv4.address | string }}' }
 when: (ansible_facts.hostname == "worker1") or 
       (ansible_facts.hostname == "worker2") 

- name: "Add br0 IP and hostname of worker0 to swarm_ips dictionary"
 set_fact:
    swarm_ips: "{{ swarm_ips | combine ({item.key : item.value}) }}"
 with_items:
    - { 'key': '{{ ansible_facts.hostname | string }}.ip' , 'value': '{{ ansible_facts.br0.ipv4.address | string }}' }
 when: (ansible_facts.hostname == "worker0")

- name: "Echo IP for all nodes from swarm_ips dict"
 debug: 
    var: swarm_ips 

나는 극의 마지막 단계의 출력이 다음과 같을 것으로 예상합니다.

ok: {
    "swarm_ips": {
        "manager.ip": "10.0.1.203"
        "worker0.ip": "10.0.1.42"
        "worker1.ip": "10.0.1.201"
        "worker2.ip": "10.0.1.252"                
    }
}

대신 나는 얻는다

ok: [manager.local] => {
    "swarm_ips": {
        "manager.ip": "10.0.1.203"
    }
}
ok: [worker0.local] => {
    "swarm_ips": {
        "worker0.ip": "10.0.1.42"
    }
}
ok: [worker1.local] => {
    "swarm_ips": {
        "worker1.ip": "10.0.1.201"
    }
}
ok: [worker2.local] => {
    "swarm_ips": {
        "worker2.ip": "10.0.1.252"
    }
}

아마도 이 중 일부 또는 전부를 실행 localhost하고 호스트 변수를 사용하여 클러스터 호스트에 대한 정보를 얻을 수 있는 방법이 있을 것입니다.생각하다이것도 내가 예상한 대로 작동할 것입니다. 내가 무엇을 놓치고 있나요?

답변1

사전 추출swarm_ips~에서호스트 변수그리고결합하다예를 들어 그들은

    - set_fact:
        swarm_ips: "{{ ansible_play_hosts|
                       map('extract', hostvars, 'swarm_ips')|
                       combine }}"
      run_once: true

주어진

  swarm_ips:
    manager.ip: 10.0.1.203
    worker0.ip: 10.0.1.42
    worker1.ip: 10.0.1.201
    worker2.ip: 10.0.1.252

관련 정보