Dictionary 在ansible字典中循环以分配字典值

Dictionary 在ansible字典中循环以分配字典值,dictionary,ansible,yaml,ansible-inventory,Dictionary,Ansible,Yaml,Ansible Inventory,有没有办法通过ansible字典循环分配其他ansible字典值 我的小组成员包括以下人员: domain_controllers: dc0: hostname: "dc0" ip_address: "192.168.1.0" dc1: hostname: "dc1" ip_address: "192.168.1.1" dc2: hostanme: "dc

有没有办法通过ansible字典循环分配其他ansible字典值

我的小组成员包括以下人员:

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"
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"
我有一个通用的keepalive角色,它配置服务器角色用来为这些域控制器创建VIP的keepalive

下面是我的
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"
        ...
我已经在keepalived角色中设置了jinja格式,可以基于这些变量构建
/etc/keepalived.conf

我要做的是根据
domain\u controllers
字典的内容分配这些变量。如何使用
set\u facts
分配这样一个大型嵌套字典

我只想在
域控制器
中循环,因为我想在升级和/或迁移到新DC时更新我的
组变量/all
,因为我还有其他使用此变量的剧本


此外,还可以在
vars/main.yml
中分配这些变量,而不是通过
set\u facts
任务分配这些变量。

我通过以下方法解决了这个问题:

在组_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"
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\u controllers
中没有至少3项,则playbook会出错。我仍然想找到一种方法来循环列表