如何在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
相关产品推荐
相关产品推荐

