Ansible:如何在循环中自动调用字典键

Ansible:如何在循环中自动调用字典键,ansible,Ansible,作为ansible automation的一部分,将以以下格式生成一个变量文件,并保存为somedictvars.yml,如果我在任务中单独指定每个键,我可以使用循环 但是,由于它是自动生成的,而且密钥的数量也不同(有时可能有一个员工,有时可能有多个员工的详细信息),所以我正在寻找一种方法,只指定循环下使用的密钥的前缀 somedictvars.yml - employee1: name: Martin D'vloper job: Developer skills:

作为ansible automation的一部分,将以以下格式生成一个变量文件,并保存为
somedictvars.yml
,如果我在任务中单独指定每个键,我可以使用循环

但是,由于它是自动生成的,而且密钥的数量也不同(有时可能有一个员工,有时可能有多个员工的详细信息),所以我正在寻找一种方法,只指定循环下使用的密钥的前缀

somedictvars.yml

-  employee1:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
-  employee2:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang
我的ansible playbook如下所示,手动指定每个dict var键

- name: include vars from YAML config files.
  include_vars: somedictvars.yml

- name: debug
  debug:
      msg: "{{ item.name }}"
  loop:
     - "{{ employee1 }}"
     - "{{ employee2 }}"
输出: 任务[调试]

*********************************************************************************************************************************************************************
ok: [UKXWD1EM01] => (item={u'skills': [u'python', u'perl', u'pascal'], u'job': u'Developer', u'name': u"Martin D'vloper"}) => {
    "msg": "Martin D'vloper"
}
ok: [UKXWD1EM01] => (item={u'skills': [u'lisp', u'fortran', u'erlang'], u'job': u'Developer', u'name': u'Tabitha Bitumen'}) => {
    "msg": "Tabitha Bitumen"
}
请帮助如何在循环下使用通用名称。。像
employee[0-9]
一样,如果我的文件有1个键,它将在调试中打印,如果它有3个键,我将只打印3个键['name']

否则,请建议我是否可以将文件格式更改为任何其他格式,以符合ansible。因此,循环可以自动为文件中任意数量的可用变量键工作

请帮忙


提前感谢。

阅读文件并创建变量
employees
。任务

    - slurp:
        src: somedictvars.yml
      register: somedictvars
    - set_fact:
        employees: "{{ somedictvars.content|b64decode|from_yaml }}"
    - debug:
        var: employees
    - set_fact:
        employees2: "{{ employees2|default([]) +
                        [{'employee': my_key.0}|combine(my_val.0)] }}"
      vars:
        my_key: "{{ item.keys()|list }}"
        my_val: "{{ item.values()|list }}"
      loop: "{{ employees }}"
    - debug:
        var: employees2
给予

还有更多的选择如何继续。
1) 使词典符合目的。任务

    - slurp:
        src: somedictvars.yml
      register: somedictvars
    - set_fact:
        employees: "{{ somedictvars.content|b64decode|from_yaml }}"
    - debug:
        var: employees
    - set_fact:
        employees2: "{{ employees2|default([]) +
                        [{'employee': my_key.0}|combine(my_val.0)] }}"
      vars:
        my_key: "{{ item.keys()|list }}"
        my_val: "{{ item.values()|list }}"
      loop: "{{ employees }}"
    - debug:
        var: employees2
给予

循环列表。比如说

    - debug:
          msg: "{{ item.name }}"
      loop: "{{ employees2 }}"
    - debug:
        msg: "{{ item }}"
      loop: "{{ employees|json_query('[].*.name')|flatten }}"
给予


2) 不用改变字典的结构,而是可以使用。比如说

    - debug:
          msg: "{{ item.name }}"
      loop: "{{ employees2 }}"
    - debug:
        msg: "{{ item }}"
      loop: "{{ employees|json_query('[].*.name')|flatten }}"
给出了相同的结果