Я хочу создать и настроить несколько виртуальных машин с IP. Это работает только при создании одного за раз, но я хотел бы масштабировать этот сценарий, чтобы создавать более одного за раз.
Я вызываю phpipam и получаю следующий доступный IP-адрес из подсети и назначаю это значение роли vmware_guest, и она запускается с соответствующим IP-адресом.
Ограничение - когда я перебираю список в: group_vars / all
total_vms:
- vm01
- vm02
- vm03
Он генерирует IP-адрес для каждого элемента в списке, как и должно, но этот список должен быть динамическим в зависимости от количества виртуальных машин.
---
- name: Gathering ipam auth token
uri:
validate_certs: false
url: "{{ ipam.token_request }}"
method: POST
user: "{{ ipam.api_user }}"
password: "{{ ipam.api_pass | trim }}"
force_basic_auth: yes
register: output
- name: checking subnet for next available ip address
uri:
validate_certs: false
url: "{{ ipam.available_ip }}/{{ ipam.subnet_id | int }}"
headers: token="{{ output.json.data.token }}"
register: ip_address
with_items: "{{ total_vms }}"
...
Как я могу заполнить зарегистрированную переменную значением, не указывая вручную размер списка? Единственный способ вернуть нужные мне значения - это специально вызвать каждый элемент в списке:
- debug: msg={{ ip_address.results[0].json.data }}
- debug: msg={{ ip_address.results[1].json.data }}
- debug: msg={{ ip_address.results[2].json.data }}
Можно ли сохранить длину списка в переменной, а затем использовать ее на месте? После этого я могу динамически перебирать списки, я должен записать возвращенный ip в dict в файле и продолжить создание vm.
---
- name: Create a virtual machine from a template
vmware_guest:
hostname: "{{ vcenter.url }}"
username: "{{ vcenter.username }}"
password: "{{ vcenter.password | trim }}"
datacenter: "{{ vcenter.datacenter }}"
validate_certs: false
folder: "{{ folder }}"
name:
- "{{ vcenter_name }}"
state: poweredon
template: "{{ vcenter.template }}"
disk:
- size_gb: 20
type: thin
autoselect_datastore: true
networks:
- name: "{{ vlan }}"
ip: "{{ ip_address.json.data }}"
netmask: "{{ netmask }}"
gateway: "{{ gateway }}"
domain: "{{ vcenter.domain }}"
dns_servers: "{{ vcenter.dns_servers }}"
register: deploy
delegate_to: localhost
...
Я думаю, ты делаешь это с with_items:
петля. Вместо этого:
- debug: msg={{ ip_address.results[0].json.data }}
- debug: msg={{ ip_address.results[1].json.data }}
- debug: msg={{ ip_address.results[2].json.data }}
Вы можете попробовать это?
- debug: msg="{{ item.json.data }}"
with_items:
- "{{ ip_address.results }}"