我的 hosts 文件夹中有一个名为“vcenter.yml”的文件,用于向 vcenter 进行身份验证并执行此 vcenter 的动态清点。我使用此文件收集虚拟机信息,并选择要执行 WINRM 命令的 Windows 虚拟机。此外,我还有一个名为“vmware_list_all_powered-on_windows_vms.yml”的示例剧本,其中列出了该 vcenter 内所有已启动的虚拟机。因此,基本上,我可以输入命令“ansible-playbook vmware_list_all_powered-on_windows_vms.yml”,结果将是所有已启动的 Windows 虚拟机的列表。更妙的是,我还可以使用 -l“特定虚拟机名称”执行相同的 ansible 命令,结果将是该特定虚拟机的电源状态。现在我的问题是,每次我在谷歌上搜索“如何使用 ansible 对虚拟机进行电源循环”时,似乎 vcenter 名称、vcenter 凭据和特定的虚拟机名称都需要在脚本“vm_reset.yml”中显示的剧本中
什么是正确的 YML 代码,可以让我执行命令“ansible-playbook vm_reset.yml -l“A SPECIFIC VM NAME”?我希望能够将现有的“vcenter.yml”文件用于此目的。
VCENTER.YML
plugin: vmware_vm_inventory
strict: False
hostname: vcenter.foobar.com
username: [email protected]
validate_certs: False
with_tags: False
groups:
VMs: True
windowstest: "'win' in config.guestId"
windows: "'win' in config.guestId"
filters:
- summary.runtime.powerState == "poweredOn"
hostnames:
- config.name
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
062353461393737393664396333653965383432363934316335306336326539393636653465616638386534303631633165636437326530303664306537300a646162303932326566373837643164643863373134333738326666376134333432633762653161333230643131363931613034343966373432396566393634660a6533623764653031386266353238383264336535626430626439656230386463
VMWARE_LIST_ALL_POWERED-ON_WINDOWS_VMS.YML
- hosts: windows
gather_facts: false
tasks:
- name: Gather a list of all powered on VMs
ansible.builtin.set_fact:
on_vm: "{{ all_vm_info.virtual_machines | json_query(query) }}"
vars:
query: "[?power_state=='poweredOn']"
register: jsoncontent
- name: Gather a list of all powered on VM names
debug: msg="{{ on_vm | json_query(jmesquery) }}"
vars:
jmesquery: "[*].{guest_name: guest_name, ip_address: ip_address}"
虚拟机重置
---
- name: stop vm demo
hosts: localhost
become: false
gather_facts: false
collections:
- community.vmware
pre_tasks:
- include_vars: vars.yml
tasks:
- name: guest shutdown
vmware_guest_powerstate:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: "{{ vcenter_validate_certs }}"
name: "{{ vm_name }}"
state: restarted
state_change_timeout: 120
register: deploy
ignore_errors: true
答案1
vm_name 是否来自 vars.yml ?
如果没有,您可以使用 key=value 格式传递它,例如
ansible-playbook vm_reset.yml --extra-vars "vm_name=example"
您根本不需要 vcenter.yml 来传递虚拟机的名称。如果您的目标是针对已启动的目标列表动态执行它,我建议分配主机变量或定义一组已启动的虚拟机(可能不是推荐的方法,但它可能比更新清单文件中的行更容易),例如 power_state=='poweredOn',然后将其用作剧本的目标。