使用字典注册变量并动态循环输出

使用字典注册变量并动态循环输出

我想创建并启动多个具有 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 写入文件中的字典,然后继续创建 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
...

答案1

我认为你可以用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 }}"

相关内容