串行运行Ansible Playbook时获取master/replica主机IP的问题
问题背景
我原本用Jinja模板提取master和replica主机的IP地址,模板代码如下:
<node> <host>{{ hostvars[master|default(ansible_hostname|lower)]['ansible_default_ipv4']['address'] }}</host> <port>7800</port> </node> <node> <host>{{ hostvars[replica|default(ansible_hostname|lower)]['ansible_default_ipv4']['address'] }}</host> <port>7800</port> </node>
当并行在master和replica主机上运行任务时,模板工作正常。但因为变更后需要通过handler重启服务,且不想同时重启两个节点,所以改用串行模式运行Playbook。
此时出现问题:串行运行仅处理单台主机时,无法获取另一台主机的ansible_default_ipv4信息。
我尝试添加pre_task来提前收集主机信息:
- pre_tasks: - name: Run setup ansible.builtin.setup: filter: - all_ipv4_addresses delegate_to: "{{ item }}" loop: - "{{ master }}" - "{{ replica }}" register: ip_v4
然后设置facts:
- name: Set facts set_fact: master_ip: "{{ip_v4.results[0]}}" replica_ip: "{{ip_v4.results[1]}}"
但ip_v4.results[0]包含大量冗余信息,我只需要其中的IP地址,想知道有没有更好的解决方法。
解决方案
方法1:优化现有set_fact提取IP
直接从setup模块返回的结果中提取目标IP字段即可,若主机只有一个IPv4地址,取列表第一个元素:
- name: Set facts with extracted IPs set_fact: master_ip: "{{ ip_v4.results[0].ansible_facts.all_ipv4_addresses[0] }}" replica_ip: "{{ ip_v4.results[1].ansible_facts.all_ipv4_addresses[0] }}"
如果主机存在多个IPv4地址,需要筛选特定网段的IP,可结合select和正则匹配:
master_ip: "{{ ip_v4.results[0].ansible_facts.all_ipv4_addresses | select('match', '192.168.*') | first }}"
方法2:直接在模板中引用收集结果
无需单独设置master_ip和replica_ip,直接在Jinja模板中从注册的ip_v4结果里筛选对应主机的IP,更简洁:
<node> <host>{{ ip_v4.results | selectattr('item', 'equalto', master) | map(attribute='ansible_facts.all_ipv4_addresses.0') | first }}</host> <port>7800</port> </node> <node> <host>{{ ip_v4.results | selectattr('item', 'equalto', replica) | map(attribute='ansible_facts.all_ipv4_addresses.0') | first }}</host> <port>7800</port> </node>
方法3:提前收集所有目标主机的facts(通用方案)
在Play级别关闭自动收集facts,通过pre_task提前收集master和replica的完整facts,这样后续就能像并行模式一样直接使用hostvars访问IP,无需修改原模板:
- name: Your Target Play hosts: all gather_facts: no pre_tasks: - name: Gather facts for master and replica ansible.builtin.setup: delegate_to: "{{ item }}" loop: - "{{ master }}" - "{{ replica }}"
内容的提问来源于stack exchange,提问作者Magnus Persson
相关产品推荐
相关产品推荐

