设为首页 收藏本站
查看: 1363|回复: 0

[经验分享] saltstack之virt模块创建虚拟机分析

[复制链接]

尚未签到

发表于 2018-8-1 09:30:40 | 显示全部楼层 |阅读模式
  虚拟管理机:kvm/qemu
  两种方式创建:
  salt 'hypervisor' virt.init vm_name 4 512 salt://path/to/image.raw
  salt 'hypervisor' virt.init vm_name 4 512 nic=profile disk=profile
  先说第1种,此种方式是将Master上的镜像文件cp到kvm主机(此种方式依赖网络速),
  执行命令如下:
  salt 'kvm.tiancity.com' virt.init web10 4 512 salt://img/Template_Centos63x64.img
  hypervisor = __salt__['config.get']('libvirt:hypervisor', hypervisor)
  config.get获取数据的顺序如下:
  - Local minion config (opts)
  - Minion's grains
  - Minion's pillar
  - Master config
  因为我没有在grains,pillar处设置libvirt:hypervisor,所以此处的值为hypervisor(默认值:hypervisor=VIRT_DEFAULT_HYPER,VIRT_DEFAULT_HYPER = 'kvm')
  假设我在/etc/salt/minion的配置文件处,设置如下
DSC0000.jpg

  通过salt 'kvm.tiancity.com' config.get libvirt:hypervisor,我们将会获取到zzj这个值。
DSC0001.jpg

  在这里,我不需要设置,因为我的虚拟管理机用的就是kvm。哇....
  nicp = _nic_profile(nic, hypervisor, **kwargs)
  此处的函数会获取一个网卡相关属性列表,最后我会提供出来
  # support old location
  config_data = __salt__['config.option']('virt.nic', {}).get(
  profile_name, None
  )
  if config_data is None:
  config_data = __salt__['config.get']('virt:nic', {}).get(
  profile_name, default
  )
  这段话的意思是说,如果你没有定义virt.nic变量,那么config_data为None
  当config_data为None时,我们再判定有没有设置virt:nic,如果没有设置则取default
  那么config_data=default(default = [{'eth0': {}}])
  if isinstance(config_data, dict):
  append_dict_profile_to_interface_list(config_data)
  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)
  判定config_data是字典,还是列表,此处是列表,并且仅有1个键(如果有两块网卡呢?以后分析测试),执行append_dict_profile_to_interface_list(interface)
  def append_dict_profile_to_interface_list(profile_dict):
  for interface_name, attributes in profile_dict.items():
  attributes['name'] = interface_name
  interfaces.append(attributes)
  此处意指:interfaces这个列表追加一个attributes字典.值interfaces=[{'name':'eth0'}]
  for interface in interfaces:
  _normalize_net_types(interface)
  _assign_mac(interface)
  if hypervisor in overlays:
  _apply_default_overlay(interface)
  _normalize_net_types(interface)将会为interfaces中的字典增加type和source属性,interfaces=[{'name':'eth0','type':None,'source':None}]
  _assign_mac(interface)此处通过salt.utils.gen_mac()生成一个虚拟mac,并且更新interfaces=[{'name':'eth0','type':None,'source':None,'mac':'AC:DE:48:5D:9C:B4'}]
  _apply_default_overlay(interface)将会更新interfaces=[{'name':'eth0','type':'bridge','source':'br0','mac':'AC:DE:48:5D:9C:B4','model': 'virtio'}]
  并且返回interfaces,那么nicp的值就是interfaces
  若指定image,
  diskp = _disk_profile('default', hypervisor, **kwargs)
  则返回diskp=[{'system':{'size':'8192','format':'qcow2','model':'virtio','pool':'/srv/salt-images'}}]
  disk_name = diskp[0].keys()[0]
  disk_type = diskp[0][disk_name]['format']
  disk_file_name = '{0}.{1}'.format(disk_name, disk_type)
  则disk_name=system,disk_type=qcow2,disk_file_name=system.qcow2
  img_dir = __salt__['config.option']('virt.images')
  img_dest = os.path.join(
  img_dir,
  name,
  disk_file_name
  )
  img_dir = os.path.dirname(img_dest)
  则:img_dest="/srv/salt-image/web10/system.qcow2",img_dir="/srv/salt-image/web10"
  sfn = __salt__['cp.cache_file'](image, saltenv)调用cp.cache_file将image通过网络保存到
  minion(也是kvm主机的)/var/cache/salt/minion/files/base/web10/system.qcow2
  最后通过salt.utils.copyfile(sfn, img_dest)将
  /var/cache/salt/minion/files/base/img/Template_Centos63x64.img此处的文件copy到
  /srv/salt-image/web10/system.qcow2
  xml = _gen_xml(name, cpu, mem, diskp, nicp, hypervisor, **kwargs)
  这段很重要,这段生成了一个虚拟机简要的xml,不过,最重要的是构造了一个context的复杂数据,再通过JINJA的模板(libvirt_domain.jinja)渲染成xml.
  context={'hypervisor':'kvm','mem':'524288','name':'web10','cpu':'4','controller_model':False,'boot_dev':['hd'],'disks':{'system':{'file_name':'system.qcow2','source_file':'/srv/salt-images/vm_name/system.qcow2','target_dev':'vda','address':False,'driver': True,'disk_bus':'virtio','type': 'qcow2','index': '0'}},'nics':[{'mac':'AC:DE:48:FE:01:BC','model':'virtio','name':'eth0','source':'br0','type':'bridge'}]}
  生成的xml:
  <domain type='kvm'>
  <name>web10</name>
  <vcpu>4</vcpu>
  <memory unit='KiB'>524288</memory>
  <os>
  <type>hvm</type>
  <boot dev='hd' />
  </os>
  <devices>
  <disk type='file' device='disk'>
  <source file='/srv/salt-images/vm_name/system.qcow2' />
  <target dev='vda' bus='virtio' />
  <driver name='qemu' type='qcow2' cache='none' io='native'/>
  </disk>
  <interface type='bridge'>
  <source bridge='br0'/>
  <mac address='AC:DE:48:FE:01:BC'/>
  <model type='virtio'/>
  </interface>
  <graphics type='vnc' listen='0.0.0.0' autoport='yes' />
  </devices>
  <features>
  <acpi />
  </features>
  </domain>
  define_xml_str(xml)将以上的xml生成一个/etc/libvirt/qemu/web10.xml
  后面那一段要不要安装salt-minion,最后一个create(name),就启动虚拟机喽。
  注意:我的镜像文件格式为raw,不是qcow2,所以我将代码中的'format':'qcow2'改为
  'format':'raw',注意噢,改的是minion的virt.py代码噢。
  你看我的结果:
DSC0002.jpg

DSC0003.jpg

  如果想了解更多,请关注我们的公众号
  公众号ID:opdevos
  扫码关注
DSC0004.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-544543-1-1.html 上篇帖子: saltstack(二)基本操作 下篇帖子: saltstack之virt模块创建虚拟机分析之二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表