Ansible: параллельное развертывание vmware с несколькими Vcenter

#ansible

#ansible

Вопрос:

Я пытаюсь написать playbook, который создаст 3 виртуальных машины на 3 серверах ESXI из шаблона через Vcenter с помощью модуля Ansible vmware_guest.

Проблема в том, что у меня есть 3 разных Vcenter с 3 хостами ESXI на каждом, и playbook должен создавать все виртуальные машины на всех хостах ESXI параллельно.

я пытался с помощью цикла, но цикл делает это шаг за шагом.

Вот моя версия playbook на данный момент.

Я буду очень благодарен, если кто-нибудь поможет мне в этом 🙂

 ---
# create a new VM from a template

- name: VM from template
  hosts: localhost
  gather_facts: false
  connection: local
  vars:
    vcenter_hostname: 10.0.0.1
    vcenter_user: john.doe
    vcenter_pass: Passw0rd
    vmtemplate: test-teplate
    name: "newvm2"
    notes: Ansible Test
  tasks:
    - name: Create VM from template
      vmware_guest:
        validate_certs: False
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        esxi_hostname: "{{ item.esxhost }}"
        datacenter: Datacenter1
        folder: templates
        name: "{{ name }}"
        template: "{{ vmtemplate }}"
        disk:
          - size_gb: 100
            datastore: "{{ item.datastore }}"
        wait_for_ip_address: False
        state: present
      register: newvm2
      loop:
        - {esxhost: '10.0.46.142', datastore: 'Datastore_XXX'}
        - {esxhost: '10.0.46.143', datastore: 'Datastore_ZZZ'}  

Ответ №1:

Вы можете создавать их параллельно, динамически добавляя каждый хост ESX в инвентарь, это будет выглядеть примерно так:

 - hosts: localhost
  gather_facts: False
  tasks:
    - add_host:
        hostname: '{{item.esxhost}}'
        groups: vms
        esxhost:   '{{ item.esxhost }}'
        datastore: '{{ item.datastore }}'
      loop:
         - {esxhost: '10.0.46.142', datastore: 'Datastore_XXX'}
         - {esxhost: '10.0.46.143', datastore: 'Datastore_ZZZ'}

- name: VM from template
  hosts: vms
  gather_facts: false
  connection: local
  vars:
    vcenter_hostname: 10.0.0.1
    vcenter_user: john.doe
    vcenter_pass: Passw0rd
    vmtemplate: test-teplate
    name: "newvm2"
    notes: Ansible Test
  tasks:
    - name: Create VM from template
      vmware_guest:
        validate_certs: False
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        esxi_hostname: "{{ esxhost }}"
        datacenter: Datacenter1
        folder: templates
        name: "{{ name }}"
        template: "{{ vmtemplate }}"
        disk:
          - size_gb: 100
            datastore: "{{ datastore }}"
        wait_for_ip_address: False
        state: present
      register: newvm2
  

Вы можете использовать тот же принцип для одновременного создания всех 9 виртуальных машин.

Комментарии:

1. Разве мы не можем просто поместить все это в инвентарь, а не в этот add_host материал? В сборниках воспроизведения не должно быть информации, относящейся к конкретному хосту, чтобы их можно было переносить между запасами.

2. Я согласен, если это возможно, оно должно поступать непосредственно из инвентаря, однако существуют некоторые варианты использования для динамического добавления хостов, например, когда данные поступают из входных данных из шаблона башни и т. Д. Я не уверен, какой вариант использования здесь.

3. Я утверждаю, что это плохой вариант использования. В оптимальном случае должен быть один «источник достоверности», который представляет собой либо инвентаризацию (хранящуюся в системе управления версиями, такой как Subversion или Git), либо электронную таблицу или базу данных, из которых можно создать инвентаризацию. (В случае динамической инвентаризации «источник истины» будет содержать подсчеты и спецификации для виртуальных group_vars/all машин .) Только для одноразовых виртуальных машин такая информация должна поступать из пользовательского ввода, но даже там так же легко создать новую инвентаризацию в Tower.

4. Не могли бы вы, пожалуйста, показать, как в примере с этим учебником с помещением всех хостов в инвентарь?

5. Также мне нужно иметь другое имя для виртуальных машин. Возможно ли это?