簡體   English   中英

循環通過 ansible 字典來分配字典值

[英]Looping through ansible dictionary to assign dictionary values

有沒有辦法循環通過 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"

我有一個通用的keepalived 角色,它配置了服務器角色用來為這些域控制器創建VIP 的keepalived。

以下是我的roles/servers/forward/vars.yml角色用於構建 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_controllers字典的內容分配這些變量。 我如何使用set_facts來分配像這樣的大型嵌套字典?

我只想循環訪問domain_controllers ,因為我想在升級和/或遷移到新 DC 時更新我的group_vars/all ,因為我還有其他使用此變量的劇本。

此外,是否可以在vars/main.yml中分配這些變量,而不是通過set_facts任務?

我用以下方法解決了這個問題:

在 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 個項目,則劇本會出錯。 我仍然想找到一種方法來遍歷列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM