Назад | Перейти на главную страницу

Зарегистрируйте var с помощью dict и переберите вывод динамически

Я хочу создать и настроить несколько виртуальных машин с 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 }}"