Цикл по ansible словарю для присвоения словарных значений - PullRequest
0 голосов
/ 14 июля 2020

Есть ли способ l oop через словарь ansible для присвоения других ansible значений словаря?

У меня в group_vars / all есть следующее:

domain_controllers:
  dc0:
    hostname: "dc0"
    ip_address: "192.168.1.0"
  dc1:
    hostname: "dc1"
    ip_address: "192.168.1.1"
  dc2:
    hostanme: "dc2"
    ip_address: "192.168.1.2"

У меня есть общая c роль keepalived, которая настраивает keepalived, который роль сервера использует для создания VIP для этих контроллеров домена.

Ниже приведен мой roles/servers/forward/vars.yml, который роль keepalived использует для создания keepalived .conf.

virtual_server:
  - virutal_server_ip: "192.168.1.10"
    virtual_server_port: 389
    ...
    real_servers:
      - real_ip: "192.168.1.0"
        real_port: 389
        description: "dc0"
        ...
      - real_ip: "192.168.1.1"
        real_port: 389
        description: "dc1"
        ...
      - real_ip: "192.168.1.2"
        real_port: 389
        description: "dc2"
        ...

  - virtual_server_ip: "192.168.1.10"
    virtual_server_port: 636
    ...
    real_servers:
      - real_ip: "192.168.1.0"
        real_port: 636
        description: "dc0"
        ...
      - real_ip: "192.168.1.1"
        real_port: 636
        description: "dc1"
        ...
      - real_ip: "192.168.1.2"
        real_port: 636
        description: "dc2"
        ...

У меня уже есть форматирование jinja в роли keepalived для построения /etc/keepalived.conf на основе этих переменных.

Я хочу назначить эти переменные на основе содержимое словаря domain_controllers. Как я могу использовать set_facts для назначения такого большого вложенного словаря?

Я хотел бы просто от l oop до domain_controllers, потому что я хотел бы просто обновить свой group_vars/all при обновлении и / или перейти на новые контроллеры домена, поскольку у меня также есть другие учебники, которые используют эту переменную.

Кроме того, можно назначить эти переменные в vars/main.yml, а не через задачу set_facts?

1 Ответ

0 голосов
/ 17 июля 2020

Я решил это следующим образом:

В group_vars / all:

domain_controllers:
  - ip_address: "192.168.1.0"
    hostname: "dc0"
  - ip_address: "192.168.1.1"
    hostname: "dc1"
  - ip_address: "192.168.1.2"
    hostname: "dc2"

И в моем файле vars я вызвал список с помощью:

virtual_server:
  - virutal_server_ip: "192.168.1.10"
    virtual_server_port: 389
    ...
    real_servers:
      - real_ip: "{{ domain_controllers.0.ip_address }}"
        real_port: 389
        description: "{{ domain_controllers.0.hostname }}"
        ...
      - real_ip: "{{ domain_controllers.1.ip_address }}"
        real_port: 389
        description: "{{ domain_controllers.1.hostname }}"
        ...
      - real_ip: "{{ domain_controllers.2.ip_address }}"
        real_port: 389
        description: "{{ domain_controllers.2.hostname }}"
        ...

  - virtual_server_ip: "192.168.1.10"
    virtual_server_port: 636
    ...
    real_servers:
      - real_ip: "{{ domain_controllers.0.ip_address }}"
        real_port: 636
        description: "{{ domain_controllers.0.hostname }}"
        ...
      - real_ip: "{{ domain_controllers.1.ip_address }}"
        real_port: 636
        description: "{{ domain_controllers.1.hostname }}"
        ...
      - real_ip: "{{ domain_controllers.2.ip_address }}"
        real_port: 636
        description: "{{ domain_controllers.2.hostname }}"
        ...

Обратной стороной этого является то, что плейбук выдает ошибку, если в domain_controllers нет хотя бы 3 элементов. Я все еще хотел бы найти способ l oop по списку.

...