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