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文件内容示例 如下
该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