VMware 使用 ezmomi 创建虚拟机

  • 安装 ezmomi
  • pip安装ezmomi
  • 必要配置
  • 示例用法-基础
  • 示例用法-进阶
  • 示例用法-批量
  • 示例数据源-如图
  • lvm扩容脚本及配置


安装 ezmomi

ezmomi github下载地址 https://github.com/snobear/ezmomi

# 示例部署环境
centos7
vSphere 6 及以上
Python 2.7 or 3.x

pip安装ezmomi

yum install -y epel-release  python3-pip
python3 -m pip install --upgrade pip setuptools wheel
python3 -m pip install --upgrade ezmomi

必要配置

文件目录:/root/.config/ezmomi/config.yml

cat /root/.config/ezmomi/config.yml
# config.yml
# ezmomi
 
# Mail setup for notifications
mail: true
mailserver: localhost
mailfrom:  zhangjian@cditv.tv
mailto: min@example.com
 
# vCenter connection settings
server: 10.10.0.10  # vCenter 地址
port: 443 
username: "admin.xxxxx.local" # vSphere 账户 即vCenter登录用户
password: "xxxxxxxxxx"  # vSphere 账户密码 即vCenter登录用户密码
 
# New VM defaults
cpus: 2 # cpu
mem: 4  # 内存
template: centos7.9  # vCenter中的虚拟机模板名称 即克隆的源机器
domain: example  
 
dns_servers: ['8.8.8.8','1.1.1.1'] # DNS
 
# List your networks here
networks:
#可配置多个,同网段且同位掩码内的不同存储可同时配置进行批量创建
  '10.10.10.0/24': # 虚拟机网络 
    datacenter: 'DataCenter'  #必填在配置文件中,可不修改
    cluster:    'Cluster'     #必填 vCenter中的HA
    datastore:  'datastore_192.168.100' #必填 Esxi主机存储或vSAN存储,为即将创建的虚拟机所在存储
    network:    'VLAN10'  #必填  分布式交换机 或 Esxi主机标准交换机的端口组 根据具体配置作修改
    gateway:    '10.10.10.254' #可以选择 虚拟机网关配置 
	#distributedvirtualportgroup: 'DPortGroup-port'  # 端口组
	
# Esxi主机存储及标准交换机网络 配置示例
  '10.10.10.0/24': # 虚拟机网络 
	datacenter: 'DataCenter'  #必填在配置文件中,可不修改
    cluster:    'Cluster'     #必填 vCenter中的HA
    datastore:  'datastore_192.168.200' #必填 Esxi主机存储或vSAN存储,为即将创建的虚拟机所在存储
    network:    'VM Network'  #必填  分布式交换机名称 或 Esxi主机的标准交换机 根据具体配置作修改
    gateway:    '10.10.10.254' #可以选择 虚拟机网关配置
	#distributedvirtualportgroup: 'DPortGroup-port'  # 端口组
	
# vSAN存储及分布式交换机 配置示例
  '10.10.10.0/24': # 虚拟机网络 
	datacenter: 'DataCenter'  #必填在配置文件中,可不修改
    cluster:    'Cluster'     #必填 vCenter中的HA
    datastore:  'vSAN-datastore' #必填 Esxi主机存储或vSAN存储,为即将创建的虚拟机所在存储
    network:    'Distributed Switch'  #必填  分布式交换机名称
    gateway:    '10.10.10.254' #可以选择 虚拟机网关配置
    distributedvirtualportgroup: 'DPortGroup-port'  # 端口组

示例用法-基础

ezmomi clone --template centos7.9 --hostname vmname-01 --cpus 2 --mem 4 --ips  10.10.10.10

示例用法-进阶

# 克隆完自动lvm扩容 /dev/sdb
# Esxi主机本地存储用法
ezmomi clone --template centos7.9 --hostname vmname-01 --cpus 8 --mem 16 --disk 1024,thin --datastore Datastore --ips 10.10.10.10 --post-clone-cmd '/root/additional-vmware-provisioning-steps.sh 10.10.10.10' &

# vSAN存储用法
ezmomi clone --template centos7.9 --hostname vmname-01 --cpus 8 --mem 16 --disk 100 --ips 10.10.10.10 --post-clone-cmd '/root/additional-vmware-provisioning-steps.sh 10.10.10.10' &

示例用法-批量

使用python读取表格批量执行创建,create_vms.py
1、/root/ 下 创建

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import openpyxl
import subprocess,time,os
 
class CasesData:
 """用于保存测试用例数据"""
 pass
 
class ReadExcel(object):
 
 def __init__(self, file_name, sheet_name):
  self.file_name = file_name
  self.sheet_name = sheet_name
 
 def open(self):
  self.wb = openpyxl.load_workbook(self.file_name)
  self.sh = self.wb[self.sheet_name]
 
 def close(self):
  self.wb.close()
 
 def read_data(self):
  """按行读取数据,最后返回一个存储字典的列表"""
  self.open()
  rows = list(self.sh.rows)
  titles = []
  for t in rows[0]:
   title = t.value
   titles.append(title)
  cases = []
  for row in rows[1:]:
   case = []
   for r in row:
    case.append(r.value)
   cases.append(dict(zip(titles, case))) # 通过zip聚合打包用例的标题和数据
  self.close()
  return cases
 
 
if __name__ == '__main__':
 vms = ReadExcel('create_vms.xlsx', 'vms') #读取create_vms.xlsx表vms页内容
 res = vms.read_data()   # 最后返回一个存储字典的列表
 for vm in res:
    cpu = vm['cpu']
    hostname = vm['hostname']
    mem = vm['memory']
    disk = vm['disk']
    ip = vm['ip']
    datastore = vm['datastore']
    post_cmd = f"'/root/additional-vmware-provisioning-steps.sh {ip}'"
    if not disk and not datastore:
        shell = f"ezmomi clone --template centos7.9 --hostname {hostname} --cpus {cpu} --mem {mem} --ips {ip} --post-clone-cmd {post_cmd} &"
    elif not disk:
        shell = f"ezmomi clone --template centos7.9 --hostname {hostname} --cpus {cpu} --mem {mem} --ips {ip} --datastore {datastore} --post-clone-cmd {post_cmd} &"
    elif not datastore:
        shell = f"ezmomi clone --template centos7.9 --hostname {hostname} --cpus {cpu} --mem {mem} --ips {ip} --disks {disk} --post-clone-cmd {post_cmd} &"
    else:
        shell = f"ezmomi clone --template centos7.9 --hostname {hostname} --cpus {cpu} --mem {mem} --ips {ip} --disks {disk},thin --datastore {datastore} --post-clone-cmd {post_cmd} &"       
    #print(shell)
    #r = subprocess.Popen(shell,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    #print(r.stdout.read().decode('utf8'))
    os.system(shell)

示例数据源-如图

2、源数据create_vms.xlsx文件 “vms” shit页
create_vms.py中: vms = ReadExcel(‘create_vms.xlsx’, ‘vms’)
xlsx文件内容示例 如下

ESXI 如何批量上传文件 esxi批量创建虚拟机_运维

该xlsx文件需与上create_vms.py脚本放置于同一目录:/root/

lvm扩容脚本及配置

** /root/additional-vmware-provisioning-steps.sh ,与以上creat_vms.py置于同一目录 **
3、机器创建完成后lvm自动扩容:暂时只能将/dev/sdb卷扩容至 root根目录下,其他配置无需要可删除,如有建议请大神评论或私信优化☺
该脚本可在虚拟机创建完成后单独手动执行,一般与批量创建搭配使用

#!/bin/bash
export ip=$1
echo $ip
export SSHPASS="your_template_password"
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no pvcreate /dev/sdb
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no vgextend centos /dev/sdb
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no lvextend -l +100%FREE /dev/centos/root 
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no xfs_growfs /dev/centos/root
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no df -h | grep root
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no sed -i '/DOMAIN/d' /etc/sysconfig/network-scripts/ifcfg-ens192
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no sed -i '/search/d' /etc/resolv.conf
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no sed -i '/domain/d' /etc/hosts
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no systemctl restart network
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no systemctl restart ntpd
sshpass -e ssh root@${ip} -o StrictHostKeyChecking=no systemctl enable ntpd