#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. Также мне нужно иметь другое имя для виртуальных машин. Возможно ли это?