如何将Playbook1中set_facts定义的变量传递至主Playbook?
解决方案:在主Playbook中获取子Playbook定义的变量
Ansible 中 import_playbook 导入的是独立的 Play,变量默认仅在该 Play 的作用域内生效,主 Playbook 的 Play 无法直接访问。结合你的场景,有两种可行的实现方式:
方式一:将子任务整合到同一Play中(推荐)
由于你的 playbook1.yaml 仅包含单个任务而非完整的 Play,更适合作为任务文件导入到主 Play 的任务列表中,这样变量会在同一Play作用域内自动共享。
修改后的文件内容:
playbook1.yaml(改为任务文件)
- name: 设置local_ip变量 set_fact: local_ip: "{{ sites[site]['peer_ip'] | ipaddr('address') }}" when: "site in sites.keys()"
master-playbook.yaml
--- - hosts: '{{ localhost | default("PALO_HOST") }}' connection: local become: yes gather_facts: true tasks: - name: 导入子任务文件 import_tasks: playbook1.yaml - name: 验证并使用local_ip变量 debug: msg: "获取到的local_ip是: {{ local_ip }}"
方式二:通过set_stats共享全局变量(适用于独立Play场景)
如果你的 playbook1.yaml 必须是一个完整的独立 Play,可以用 set_stats 将变量持久化为全局统计数据,主 Play 即可通过 hostvars 访问。
修改后的文件内容:
playbook1.yaml(补全为完整Play)
--- - hosts: localhost connection: local gather_facts: false tasks: - name: 设置local_ip变量 set_fact: local_ip: "{{ sites[site]['peer_ip'] | ipaddr('address') }}" when: "site in sites.keys()" - name: 将变量保存为全局统计数据 set_stats: data: local_ip: "{{ local_ip | default('') }}" aggregate: no
master-playbook.yaml
--- - import_playbook: playbook1.yaml - hosts: '{{ localhost | default("PALO_HOST") }}' connection: local become: yes gather_facts: true tasks: - name: 获取并使用全局变量local_ip debug: msg: "获取到的local_ip是: {{ hostvars['localhost']['ansible_stats']['data']['local_ip'] }}"
注意事项:
- 确保
sites和site变量在对应的 Play 中已正确定义(比如通过vars、vars_files或命令行传入),否则set_fact会执行失败。 - 方式一中的
import_tasks也可以替换为include_tasks,二者的区别在于import_tasks是静态导入(解析Playbook时加载),include_tasks是动态导入(执行到该任务时加载)。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

