You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:05:21