Ansible如何将vars_prompt获取的主机列表传入import_playbook
问题根因
你遇到的变量未定义错误是两个核心原因导致的:
import_playbook属于Ansible的静态导入能力,会在整个playbook任务启动前的解析阶段就完成子playbook的加载,此时vars_prompt还未执行、set_fact任务也还没运行,对应变量还未生成。- 你通过
set_fact设置的是第一个play中目标主机的主机级变量,仅作用于该主机在当前play的任务上下文,无法作用到子playbook的hosts字段——这个字段需要的是全局可见的play级/全局变量。
解决方案
方案1:导入时显式传递vars_prompt变量(最适配你的场景)
你只需要修改父playbook中导入子playbook的部分,显式将vars_prompt获取的变量传递给子playbook即可,无需修改其他逻辑:
# 父playbook ios_check_routerports.yaml 导入部分修改为 - name: Run playbook import_playbook: ios_check_routerports_main.yaml vars: # 直接把全局的branch_number变量传递给子playbook branch_number: "{{ branch_number }}"
子playbook不需要修改,保留hosts: '{{ branch_number }}'即可正常运行。
方案2:改用动态导入include_playbook
如果后续你需要根据父playbook的前置任务结果,动态判断是否执行子playbook,可以换成运行时执行的动态导入:
# 父playbook导入部分修改为 - name: Run playbook include_playbook: ios_check_routerports_main.yaml vars: branch_number: "{{ branch_number }}"
include_playbook会在运行到对应任务时才加载子playbook,此时vars_prompt已经执行完成,变量已经生成。
额外注意
你提供的父playbook代码中,tasks字段的缩进有问题,需要调整到和vars_prompt同级(缩进两个/四个空格,和play内的其他参数对齐),否则会触发语法错误。
内容的提问来源于stack exchange,提问作者Heiko
相关产品推荐
相关产品推荐

