如何将变量列表传递到Ansible不同主机组的另一个play中
问题分析与解决建议
原Playbook存在的问题
- 变量名拼写错误:第二个Play中使用
my_strings进行列表拼接,但初始化的变量名是my_string,导致拼接逻辑完全失效。 - 变量作用域问题:
set_fact默认将变量存储在单个主机的hostvars中,而非全局变量。后续Play无法通过组名cisco直接访问组内所有主机的变量集合。 - 冗余的收集逻辑:无需手动循环追加主机名,Ansible内置了
groups变量可直接获取指定组的所有主机名列表。
解决方案
方案一:直接使用内置groups变量(推荐)
这是最简洁的实现方式,利用Ansible原生变量直接获取cisco组的主机名列表:
- hosts: remoteserver tasks: - name: 查找Cisco设备对应的配置文件 find: paths: /Config/ansible-backups/ patterns: "{{ item }}-config-*.txt" register: stored_configs loop: "{{ groups['cisco'] }}"
方案二:手动收集主机名(适用于需要自定义过滤的场景)
如果需要对主机名进行筛选(比如只收集特定条件的主机),可以将变量存储到localhost的hostvars中,实现跨Play共享:
- name: 收集Cisco组主机名到全局列表 hosts: cisco gather_facts: no tasks: - name: 逐个追加主机名到列表 set_fact: cisco_hosts: "{{ cisco_hosts | default([]) + [inventory_hostname] }}" delegate_to: localhost # 将变量存储在localhost,确保全局可访问 - hosts: remoteserver tasks: - name: 查找对应配置文件 find: paths: /Config/ansible-backups/ patterns: "{{ item }}-config-*.txt" register: stored_configs loop: "{{ hostvars['localhost']['cisco_hosts'] }}"
关键说明
groups['cisco']:Ansible内置变量,返回cisco主机组中所有主机名的列表,无需额外编写收集逻辑。delegate_to: localhost:将变量存储在本地主机的hostvars中,避免变量被绑定到单个远程主机,确保后续Play可以跨组访问。
内容的提问来源于stack exchange,提问作者mrin9san
相关产品推荐
相关产品推荐

