Ansible Tower如何将vSphere动态清单传入Playbook变量
实现方法
你不需要手动把动态生成的清单内容传入变量文件,AWX/Tower启动作业时会自动完成lab_vm vSphere动态清单的同步,将所有匹配虚拟机的主机信息、关联属性自动注入Ansible运行时变量,按以下步骤调整配置即可:
1. 调整AWX作业模板配置
- 作业模板的「清单」项直接选择已创建的
lab_vm动态清单 - 如果不需要对清单内全量虚拟机打快照,可以提前在动态清单里配置分组规则,或者在作业模板的「限制」项里填写目标主机/组匹配规则
- 原来配置的VMWARE_HOST/VMWARE_USER/VMWARE_PASSWORD凭据直接绑定到作业模板即可,不需要修改现有环境变量lookup逻辑
2. 修正变量文件vars.yml
你原来的变量文件多嵌套了一层vars键,include_vars加载时会导致变量层级错误,同时删掉硬编码的单台虚拟机配置,保留公用参数即可,修改后内容:
--- vmware: host: '{{ lookup("env", "VMWARE_HOST") }}' username: '{{ lookup("env", "VMWARE_USER") }}' password: '{{ lookup("env", "VMWARE_PASSWORD") }}' vcenter_datacenter: "dc1" vcenter_validate_certs: false vm_template: "Win2019-Template"
3. 调整Playbook逻辑
原来的Playbook硬编码了单台虚拟机名称、固定跑在localhost,改成遍历动态清单内的目标主机,所有操作委托给localhost执行(快照操作是调用vCenter API完成,不需要直连目标虚拟机),同时直接引用动态清单自动拉取的虚拟机属性即可:
--- - name: 批量创建VMware虚拟机快照 hosts: all # 如果要拍指定分组的虚拟机,替换成对应组名即可,比如hosts: network_lab_vms become: false gather_facts: false collections: - community.vmware pre_tasks: - include_vars: vars.yml tasks: - name: 为目标虚拟机创建快照 vmware_guest_snapshot: hostname: "{{ vmware.host }}" username: "{{ vmware.username }}" password: "{{ vmware.password }}" datacenter: "{{ vcenter_datacenter }}" validate_certs: "{{ vcenter_validate_certs }}" # 按主机名匹配时用name参数,直接取动态清单的主机名即可 name: "{{ inventory_hostname }}" # 如果要按UUID匹配,注释上面的name行,打开下面的uuid行即可,vSphere动态清单会自动注入uuid变量 # uuid: "{{ config.uuid }}" folder: "{{ folder }}" # vSphere动态清单会自动拉取每台VM所属的folder路径,不需要硬编码 state: present snapshot_name: "Ansible Managed Snapshot" description: "This snapshot is created by Ansible Playbook" delegate_to: localhost
注意事项
- vSphere动态清单默认会为每个注入的主机自动携带
name、config.uuid、folder、guest_name等内置变量,不需要手动定义 - 如果动态清单拉取的folder路径和实际环境不匹配,可以在动态清单配置里开启「Show VM folder path」相关选项,同步时就会自动带回正确的文件夹路径
- 作业运行前可以先在AWX里手动同步一次
lab_vm动态清单,在清单的「主机」页确认所有目标VM已经被正确拉取,避免漏同步
内容的提问来源于stack exchange,提问作者bakesale
相关产品推荐
相关产品推荐

