Ansible L oop в пределах того же l oop с использованием with_items - PullRequest
1 голос
/ 05 мая 2020

Нужна помощь при попытке l oop через несколько пулов, в то время как некоторые пулы могут иметь более 1 хоста. Я пытался использовать with_nested и with_subelements, но оба, похоже, не делают то, что я хочу.

- name: Pool members
  bigip_pool_member:
    state: present
    pool: "{{ item.pool }}"
    partition: Common
    host: "{{ item.host }}"
    port: "{{ item.port }}"
    provider:
      server: bigip.domain.com
      user: admin
      password: admin
      validate_certs: no
  delegate_to: localhost
  with_items:
    - { pool: pool, host: [10.10.10.10, 10.10.10.11], port: 80 }
    - { pool: pool2, host: 10.10.10.10, port: 80 }

Я считаю, что поле хоста может принимать только одно значение за раз, поэтому я нужно л oop через хосты для одного пула. Результатом будет что-то вроде

  bigip_pool_member:
    state: present
    pool: pool
    partition: Common
    host: 10.10.10.10
    port: 80

  bigip_pool_member:
    state: present
    pool: pool
    partition: Common
    host: 10.10.10.11
    port: 80

  bigip_pool_member:
    state: present
    pool: pool2
    partition: Common
    host: 10.10.10.10
    port: 80

1 Ответ

0 голосов
/ 05 мая 2020

L oop подэлементы - это то, что вы ищете. Например, см. Нижеприведенную инструкцию, как ссылаться на нужные атрибуты

- hosts: localhost
  vars:
    my_pools:
      - {pool: pool, host: [10.10.10.10, 10.10.10.11], port: 80}
      - {pool: pool2, host: [10.10.10.10], port: 80}
  tasks:
    - debug:
        msg: "pool:{{ item.0.pool }} port:{{ item.0.port }} host:{{ item.1 }}"
      with_subelements:
        - "{{ my_pools }}"
        - host

дать

    "msg": "pool:pool port:80 host:10.10.10.10"
    "msg": "pool:pool port:80 host:10.10.10.11"
    "msg": "pool:pool2 port:80 host:10.10.10.10"

Примечания

  • Просто поместите ссылки на атрибуты в свой код.
  • Будьте последовательны. Атрибут host должен быть списком, даже если список содержит только один элемент.
  • Используйте loop вместо with_subelements
      loop: "{{lookup('subelements', my_pools, 'host', {'skip_missing': True})}}"


Ниже задача с минимальными изменениями, которые должны заставить ее работать
- name: Pool members
  bigip_pool_member:
    state: present
    pool: "{{ item.0.pool }}"
    partition: Common
    host: "{{ item.1 }}"
    port: "{{ item.0.port }}"
    provider:
      server: bigip.domain.com
      user: admin
      password: admin
      validate_certs: no
  delegate_to: localhost
  with_subelements:
    - - {pool: pool, host: [10.10.10.10, 10.10.10.11], port: 80}
      - {pool: pool2, host: [10.10.10.10], port: 80}
    - host

(не тестировалось)

...