那今天说下第2种,命令执行格式如下:
salt 'kvm.tiancity.com' virt.init web20 4 512 nic=nics disk=system
在这里,我们需要注意下对与kvm/qemu不允许使用profile,我们需要将virt.py改下代码:
这样,就允许我的试验环境了。
我的想法是,我的虚拟机镜像文件被存储在
/var/lib/libvirt/images/web20/system.raw,看下我如何构造磁盘的数据结构呢.
diskp=[{'system':{'size':'8192','format':'raw','model':'virtio','pool':'/var/lib/libvirt/images'}}]
从分析代码中,
default = [
{'system':
{'size': '8192'}
}
]
elif hypervisor in ['qemu', 'kvm']:
overlay = {'format': 'qcow2',
'model': 'virtio',
'pool': __salt__['config.option']('virt.images')
}
disklist = __salt__['config.get']('virt:disk', {}).get(profile, default)
看出来没,在没有提供disk的profile的情况下,我们使用的是default的数据,再使用
for key, val in overlay.items():
for i, disks in enumerate(disklist):
for disk in disks:
if key not in disks[disk]:
disklist[i][disk][key] = val
就会获取到disklist=
[{'system': {'format': 'qcow2',
'model': 'virtio',
'pool': '/srv/salt-images',
'size': '8192'}}]
在这里我需要改变pool,那么我咋整呢?我可以用grains,pillar来设置.
root@saltstack:/srv/salt/_grains# more virt_disk_nic.py
def disk_profile():
grains = {}
grains['virt']={'disk':{}}
grains['virt']['disk']['system']={}
grains['virt']['disk']['system']=[{'system':{'format':'raw','pool':'/var/lib/libvirt/images'}}]
return grains
同步grains
root@saltstack:/srv/salt/_grains# salt 'kvm.tiancity.com' saltutil.sync_all
kvm.tiancity.com:
----------
grains:
- grains.virt_disk_nic
modules:
outputters:
renderers:
returners:
states:
测试:
root@saltstack:/srv/salt/_grains# salt 'kvm.tiancity.com' config.get virt:disk --output=json
{
"kvm.tiancity.com": {
"system": [
{
"system": {
"pool": "/var/lib/libvirt/images",
"format": "raw"
}
}
]
}
}
那么对应的profile名字是system,所以,如果你想使用另类的profile名字,你仅需要修改的
grains['virt']['disk']['system(profile名字)']={}
接下来,我们再来构造网卡的构造
default = [{'eth0': {}}]
kvm_overlay = {'type': 'bridge', 'source': 'br0', 'model': 'virtio'}
config_data = __salt__['config.get']('virt:nic', {}).get(
profile_name, default
)
interfaces=[]
elif isinstance(config_data, list):
for interface in config_data:
if isinstance(interface, dict):
if len(interface.keys()) == 1:
append_dict_profile_to_interface_list(interface)
else:
interfaces.append(interface)
以上几处便是将interface网卡相关属性信息添加到interfaces列表中的
interfaces=[{'name':'eth0','type':'bridge','source':'br0','mac':'AC:DE:48:5D:9C:B4','model': 'virtio'}]
那么网卡和磁盘的构造:
def disk_nic():
grains = {}
grains['virt']={'disk':{},'nic':{}}
grains['virt']['disk']['system']={}
grains['virt']['nic']['nics']=[{'eth0':{'bridge':'br0'}}]
grains['virt']['disk']['system']=[{'system':{'format':'raw','pool':'/var/lib/libvirt/images'}}]
return grains
测试:
root@saltstack:/srv/salt/_grains# salt 'kvm.tiancity.com' config.get virt:nic --output=json
{
"kvm.tiancity.com": {
"nics": [
{
"eth0": {
"bridge": "br0"
}
}
]
}
}
好了,我们所有的东西都构造好了,那么我们来执行下,看看能不能正常启动我的虚拟机web20,当然镜像文件已经放置好到/var/lib/libvirt/images/web20/system.raw
开始执行吧...
秒开....
哈哈。下次,我再尝试下,添加一块数据盘和添加一块网卡。
到时再看看能不能正常启动。