当前位置: 首页 > 虚拟化 > 通过vCenter内容库自动化部署虚拟机

通过vCenter内容库自动化部署虚拟机

虚拟化 0条评论 2024-4-8 247 views

概述:

vCenter内容库一直是我最常用的功能,其在vSphere的所有版本提供,我通过内容库管理多个vCenter环境的ISO光盘、虚拟机模版,但当我与客户沟通后,发现用户使用频率并不高,得到反馈:

  1. 手工维护虚拟机模版太复杂;
  2. 对虚拟机部署效率提升不大;

而这两点单独通过内容库是无法实现的,下面我将通过Packer工具、Govc工具和OVF文件自定义来帮助VMware的客户提高管理、运维效率,以及基础模版的安全性。

主要实现目标如下::

  1. 自动化构建虚拟机模版,并可定期更新;
  2. 虚拟机模版通过内容库管理;
  3. 模版基于安全基线(例如:等保3.0)构建,管理员可以自定义调整;
  4. 基于内容库部署虚拟机时,可自动完成操作系统初始化(主机名、IP地址、管理员密码等);

除了OVF模版定制外,还展示了govc、ovftool等工具的能力,相信对大家向自动化运维转型有所帮助。

如果您使用Terraform进行虚拟机交付,好消息是Terraform vSphere provider 1.20.0版本后开始支持OVA部署和OVF属性。


相关工具:

Packer是一个开源的自动化虚拟机模版构建工具,支持私有云和公有云,几乎涵盖所有的环境。 vSphere是VMware企业级虚拟化软件,被企业客户广泛使用,具备稳定性高、性能好、安全性高和易使用的特点。 govc是VMware官方出品的CLI工具,基于govmomi构建,非常适合自动化编排。 OVFTool是VMware官方出品的OVF和OVA导入/导出工具,在自动化部署和构建环境中经常被使用。 相关代码中包含Packer所需的json文件和CentOS8 OVF定制化相关文件。 工具Dokcer镜像集成Packer、OVFTool、Govc等工具。


环境需求:

  1. 一台Linux电脑,能够连接vCenter Server;
  2. VMware vSphere 7.0/8.0环境;

(可选)自行封装构建工具容器

如果你希望自己封装包含Packer、OVFTool、Govc等工具的Docker镜像,参考Dockerfile如下:

FROM rockylinux:8
LABEL maintainer="Alex Li <guoqiang.li@broadcom.com>"
ENV PACKER_VERSION=1.10.2
ENV GOVC_VERSION=v0.36.3
ENV GOVC_INSECURE=true
ENV LC_CTYPE=POSIX
ENV TIME_ZONE Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
ADD ./govc /usr/bin/
ADD ./packer /usr/bin/
RUN mkdir /app && rm -rf /usr/sbin/packer
ADD ./required_plugins.pkr.hcl /app
ADD ./VMware-ovftool-4.6.2-22220919-lin.x86_64.bundle /app
WORKDIR /app
RUN packer init /app
RUN chmod a+x /usr/bin/govc /usr/bin/packer && \
    dnf update -y && \
    dnf install -y --setopt=tsflags=nodocs libnsl genisoimage expect python2 python2-pip xmlstarlet openssl sshpass && \
    pip2 install requests termcolor argparse && \
    dnf clean all
RUN /bin/sh /app/VMware-ovftool-4.6.2-22220919-lin.x86_64.bundle --console --required --eulas-agreed && \
    rm -rf /VMware-ovftool-4.6.2-22220919-lin.x86_64.bundle
CMD ["/bin/bash"]

required_plugins.pkr.hcl用于packer初始化插件,本文章中只涉及vSphere的插件,windows-update插件用于Windows系统更新。

packer {
  required_plugins {
    vsphere = {
      version = ">= v1.2.7"
      source  = "github.com/hashicorp/vsphere"
    }
    windows-update = {
      version = ">=0.15.0"
      source = "github.com/rgl/windows-update"
    }
  }
}

Rocky8-ovf的Packer模版相关文件

我们需要多个文件,用于使用Packer在vSphere环境中构建Rocky8的OVF模版:

  1. ks.cfg文件(无人值守应答文件,推荐详细分析此文件,作为系统初始化、安全加固非常有用)
  2. rocky8-ovf.auto.pkrvars.hcl文件(定义vCenter环境信息、ISO光盘位置和模版虚拟机配置)
  3. rocky8-ovf.pkr.hcl文件(Packer主文件,用于生命构建模版的过程和后续执行的动作)
  4. files/CustomizeOvf.sh文件(用于修改ovf文件的脚本,添加虚拟机规模、操作系统配置等)
  5. files/setup.sh文件(其存储在虚拟机模版中,用于基于ovf属性多操作系统进行初始化)
  6. files/UploadOvfToVCenter.sh文件(上传ovf虚拟机模版到vCenter内容库中)
  7. files/ovf-add-deployselect-1.xml文件(用于添加不同的虚拟机部署规模的描述)
  8. files/ovf-add-deployselect-2.xml文件(用于添加不同的虚拟机部署规模,eg. 2C4G/4C8G/8C12G等)
  9. files/ovf-add-multi-language.xml文件(多国语言支持文件,用于自定义内容提供多国语言支持)
  10. files/rocky8.xml文件(临时文件)
  11. files/rocky8.xml.template文件(用于自定义OVF属性内容)
  12. files/rc.local文件(用于Linux启用运行脚本,只运行一次)
  13. output-vsphere目录(用于保存OVF的临时输出目录)

推荐下载仓库的文件,避免拷贝粘贴可能造成的字符问题;[Rocky8-OVF] (https://github.com/6547709/2024-demo/tree/main/Rocky8-ovf)

Rocky8-ovf/
├── files
│   ├── CustomizeOvf.sh
│   ├── ovf-add-deployselect-1.xml
│   ├── ovf-add-deployselect-2.xml
│   ├── ovf-add-multi-language.xml
│   ├── rc.local
│   ├── rocky8.xml
│   ├── rocky8.xml.template
│   ├── setup.sh
│   └── UploadOvfToVCenter.sh
├── ks.cfg
├── output_vsphere
├── rocky8-ovf.auto.pkrvars.hcl
├── rocky8-ovf.pkr.hcl
└── variables.pkr.hcl

rocky8-ovf.pkr.hcl文件说明

source段落,用于定义虚拟机模版的配置,包含Bios类型、CPU、内存、ISO光盘和Kickstart文件等。

source "vsphere-iso" "rocky8" {
  firmware        = "efi-secure"
  CPUs            = var.vm_cpu_num
  cpu_cores       = var.vm_cpu_cores_num
  RAM             = var.vm_mem_size
  RAM_reserve_all = false
  boot_command = [
    "<up>",
    "e",
    "<down><down><end><wait>",
    " text inst.ks=hd:sr1:/ks.cfg",
    "<enter><wait><leftCtrlOn>x<leftCtrlOff>"
  ]
  boot_order           = "disk,cdrom"
  boot_wait            = "10s"
  cluster              = var.vsphere_cluster
  convert_to_template  = false
  datacenter           = var.vsphere_datacenter
  datastore            = var.vsphere_datastore
  disk_controller_type = ["pvscsi"]
  export {
    force            = true
    output_directory = "./output_vsphere"
  }
  folder              = var.vm_folder
  guest_os_type       = "rhel8_64Guest"
  insecure_connection = "true"
  ip_wait_timeout     = "60m"
  ip_settle_timeout   = "2m"
  ip_wait_address     = "10.0.0.0/8"
  iso_paths           = [var.iso_url]
  cd_files            = ["./ks.cfg"]
  cd_label            = "OEMDRV"
  network_adapters {
    network      = var.vsphere_network
    network_card = "vmxnet3"
  }
  notes        = "Build via Packer, Version:${var.template_version} ."
  password     = var.vsphere_password
  remove_cdrom = "true"
  ssh_password = var.linux_ssh_password
  ssh_username = "root"
  ssh_timeout  = "20m"
  storage {
    disk_size             = var.vm_disk_size
    disk_thin_provisioned = true
  }
  username       = var.vsphere_user
  vcenter_server = var.vsphere_server
  video_ram      = var.vm_video_ram
  vm_name        = "${var.vm_name}-${var.template_version}"
  vm_version     = var.vm_version
}

provisioner段落,用于向模版中追加文件和修改文件执行权限。

  provisioner "file" {
    destination = "/etc/rc.d/rc.local"
    source      = "files/rc.local"
  }

  provisioner "file" {
    destination = "/usr/local/customization/setup.sh"
    source      = "files/setup.sh"
  }

  provisioner "shell" {
    inline = ["chmod +x /etc/rc.d/rc.local", "chmod +x /usr/local/customization/setup.sh"]
  }

post-processor段落,用于制备完成后,对OVF文件定制化、删除内容库中模版和上传新模版。

  post-processor "shell-local" {
    inline = [
      "export VM_NAME=${var.vm_name}",
      "export TEMPLATE_VERSION=${var.template_version}",
      "export VSPHERE_NETWORK=${var.vsphere_network}",
      "cd files",
      "chmod +x ./CustomizeOvf.sh",
      "./CustomizeOvf.sh"
    ]
  }
  post-processor "shell-local" {
    inline = [
      "export GOVC_URL=${var.vsphere_server}",
      "export GOVC_USERNAME=${var.vsphere_user}",
      "export GOVC_PASSWORD=${var.vsphere_password}",
      "export VSPHERE_CONTENT_LIBRARY=${var.vsphere_content_library}",
      "export VM_NAME=${var.vm_name}",
      "export TEMPLATE_VERSION=${var.template_version}",
      "cd files",
      "chmod +x ./UploadOvfToVCenter.sh",
      "./UploadOvfToVCenter.sh"
    ]
  }

(必须修改)rocky8-ovf.auto.pkrvars.hcl文件说明

此文件必须修改为您所在环境的配置,其中要注意:内容库、虚拟机文件夹需要提前创建,vm_version根据需要进行修改,vSphere 7.0支持19,vSphere 8.0支持20。

// vSphere Config
vsphere_server          = "mgmt-vc03.corp.local"
vsphere_user            = "Administrator@vsphere.local"
vsphere_password        = "******"
vsphere_datacenter      = "VVF-DC"
vsphere_cluster         = "VVF-Cluster"
vsphere_content_library = "VM-Templates"
vm_folder               = "VM-Templates"
vsphere_datastore       = "ST-10T"

// Rocky Install Media
iso_url = "[ST-ISO] 000ISO/Rocky-8.9-x86_64-dvd1.iso"

// Virtual Machine Hardware Settings
template_version = "1.0.0"
vm_name          = "Rocky8-OVF"
vsphere_network  = "dvpg-vlan4043"
vm_cpu_num       = 4
vm_cpu_cores_num = 4
vm_mem_size      = 4096
vm_disk_size     = 102400
vm_video_ram     = 8192
vm_version       = 19

//Guest Operating System Metada
linux_ssh_password = "******"

OVF属性定制化介绍

为减少依赖,本示例采用bash脚本自定义ovf文件,如果您修改了示例文件的内容可能造成重新构建ovf异常,此时您可以查看“CustomizeOvf.sh”脚本,调整脚本代码进行修复。

如果您希望增加额外的操作系统初始化内容,例如:增加虚拟机监控、向资产管理平台注册等,您可以修改“setup.sh”脚本。

您还可以通过vCenter自定虚拟机的OVF属性,然后导出成OVF模版,以确定如何自定OVF文件。

使用Packer构建模版

完成配置文件的准备后,我们需要验证packer的配置文件是否正确,使用以下命令:

docker pull liguoqiang/packer-cli:1.10.2
docker run -it --rm -v /home/liguoqiang/packer/demo/Rocky8-ovf:/app/Rocky8-ovf liguoqiang/packer-cli:1.10.2 /bin/bash

进入Docker的Shell后,开始执行模版构建:

cd /app/Rocky8-ovf
packer init .
packer validate .
packer build .

检查构建结果

构建过程中Packer会在vCenter中创建虚拟机,并给予ks.cfg文件完成操作系统安装和初始化。

操作系统初始化完成后,Packer会通过ssh连接到虚拟机模版,并执行后续的定制化过程,包括执行脚本、自定义虚拟机ovf文件等,并最终上传到vCenter内容库中;

通过vCenter部署验证

通过vCenter内容库部署Rocky8-OVF模版。

选择部署位置和集群后,显示模版的相关信息,产品名称、提供商等。

选择虚拟机的硬件配置(vCPU和内存),此配置是OVF模版定制的。

选择虚拟机存储和网络

填写操作系统初始化配置参数,操作系统启动后,会基于这些参数进行配置。

注意:默认会禁用Root用户远程登录,以cloud-user作为超级管理员用户。

启动VM后,我们可以看到操作系统名称、IP地址、DNS和hosts记录都完成了配置。

并可以通过虚拟机的配置->设置->vApp选项看到部署时输入的信息。

完成

至此我们完成了虚拟机模版的构建,内容库上传和虚拟机自定义部署,不仅可以帮助客户高效的维护虚拟机模版,还可以帮助提高虚拟机部署效率。 从原理上能看出来,OVF的自定义属性可以被Guest OS通过VMware Tools读取到(详见setup.sh),并通过自己的脚本/程序对属性值进行处理,这将极大方便日后的自动化部署和自动化运维工作。


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注