当前位置: 首页 > 云计算 > vSphere虚拟机模版—高级定制(OVF属性)

vSphere虚拟机模版—高级定制(OVF属性)

云计算 2条评论 2020-12-8 3,496 views

概述:

这是自己一直想实现的模版目标,特别是当客户和合作伙伴经常问到VMware产品的OVA是如何做的时候,通常我会建议使用VMware Studio工作制作,但是VMware Studio过于庞大和复杂,很难上手。最近看到William Lam的PhotonOS虚拟应用(OVA)制作的博客,燃起自己攻破模版的最后一个难关——添加OVF属性,提高运维效率和向自动化部署迈进,特别感谢William写了一系列的OVF博客。

自使用Packer来自动化构建虚拟机模版后,也逐步发现了一些需求和使用过程中的挑战:

  1. 如何在部署的过程中添加第二块硬盘,用于存储数据,并自动对磁盘进行分区、格式化和挂载;
  2. 如何在部署时使用静态IP地址和相关网络配置,减少部署后的操作;
  3. 如何在部署时指定Root账户密码,避免使用模版中包含的默认密码;
  4. 如何生成OVA文件,已用于其他环境的部署;
  5. Partner希望自己的产品能够在部署时进行初始化,简化产品部署难度。

本博客内容在使用Packer自动构建vSphere虚拟机模版—CentOS 8基础之上进行构建,具备以下功能:

  1. Packer构建模版后,对ovf文件进行定制化,实现主机名、IP地址、NTP服务器、第二块硬盘和Root密码的部署参数定制;
  2. 模版部署完成后,开机自动完成相关配置和第二块硬盘的初始化(LVM);
  3. OVF模版封装完成后,使用govc在vCenter中删除模版虚拟机;
  4. OVA模版封装完成后,自动上传到S3存储(环境中使用本地MinIO搭建);
  5. 在vCenter中使用该模版部署VM时,管理员可以直接配置虚拟机的主机名和IP地址等信息,加快部署效率;

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

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


相关工具:

Packer是一个开源的自动化虚拟机模版构建工具,支持私有云和公有云,几乎涵盖所有的环境。 vSphere是VMware企业级虚拟化软件,被企业客户广泛使用,具备稳定性高、性能好、安全性高和易使用的特点。 govc是VMware官方出品的CLI工具,基于govmomi构建,非常适合自动化编排。 OVFTool是VMware官方出品的OVF和OVA导入/导出工具,在自动化部署和构建环境中经常被使用。 MinIO是基于go语言开发的对象存储系统,S3兼容,本示例中用于存储封装完成的虚拟机模版OVA文件。 相关代码中包含Packer所需的json文件和CentOS8 OVF定制化相关文件。


环境需求:

  1. 一台Linux电脑,能够连接vCenter Server;
  2. 安装Packer程序
  3. 安装govc程序
  4. 安装ovftool程序
  5. (可选)部署MinIO存储/使用兼容的S3存储

Packer安装

Packer采用GO语言编写,安装非常简单,只需要将解压后的packer文件拷贝到系统bin目录下即可,下面是在Linux下的安装方式:

wget https://releases.hashicorp.com/packer/1.6.5/packer_1.6.5_linux_amd64.zip
unzip packer_1.6.5_linux_amd64.zip
cp packer /usr/loca/bin
chmod +x /usr/local/bin
packer version

govc安装

govc工具用于通过shell操作vCenter,因为默认情况下Packer不会自动删除模版虚拟机(export ovf模式下),本示例中使用govc删除已构建的模版虚拟机。

wget https://github.com/vmware/govmomi/releases/download/v0.23.0/govc_linux_amd64.gz

gzip -d govc_linux_amd64.gz
chmod +x govc_linux_amd64
mv govc_linux_amd64 /usr/local/bin/govc
govc version

ovftool安装

ovftool用于封装单个OVA文件,下载地址:https://code.vmware.com/web/tool/4.4.0/ovf

echo -e "/w00t\n" >> /tmp/answer && Mware-ovftool-4.4.0-16360108-lin.x86_64.bundle --eulas-agreed --required --console < /tmp/answer
ovftool --version

(增强)封装构建工具容器

如果你想让环境更加干净,也可以采用Container封装所有的工具,并在日常构建中,使用Container进行操作,Dockerfile如下:

FROM centos:7.8.2003
LABEL maintainer="Alex Li <guoqiangli@vmware.com>"
ENV PACKER_VERSION=1.6.5 \
    GOVC_VERSION=v0.23.0 \
    GOVC_INSECURE=true \
    OVFTOOL_VERSION=4.4.0 \
    TIME_ZONE=Asia/Shanghai
ADD ./govc ./packer ./packer-provisioner-windows-update ./mc ./VMware-ovftool-4.4.0-16360108-lin.x86_64.bundle /usr/bin/
RUN chmod +x /usr/bin/VMware-ovftool-4.4.0-16360108-lin.x86_64.bundle && \
    echo -e "/w00t\n" >> /tmp/answer && \
    /usr/bin/VMware-ovftool-4.4.0-16360108-lin.x86_64.bundle --eulas-agreed --required --console < /tmp/answer && \
    rm -rf /usr/bin/VMware-ovftool-4.4.0-16360108-lin.x86_64.bundle && \
    chmod a+x /usr/bin/govc /usr/bin/packer /usr/bin/packer-provisioner-windows-update /usr/bin/mc && \
    yum install -y  genisoimage && \
    yum clean all && \
    ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
WORKDIR /
CMD ["/bin/bash"]

CentOS 8的Packer模版

我们需要两个基础文件,用于使用Packer在vSphere环境中构建CentOS 8.x模版:

  1. centos-vsphere.json文件(Packer模版);
  2. ks.cfg文件(无人值守应答文件)
  3. files/add_ovf_properties.sh文件,用于修改Packer导出的ovf文件,增加“动态磁盘”和“用户输入参数”等内容,并封装成单个OVA文件;
  4. files/centos.xml.template文件,用于自定义用户输入信息模版,包含主机名、IP地址、NTP等配置;
  5. files/ovf-add-disk-1.xmlfiles/ovf-add-disk-2.xml文件,用于动态增加第二块磁盘;
  6. rc.local文件,用于在每次系统启动时调用,其会判断/usr/local/customization/ran_customization文件是否存在;
  7. setup.sh文件,用于操作系统初始化(主机名、IP地址、初始化磁盘等);
  8. output-vsphere目录,用于保存OVF和OVA的输出目录;

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

.
├── centos8_ks.iso
├── centos-vsphere.json
├── files
│   ├── add_ovf_properties.sh
│   ├── centos.xml.template
│   ├── ovf-add-disk-1.xml
│   ├── ovf-add-disk-2.xml
│   ├── rc.local
│   └── setup.sh
├── ks.cfg
└── output-vsphere

centos-vsphere.json文件说明

provissioners段落,用于系统自动化安全完成后的自定义操作,例如:更新系统补丁,清理模版等,本示例中进行了系统更新、上传rc.local和setup.sh文件。

  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm",
        "sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*",
        "sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*",
        "yum update -y",
        "yum clean all",
        "systemctl enable --now cockpit.socket",
        "echo \"{{user `root-password`}}\" | passwd --stdin root",
        "echo \"{{user `ops-password`}}\" | passwd --stdin ops",
        "mkdir -p /usr/local/customization/",
        "sed -i 's/^HISTSIZE=1000/HISTSIZE=2000/' /etc/profile",
        "echo |tee /var/log/wtmp /var/log/btmp /root/.bash_history > /dev/null"
      ]
    },
    {
      "type": "file",
      "source": "files/rc.local",
      "destination": "/etc/rc.d/rc.local"
    },
    {
      "type": "file",
      "source": "files/setup.sh",
      "destination": "/usr/local/customization/setup.sh"
    },
    {
      "type": "shell",
      "inline": [
        "chmod +x /etc/rc.d/rc.local",
        "chmod +x /usr/local/customization/setup.sh"
      ]
    }
  ],

post-processors段落,用于制备完成后,对OVF文件定制化、删除VC中遗留模版迅即和上传到S3存储等操作。

  "post-processors": [
    {
      "type": "shell-local",
      "environment_vars": ["CENTOS_VERSION={{ user `version` }}", "CENTOS_APPLIANCE_NAME={{ user `vm-name` }}", "FINAL_CENTOS_APPLIANCE_NAME={{ user `vm-name` }}_{{user `version`}}", "CENTOS_OVF_TEMPLATE={{ user `centos-ovf-template` }}"],
      "inline": [
        "cd files",
        "chmod +x ./add_ovf_properties.sh",
        "./add_ovf_properties.sh"
      ]
    },
    {
      "type": "shell-local",
       "environment_vars": ["GOVC_URL={{ user `vsphere-server` }}", "GOVC_USERNAME={{ user `vsphere-user` }}", "GOVC_PASSWORD={{ user `vsphere-password` }}" , "GOVC_INSECURE=true"],
      "inline": [
        "govc vm.destroy {{user `vm-name`}}"
      ]
    },
    {
      "type": "shell-local",
      "inline": [
        "mc config host add minio-local {{user `s3-server`}} {{user `s3-access-key`}} {{user `s3-secret-key`}} --api s3v4",
        "mc cp ./output-vsphere/{{user `vm-name`}}_{{user `version`}}.ova minio-local/{{user `s3-bucket`}}",
        "mc ls minio-local/{{user `s3-bucket`}}",
        "rm -rf ./output-vsphere/{{user `vm-name`}}_{{user `version`}}.ova"
      ]
    }
  ],

Packer验证配置

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

packer validate centos-vsphere.json

Packer执行构建

packer build centos-vsphere.json

如果在构建过程中遇见问题,可以使用如下命令进行构建,日志会输入到packer.log文件中。

PACKER_LOG=1 PACKER_LOG_PATH="packer.log" packer build -force -on-error=ask centos-vsphere.json

检查构建结果

构建完成后,命令行如下提示;

通过vCenter部署验证

通过vCenter部署生成的OVA模版。

显示模版的相关信息,产品名称、提供商等。

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

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

我们增加的第二块磁盘也完成了lv创建,并挂载到/data目录。

完成

至此我们完成了OVA模版的基本配置定制化,从原理上能看出来,OVF的自定义属性可以被Guest OS通过VMware Tools读取到(详见setup.sh),并通过自己的脚本/程序对属性值进行处理,这将极大方便日后的自动化部署和自动化运维工作。


2 条评论 “vSphere虚拟机模版—高级定制(OVF属性)”

  1. 胡大邱说道:

    能否出个Photon的自定义属性模板

    1. liguoqiang说道:

      没问题,我近期测试一下。

发表回复

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