【问题标题】:Ansible: looping over nested dictionary variablesAnsible:循环嵌套字典变量
【发布时间】:2020-03-27 17:52:03
【问题描述】:

我有以下带有嵌套字典的 vars.yml 文件:

hosts:
  server_1:    
    apps:
      - x1
      - x2
      - x3
      - x4
      - x5
    storage:
      -
      -
    cpu:
      -
      -
  server_2:    
    apps:
      - y1
      - y2
      - y3
      - y4
      - y5
    storage:
      -
      -
    cpu:
      -
      -
server_N:    
    apps:
      - n1
      - n2
      - n3
      - n4
      - n5

我想在下面的示例剧本中使用它作为循环变量,以便在 dict 上多次执行任务:

- hosts: localhost
  gather_facts: no
  vars_files:
    - vars.yml

  tasks:
    - name: Install apps
      debug:
          msg: "{{ item.value }}"
          msg: "{{ item.value.apps }}"
      with_dict: "{{ hosts }}"

我想将它们用作变量,并获得服务器和应用程序相关的结果循环迭代。

1. msg: "server_1"
   msg: "x1"
2. msg: "server_1"
   msg: "x2"
3.  msg: "server_1"
   msg: "x3"
....etc
6. msg: "server_2"
   msg: "y1"
7. msg: "server_2"
   msg: "y2"
....etc

我想你明白了。 此外,vars.yml 文件中有多少个“server_N”也无关紧要!

得到这个结果的最简单和正确的方法是什么?

【问题讨论】:

    标签: ansible


    【解决方案1】:

    任务

        - debug:
            msg: "{{ item.0.key }} {{ item.1 }}"
          with_subelements:
            - "{{ hosts|dict2items }}"
            - value.apps
    

    给予

        "msg": "server_N n1"
        "msg": "server_N n2"
        "msg": "server_N n3"
        "msg": "server_N n4"
        "msg": "server_N n5"
        "msg": "server_1 x1"
        "msg": "server_1 x2"
        "msg": "server_1 x3"
        "msg": "server_1 x4"
        "msg": "server_1 x5"
        "msg": "server_2 y1"
        "msg": "server_2 y2"
        "msg": "server_2 y3"
        "msg": "server_2 y4"
        "msg": "server_2 y5"
    

    【讨论】:

    • 谢谢!就是这样。
    • 您应该创建一个符合目的的数据结构。如果您既不能使用也不能更改输入数据,请创建一个新字典。我不会猜测预期的结果可能是什么。如果有问题,请打开一个新问题。
    【解决方案2】:

    正确的方法是将这些信息放入host_vars/server1host_vars/server2等文件中:

    # this is host_vars/server1
    apps:
      - x1
      - x2
      - x3
      - x4
      - x5
    storage:
      -
      -
    cpu:
      -
      -
    

    然后,您的剧本如下所示:

    - hosts: all
      gather_facts: no
    
      tasks:
      - name: Install apps
        debug:
          msg: "{{ item }}"
        with_items: "{{ apps }}"
        delegate_to: localhost      # if really necessary
    

    【讨论】:

    • 不得更改 vars.yml。此外,vars.yml 文件中有多少个“server_N”也无关紧要!
    • 只需解析vars.yml 文件即可填充host_vars 文件。无需修改它。您拥有多少 host_vars 文件也无所谓。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2022-06-15
    • 2021-07-16
    相关资源
    最近更新 更多