使用带有循环的set_fact输出ansible

时间:2019-03-05 19:34:58

标签: ansible

我使用ansible在proxmox中创建和运行lxc容器。 运行容器任务:

    - name: "DHCP IP"
      proxmox:
   ...
        hostname: "{{ item }}"
   ...
        pubkey: "{{  pubkey  }}"
      with_items:
          - "{{ (servers_name_suggested | union(servers_name_list)) | unique }}"
          register: output_dhcp
          when: not static_ip

    - set_fact:
        vmid: "{{ output_dhcp.results[0].msg | regex_search('[0-9][0-9][0-9]') }}"

    - name: "Start container {{ vmid }}"
      proxmox:
        vmid: "{{ vmid }}"
        api_user: root@pam
        api_password: "{{  api_password }}"
        api_host: "{{  api_host }}"
        state: started
      when: start_lxc

如果启动了一个容器,任务“ DHCP IP”中的一项,则可以工作。如果我设置 两个或多个项目,我的任务仅从第一个容器开始。因为我正在设置

output_dhcp.results[0].msg

例如,如果我要创建树形容器,如何获取有关所有容器的信息:

output_dhcp.results[1].msg
output_dhcp.results[2].msg

并收到

- name: "Start container {{ vmid }}"
  proxmox:
    vmid: "{{ vmid }}"

用于运行我所有的新容器。

1 个答案:

答案 0 :(得分:0)

output_dhcp.results是一个列表,如果仅用[0]提取第一项,则只有第一项。

您需要将列表转换为可以在“启动容器”任务中迭代的另一个列表:

- set_fact:
  vmids: "{{ output_dhcp.results | map(attribute='msg') | map('regex_search', '[0-9][0-9][0-9]') | list }}"

- name: "Start container {{ item }}"
  proxmox:
    vmid: "{{ item }}"
    api_user: root@pam
    api_password: "{{ api_password }}"
    api_host: "{{ api_host }}"
    state: started
  with_items: "{{ vmids }}"
  when: start_lxc

解释转换部分:

  • output_dhcp.results | map(attribute='msg') =>获取msg列表(http://jinja.pocoo.org/docs/dev/templates/#map)中每个项目的output_dhcp.results属性
  • | map('regex_search', '[0-9][0-9][0-9]') =>在列表的每个项目上应用regex_search
  • | list =>将生成器转换为列表