【问题标题】:Deploy massive VM guest on VmWare with ansible playbook使用 ansible playbook 在 VmWare 上部署海量 VM 来宾
【发布时间】:2019-07-21 00:39:35
【问题描述】:

我为 ansible 编写了一个剧本,用于在我的 vmware 基础架构上创建虚拟机。它工作得很好,但我不知道如何通过要创建的机器列表,有没有人知道是否可以这样做?

这是我的剧本:

hosts: all
gather_facts: false
vars_files:
 - variables.yml
connection: local
   tasks:
      - name: configura install cfg
        template:
          src: template_install.j2
          dest:  /root/cfg/{{ vm_name }}.cfg

      - name: configura isolinux.cfg
        template:
          src: isolinux.j2
          dest:  /root/rhel/isolinux/isolinux.cfg

      - name: copia file su satellite
        shell: scp /root/cfg/{{ vm_name }}.cfg root@10.100.64.50:/var/ftp/pub/kickstart/.

      - name: make cd iso for install red hat
          shell: /root/makecdrom.sh {{ vm_name }}

      - name: upload cdrom to library datastore
          vsphere_copy:
          host: <Myvcentername>
          login: <myvcenterusername>
          password:  <Mycenterpassword>
          validate_certs: no
          src: /root/{{ vm_name}}.iso
          datacenter: {{ vm_datacenter }}
          datastore: VMW_LIBRARY01
          path: ISO/{{ vm_name }}.iso

      - name: Crea VM 
          vmware_guest:
          hostname: <Myvcentername>
          login: <myvcenterusername>
          password:  <Mycenterpassword>
          datacenter: "{{ vm_datacenter }}"
          resource_pool: "{{ vm_resource_pool }}"
          validate_certs: no
          annotation: 'creata con script ansible ip address " {{ vm_ip_addr }} "'
          folder: "{{ vm_folder }}"
          name: "{{ vm_name }}"
          state: "{{ vm_state }}"
          guest_id: "{{ vm_guest_id }}"
          cluster: "{{ vm_cluster }}"
             cdrom:
               type: iso
               iso_path: "[VMW_LIBRARY01] ISO/'{{vm_name}}.iso'"
             disk:
               - size_gb: "{{ disk_size_gb }}"
                 type: "{{ disk_type }} "
                 datastore: "{{ disk_datastore }}"
             hardware:
                 memory_mb: "{{ hardware_memory_mb }}"
                 num_cpus: "{{ hardware_num_cpus }}"
             scsi: paravirtual
             networks:
               - name: "{{ networks_name }}"
                 device_type: vmxnet3
          delegate_to: 127.0.0.1
          register: deploy_vm

这是变量文件

vm_netmask: 255.255.252.0
vm_gateway: 10.100.8.1
vm_fqdn_name: mcdlnxevtp01.menarini.net
vm_name: MCDLNXEVTP01
vm_folder: APP - EASYVISTA
vm_cluster: MCDVMWCLU02
vm_resource_pool: 06 - PRD
networks_name: dPG_3008_PRD
disk_datastore: VMW_PRD_DS02
Vm_OS: Red Hat 7.6
vm_datacenter: MDC-METROPOOL
vm_state: poweredoff
vm_guest_id: rhel7_64Guest
disk_size_gb: 50
disk_type: thin
hardware_memory_mb: 8192
hardware_num_cpus: 4
hardware_scsi: paravirtual
vm_validate_certs: no
networks_device_type: vmxnet3

感谢您的回答... 西蒙娜

【问题讨论】:

    标签: ansible vmware rhel7


    【解决方案1】:

    我更喜欢仅将库存用于配置管理。您可以这样做,但是如何跟踪更改或如何将新项目添加到堆栈中?

    在我看来,最好的方法是使用这样的 yaml 配置文件:

    vmstodeploy:
    - name: myvm
      vm_ip_addr: 192.168.0.15
      vm_netmask: 255.255.255.0
      vm_gateway: 192.168.0.1
      etc...
    

    并将其保存在 git 存储库中以进行更改控制。如果你想在堆栈中添加更多的 vm,只需添加另一个 vm:

    vmstodeploy:
    - name: myvm
      vm_ip_addr: 192.168.0.15
      vm_netmask: 255.255.255.0
      vm_gateway: 192.168.0.1
    - name: myvm2
      vm_ip_addr: 192.168.0.16
      vm_netmask: 255.255.255.0
      vm_gateway: 192.168.0.1
    

    然后阅读:

    - name: Read My VMs
        include_vars:
          file: "MyConfigFile"
          name: mydeploy
    

    从这里,您将在mydeploy var 中获得 vm 部署信息列表。

    只需在这样的角色内创建一个循环:

      - name: Deploy VMs
        include_tasks: vmware_deploy.yml
        with_items: "{{ mydeploy|default([]) }}"
        loop_control:
          loop_var: _myvms
    

    从那里,在 vmware_deploy.yml 文件中创建您的虚拟机:

    - name: Create my VMs
      vmware_guest:
    

    如果 vm 具有相同的数据,请使用 with_sequence,使用 batch() 序列化您的部署,尝试不同的选项,但始终从 yaml 中的配置文件开始。

    【讨论】:

    • 我不明白这行,你能解释一下吗? with_items: "{{ mydeploy|default([]) }}"
    • 当然! mydeploy 是一个变量,default 正在做的是将其定义为一个空列表以避免错误。如果您的配置文件为空,则 playbook 将退出而不会引发 undefined variable 错误。 {} 是一个字典 [] 是一个列表 ('') 空字符串。 () 无
    【解决方案2】:

    确实有可能。我会通过将变量拆分为整个库存的全局变量(如网关 - 对于所有服务器或服务器组都是相同的)和每个服务器来实现它。您可以通过创建包含清单列表和变量列表的文件来做到这一点:

    inventory/
      my_vms/
        hosts
        group_vars/
          all.yml
          south-dc.yml
          north-dc.yml
        host_vars/
          my_vm_1.yml
          my_vm_2.yml
    

    hosts 文件包含服务器列表(在您的情况下为虚拟机)。它可能包含以下内容:

    [all]
    my_vm_1
    my_vm_2
    
    [south-dc]
    my_vm_1
    
    [north-dc]
    my_vm_2
    

    host_vars 目录包含 YAML 文件,其变量以 hosts 文件中的主机命名,即如果您将服务器命名为 my_vm_1,则该文件将命名为 my_vm_1.yml

    group_varshost_vars 类似,但您提供了由主机组共享的变量。名为all 的特殊组为所有主机提供全局变量。

    所有的全局变量都可以放在all.yml中。例如,您可以将这些放在该文件中:

    disk_size_gb: 50
    disk_type: thin
    hardware_memory_mb: 8192
    hardware_num_cpus: 4
    

    所有每个主机变量然后将转到清单 host_vars 文件:

    vm_fqdn_name: mcdlnxevtp01.menarini.net
    vm_name: MCDLNXEVTP01
    

    通过这种方式,您可以提供一致的库存分类方式,让您有机会清理代码

    你可以通过调用来使用它

    ansible-playbook -i inventory/my_vms -l my_vm_1 playbook.yml
    

    如果您希望针对一组服务器运行该剧本,只需为库存中的所有服务器使用-l &lt;groupname&gt;-l all 启动它。

    PS:您不必将服务器放在[all] 组中。这是一个特殊的组,包含库存中的所有服务器。

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多