쇼의 모든 호스트 목록과 해당 호스트의 eth0 IP 주소를 어떻게 생성합니까? 나는 다음과 같은 목록을 원합니다.
host2ip:
- host1: 10.0.0.1
- host2: 10.0.0.2
- host3: 10.0.0.3
답변1
하위 집합 가져오기 및 변수 설정아이피. 의 가치아이피목록이 될 것입니다. 왜냐하면상호 작용IP 주소가 더 있을 수 있습니다.
- setup:
gather_subset: interfaces
- set_fact:
ip: "{{ lookup('vars', 'ansible_' ~ interface).ipv4 |
map(attribute='address') }}"
성명상호 작용호스트와 해당 IP 주소의 사전입니다. 예를 들어,
interface: em0
host_ip: "{{ dict(ansible_play_hosts |
zip(ansible_play_hosts |
map('extract', hostvars, 'ip'))) }}"
이 사전은 자주 사용되는 패턴입니다. 바라보다사전(키|zip(값)).
예를 들어, 주어진
host_ip:
test_01: [10.1.0.51]
test_02: [10.1.0.52]
test_03: [10.1.0.53]
이 경우 사전이 더 나은 구조입니다. 반복하고 싶다면 목록으로 쉽게 변환할 수 있습니다. 예를 들어,
host_ip | dict2items:
- key: test_01
value: [10.1.0.51]
- key: test_02
value: [10.1.0.52]
- key: test_03
value: [10.1.0.53]
체크리스트를 요구하는 경우 다음 진술을 작성하십시오.
host_ip_list: |
{% filter from_yaml %}
{% for host in ansible_play_hosts %}
- {{ host }}: {{ hostvars[host]['ip'] | first }}
{% endfor %}
{% endfilter %}
첫 번째 주소 선택을 포함하여 원하는 것을 제공하십시오
host_ip_list:
- test_01: 10.1.0.51
- test_02: 10.1.0.52
- test_03: 10.1.0.53
테스트를 위한 완전한 플레이북 예시
- hosts: test
vars:
interface: em0
host_ip: "{{ dict(ansible_play_hosts |
zip(ansible_play_hosts |
map('extract', hostvars, 'ip'))) }}"
host_ip_list: |
{% filter from_yaml %}
{% for host in ansible_play_hosts %}
- {{ host }}: {{ hostvars[host]['ip'] | first }}
{% endfor %}
{% endfilter %}
tasks:
- setup:
gather_subset: interfaces
- set_fact:
ip: "{{ lookup('vars', 'ansible_' ~ interface).ipv4 |
map(attribute='address') }}"
- debug:
var: ip
- block:
- debug:
var: host_ip | to_yaml
- debug:
var: host_ip | dict2items | to_yaml
- debug:
var: host_ip_list
run_once: true