Ansible如何将vmName变量传递给include_tasks导入的playbook指定运行主机
解决方案
你当前的核心问题是:include_tasks 仅支持导入纯任务列表(无- hosts开头的Play定义),而你写的configureserver.yml是完整的独立Playbook,包含了Play定义,可通过以下两种方案实现需求:
方案一:保留configureserver.yml独立可执行(无需修改原有configureserver.yml)
该方案无需调整你已经写完的configureserver.yml代码,仅需修改main.yml的导入方式即可。import_playbook支持导入完整的Playbook,且会自动继承父Playbook中已经定义的vmName变量,直接就能识别你要操作的目标主机:
# 把你原来写的include_tasks替换成下面的内容,放在main.yml的末尾即可 - import_playbook: configureserver.yml
补充注意项:
建议在原有部署Play的末尾增加等待端口可用的任务,避免VM还没启动完成就执行配置导致连接失败:
# 放在原有main.yml部署任务的最后、import_playbook之前 - name: 等待虚拟机SSH端口就绪 wait_for: host: "{{ vmName }}" port: 22 delay: 30 timeout: 300 state: started
如果控制节点无法解析vmName对应的域名,可以先通过vmware_guest_info模块获取虚拟机的IP,再传递给configureserver.yml使用。
方案二:把configureserver.yml改为纯任务列表(适合多场景复用任务)
如果你的configureserver.yml仅存放配置任务,不需要单独作为Playbook执行,可以调整结构提高复用性:
- 修改configureserver.yml,删除Play头,只保留具体任务:
# 修改后的configureserver.yml,仅保留任务列表 - name: 配置D盘分区 win_partition: drive_letter: D size: maximum # 其他所有配置任务依次写在下方即可
- 在main.yml的原有部署Play末尾,先将虚拟机加入临时清单,再新增一个Play执行配置任务:
# 原有部署Play(hosts: localhost)内新增以下两个任务,放在原有配置VM任务之后 - name: 将新虚拟机添加到临时清单 add_host: name: "{{ vmName }}" groups: new_vms ansible_connection: ssh ansible_shell_type: cmd ansible_become_method: runas ansible_become_user: System - name: 等待虚拟机SSH端口就绪 wait_for: host: "{{ vmName }}" port: 22 delay: 30 timeout: 300 state: started --- # 原有部署Play结束后,新增以下Play执行配置 - hosts: new_vms gather_facts: no become: yes vars_files: - passwords.yml - vars.test.yml tasks: - name: 执行服务器配置任务 include_tasks: configureserver.yml
通用注意项
两种方案都需要保证你的OVF模板已经提前开启了SSH服务,并且防火墙放行了22端口,否则会出现连接失败的问题。如果使用WinRM连接Windows,把对应的ansible_connection等参数替换为WinRM的配置即可。
内容的提问来源于stack exchange,提问作者Tyler Durden
相关产品推荐
相关产品推荐

