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

如何在Ansible Playbook中调用inventory.ini内的IP作为变量

解决Ansible Playbook循环调用清单中PAN-OS设备IP的问题

你的核心问题在于当前Playbook的hosts: localhost导致Ansible没有把inventory里的IP当作目标主机,而是始终以localhost为执行对象。这里提供两种可行的解决方案,适配你的Ansible 2.8版本:

方案一:通过loop遍历inventory中的IP列表

这种方法保持hosts: localhost不变,手动读取inventory里的所有IP并循环执行任务,适合需要在本地集中处理多台设备的场景:

首先确保你的inventory.ini格式规范(每行一个IP,Ansible识别更可靠):

10.0.0.4
10.0.0.5

然后修改Playbook,移除ip_address变量,在每个任务中添加loop遍历groups['all'](Ansible默认将所有清单条目归入all组):

- name: Import & load configuration file into PAN-OS
  hosts: localhost
  connection: local
  gather_facts: False
  vars:
    username: "#{PALOS_USERNAME}#"
    password: "#{PALOS_PASSWORD}#"
    config_file: ""
    load_file: ""
  roles:
    - role: PaloAltoNetworks.paloaltonetworks
  tasks:
    - name: Wait for reboot on each PAN-OS device
      panos_check:
        ip_address: "{{ item }}"
        username: "{{ username }}"
        password: "{{ password }}"
        interval: 5
        timeout: 900
      loop: "{{ groups['all'] }}"
      loop_control:
        label: "{{ item }}"  # 让输出日志显示当前处理的IP,提升可读性

    - name: Import configuration file into each PAN-OS device
      panos_import:
        ip_address: "{{ item }}"
        username: "{{ username }}"
        password: "{{ password }}"
        file: "{{ config_file }}"
        category: "configuration"
      loop: "{{ groups['all'] }}"
      loop_control:
        label: "{{ item }}"

方案二:将inventory中的IP设为Playbook目标主机

这种方法调整hosts为all,让Ansible自动为每个清单IP执行整个Playbook,更贴合Ansible的原生主机管理逻辑:

修改后的Playbook如下:

- name: Import & load configuration file into PAN-OS
  hosts: all
  connection: local
  gather_facts: False
  vars:
    username: "#{PALOS_USERNAME}#"
    password: "#{PALOS_PASSWORD}#"
    config_file: ""
    load_file: ""
  roles:
    - role: PaloAltoNetworks.paloaltonetworks
  tasks:
    - name: Wait for reboot
      panos_check:
        ip_address: "{{ inventory_hostname }}"
        username: "{{ username }}"
        password: "{{ password }}"
        interval: 5
        timeout: 900

    - name: Import configuration file into PAN-OS
      panos_import:
        ip_address: "{{ inventory_hostname }}"
        username: "{{ username }}"
        password: "{{ password }}"
        file: "{{ config_file }}"
        category: "configuration"

为什么这个方案能解决你的问题?

你之前用{{ inventory_hostname }}得到localhost,是因为Playbook的hosts被设为localhost,改成hosts: all后,inventory_hostname会自动对应inventory里的每个IP地址。而connection: local参数确保任务在本地执行(符合PAN-OS模块的运行要求,模块通过ip_address远程连接设备)。

两种方案都可以正常运行,你可以根据自己的习惯选择。执行Playbook的命令保持不变即可:

ansible-playbook panos-config.yml -i inventory.ini --extra-vars "config_file=./xml-config/asdf.xml load_file=asdf.xml" -vvv

内容的提问来源于stack exchange,提问作者Beefcake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:57:14