使用 Ansible 管理 VMware 基础设施
您可以使用 Ansible 自动执行 VMware 基础架构中的某些任务。您可以自动部署和配置 ESXi 主机、管理网络设置、启动、停止或删除虚拟机、从模板部署虚拟机、在 ESXi 主机上安装更新等。本文介绍了如何开始使用 Ansible 来管理 VMware 环境。
Ansible 有大量用于管理 VMware 基础设施的模块,其中大部分基于pyvmomi(一个Python SDK,允许您连接到VMware vSphere API)。使用 pip 管理器安装 pyVmomi:
$ sudo pip install pyvmomi


我们假设您已经拥有安装了 Ansible 的 Linux 主机。
要允许使用 VMware 动态清单插件,请启用vmware_vm_inventory在ansible.cfg:
[inventory] enable_plugins = vmware_vm_inventory, host_list, script, auto, yaml, ini, toml vmware_vars plugin: vmware_vm_inventory strict: False hostname: 192.168.13.70 username: [email protected] password: pas1swsew43 validate_certs: False with_tags: True
然后,您可以运行 inventory 命令并获取 vCenter 或 ESXi 服务器上的虚拟机列表。
$ ansible-inventory --list -i /etc/ansible/vmware/vmware.yml
您可以获得虚拟机的分层列表:
$ ansible-inventory --graph -i /etc/ansible/vmware/vmware.yml


让我们将 ESXi 主机列表添加到/etc/ansible/hosts:
[all_esxi_hosts] esxi1 ansible_host=192.168.31.20 esxi2 ansible_host=192.168.31.21 esxi3 ansible_host=192.168.31.22
设置该组主机的变量值:
[all_esxi_hosts:vars] ansible_user=root ansible_python_interpreter=/bin/python ansible_ssh_pass=P1ssw0rd6


在此示例中,ESXi 主机 root 密码以明文形式指定。建议您在生产环境中的 ESXi 上配置基于 SSH 密钥的身份验证。
然后,您可以验证是否可以通过网络从 Ansible 主机访问所有 ESXi 主机:
$ ansible all_esxi_hosts -m ping
如果您未在主机文件中指定密码,则可以交互式提示输入密码:
$ ansible all_esxi_hosts -m ping --ask-pass


借助 Ansible,您可以对所有 ESXi 主机运行任何命令。 Ansible ad-hoc 命令模式用于在远程 ESXi 上执行命令。例如,您可能想知道所有主机的 ESXi 版本号:
$ ansible all_esxi_hosts -m shell -a "vmware -vl"


这样,您就可以在任何主机上运行任何 shell 命令(必须在 ESXi 上启用 SSH)。
让我们创建一个简单的 Ansible 剧本vm_start.yml启动 VMware vCenter 中的特定虚拟机。该剧本使用来自的连接凭据vmware_vars.yml。
- name: start vm
hosts: localhost
become: false
gather_facts: false
collections:
- community.vmware
pre_tasks:
- include_vars: vmware_vars.yml
tasks:
- name: power on
vmware_guest_powerstate:
hostname: "{{ hostname }}"
username: "{{ username }}"
password: "{{ password }}"
name: munfs01
validate_certs: "{{ validate_certs }}"
state: powered-on
运行剧本:
$ ansible-playbook /etc/ansible/vmware/vm_start.yml


打开 vSphere Client 并验证您的虚拟机是否已成功启动。

下一个剧本允许您在特定 ESXi 主机上启用 ntpd 服务。在使用此 Playbook 之前安装community.vmware 模块:
$ ansible-galaxy collection install community.vmware
现在创建一个 playbook(我们直接在 Playbook 中指定了连接参数,以便更容易理解。):
---
- hosts: localhost
vars:
vcenter_hostname: "192.168.31.20"
vcenter_user: "[email protected]"
vcenter_password: "passwprd123"
esxi_hostname: "192.168.31.50"
esxi_username: "root"
esxi_password: "es-122023"
tasks:
- name: Start Service on esxi host in vcenter
community.vmware.vmware_host_service_manager:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_user }}"
password: "{{ vcenter_password }}"
esxi_hostname: "{{ esxi_hostname }}"
service_name: ntpd
state: present #present #absent
service_policy: off
validate_certs: no
delegate_to: localhost
运行你的剧本:
$ ansible-playbook /etc/ansible/vmware/vm_esxi_start_service.yml
请注意,无法从 Ansible 更改免费的 VMware Hypervisor 设置。 ESXi API 在此版本中是只读的。
在这篇文章中,我们介绍了使用 Ansible 管理 vSphere 环境中的 VMware ESXi、vCenter 和虚拟机的基础知识。
在上一篇文章中,我们向您展示了如何使用 Ansible 来管理 Windows 主机。
