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

如何将变量列表传递到Ansible不同主机组的另一个play中

问题分析与解决建议

原Playbook存在的问题

  1. 变量名拼写错误:第二个Play中使用my_strings进行列表拼接,但初始化的变量名是my_string,导致拼接逻辑完全失效。
  2. 变量作用域问题:set_fact默认将变量存储在单个主机的hostvars中,而非全局变量。后续Play无法通过组名cisco直接访问组内所有主机的变量集合。
  3. 冗余的收集逻辑:无需手动循环追加主机名,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:55:05