VMware vSphere 系统虚拟机自动化部署

对于小规模 VMware vSphere 系统的虚拟机自动化部署问题, Terraform 配合 Packer 这种方案虽然成熟,但略显笨重。实际上用 govc 命令编写的简单脚本,配合 VMware vSphere 的 自定义规范 功能,就完全可以达到目的。

1. 关于 govc 的使用

govc 是基于 VMware 官方 govmomi 库的一个 vSphere 命令行工具,使用它可以通过命令或脚本,实现对 VMware vSphere 系统的管理。govc 命令的使用手册见 govc usage

建议安装 direnv,使用类似如下的 .envrc 文件来设置 govc 的环境变量:

# vCenter host
export GOVC_URL=vcsa.domain.name
# vCenter credentials
export [email protected]
export GOVC_PASSWORD=your_password
# disable cert validation
export GOVC_INSECURE=true

利用 govc 上传 ISO 文件的命令如下:

govc datastore.upload -ds=Datastore01 ./source.iso /iso/dest.iso

上传 ISO 文件后可以通过如下命令,列出上传的文件:

govc datastore.ls -l -ds=Datastore01 /iso

利用如下命令可以列出系统中的虚拟机:

govc ls /Datacenter/vm

macOS 客户端安装 VMware Remote Console 后,可以利用如下命令直接启动 VMRC 连接虚拟机控制台:

open $(govc vm.console "virtual_machine_name")

查看虚拟机硬盘使用情况可以使用如下命令:

govc guest.df -vm "vitual_machine_name"

也可以通过如下命令获得更多的虚拟机信息:

govc vm.info -r "virtual_machine_name"

2. 自定义客户机操作系统

VMware 在官方文档中对 自定义客户机操作系统 有比较详细的论述,可以作为参考。自定义规范Customization Specifications)是包含客户机操作系统设置的 XML 文件,可以在 vSphere 系统的管理界面中通过 Menu => Policies and Profiles => VM Customization Specifications 生成。虚拟机部署期间向客户机操作系统应用自定义规范,可以防止客户机操作系统的计算机名、SID(security identity) 等设置产生冲突。对于自定义规范支持的操作系统,可以参考: Guest OS Customization Support Matrix 文档。

2.1 Windows 模版定制

对于 Windows Server 系统的模版定制,建议在客户机操作系统安装后,执行如下两步:

  1. 通过 系统属性 => 远程 => 允许远程连接到此计算机 开启远程桌面访问;
  2. 安装 VMware-Tools。

在此之后就可以关闭系统,把 CD/DVD drive 1 改成 Client Device,并将虚拟机转换成模版。

2.2 Linux 模版定制

对于 Linux 系统,需要安装 open-vm-tools 和 perl 两个软件包,对于 CentOS 系统,执行如下命令:

sudo yum install open-vm-tools perl

对于 Ubuntu 需要执行如下命令:

sudo apt install open-vm-tools perl

在安装完必须的软件包后,按照文档 创建 Linux 的自定义规范 的要求,Linux 系统需要执行以下命令来启用 VMware Tools 配置中的 enable-custom-scripts 选项:

sudo vmware-toolbox-cmd config set deployPkg enable-custom-scripts true

此外,按照 VMware KB59687 的建议,Ubuntu 系统还需要执行如下命令来禁用 cloud-init:

sudo touch /etc/cloud/cloud-init.disabled

在此之后,就可以清理操作系统的使用痕迹,并关闭系统。

最后一步同样是把 CD/DVD drive 1 改成 Client Device,并将虚拟机转换成模版。

3. Infrastructure as Code

对于小规模 VMware vSphere 系统这种简单场景,使用一个简单的 Shell 脚本就可以实现 Infrastructure as Code。

首先在类似如下的文件中按照 Shell 定义变量的方式定义虚拟机的配置参数:

NEWVM="vmname"
DESC="Description of the virtual machine."

TEMP="template-name"

SPEC="CUSTOM-SPEC"

DS="Datastore-name"
HOST="esxi-host.domain.name"

CPU=2
MEM=16384

IP=192.168.1.100
MASK=255.255.255.0
GATE=192.168.1.1
DNS=192.168.1.1

然后通过如下 Shell 脚本加载之前定义的参数,利用 govc 的 vm.infovm.clonevm.customize 以及 vm.power 等子命令,来实现虚拟机的自动化定制部署。

#!/bin/sh

source $1

govc ls /Datacenter/vm | grep -q "$NEWVM" &&
        govc vm.info "$NEWVM" && exit 0

govc vm.clone -vm "$TEMP" \
        -ds="$DS" -host="$HOST" \
        -c=$CPU -m=$MEM \
        -on=false -annotation="$DESC" "$NEWVM"

govc vm.customize -vm $NEWVM -ip $IP -netmask $MASK \
        -gateway $GATE -dns-server "$DNS" \
        "$SPEC"

govc vm.power -on "$NEWVM"

# open "$(govc vm.console "$NEWVM")"

配合 Git 的版本控制,就基本可以满足一般的运维管理需求了。

以上内容相关的脚本,已经放在 GitHub 上的 mengbo/vmware-infracode 项目里,以供参考。

你可能感兴趣的:(VMware vSphere 系统虚拟机自动化部署)