Ansible如何创建全局列表变量?跨主机任务变量未定义问题求助
问题原因
你当前的servers_ip是在servers组的每个主机上单独定义的主机级变量,无法跨Play传递到wazuh-servers组的主机中,因此出现变量未定义的错误。
解决方法
以下是几种可行的方案,按简洁度排序:
方案一:直接通过groups和hostvars遍历IP(推荐)
无需单独设置变量,直接在wazuh-servers的Play中,遍历servers组所有主机的默认IP:
--- # 可选:如果之前没收集过servers组的facts,先收集 - name: Collect facts from servers group hosts: servers gather_facts: yes - name: open_firewall - Open the firewall of wazuh servers hosts: wazuh-servers tasks: - name: Allow port range 1514-1515 ufw: rule: allow port: 1514:1515 proto: tcp src: "{{ hostvars[item]['ansible_default_ipv4']['address'] }}" loop: "{{ groups['servers'] }}"
原理:groups['servers']会返回servers组的所有主机名,再通过hostvars[item]获取对应主机的facts数据。
方案二:将IP列表存到全局可访问的主机(如localhost)
在第一个Play中,把所有servers的IP汇总到localhost的变量中,跨Play直接调用:
--- - name: open_firewall - Collect servers IP list hosts: servers gather_facts: yes tasks: - name: Aggregate servers IPs to localhost set_fact: servers_ip: "{{ (hostvars['localhost']['servers_ip'] | default([])) + [ansible_default_ipv4.address] }}" delegate_to: localhost run_once: false # 让每个servers主机都执行,将自身IP加入列表 - name: open_firewall - Open the firewall of wazuh servers hosts: wazuh-servers tasks: - name: Allow port range 1514-1515 ufw: rule: allow port: 1514:1515 proto: tcp src: "{{ item }}" loop: "{{ hostvars['localhost']['servers_ip'] }}"
方案三:使用可缓存的全局变量(需开启Fact缓存)
开启Ansible Fact缓存后,给set_fact添加cacheable: yes参数,让变量全局可用:
--- - name: open_firewall - IP servers list hosts: servers gather_facts: yes tasks: - name: Create servers list per host set_fact: servers_ip: "{{ ansible_default_ipv4.address }}" cacheable: yes - name: open_firewall - Open the firewall of wazuh servers hosts: wazuh-servers tasks: - name: Allow port range 1514-1515 ufw: rule: allow port: 1514:1515 proto: tcp src: "{{ item }}" loop: "{{ groups['servers'] | map('extract', hostvars, 'servers_ip') | list }}"
注意:此方法需要提前在ansible.cfg中配置Fact缓存(如fact_caching=jsonfile)。
内容的提问来源于stack exchange,提问作者Mauro Alejandro Pereira
相关产品推荐
相关产品推荐

