Ansible 如何创建字典键列表

问题描述 投票:0回答:1

我可能错过了一些简单的事情。我的字典在 vars.yml

    deploy_env:
      dev:
        schemas:
          year1:
            - main
            - custom
          year2:
            - main
            - custom
            - security
          year3:
            - main
            - custom

然后在我的playbook.yml中,我有类似的东西

    - set_fact:
        years: "{{ deploy_env.dev.schemas }}"
    
    - name: Create schemas
      shell: "mysql ....params go here... {{ item }}"
      with_nested:
        - "{{ years }}"

如果 vars.yml 中的模式是一个简单的列表,则上述方法可以正常工作,即:

    deploy_env:
      dev:
        schemas:
          - year1
          - year2
          - year3

但是一旦我在每年下添加额外的项目(使其成为字典(?),我就开始收到错误:

       - "{{ years }}

我基本上想用此任务的 year1year2year3 值填充 {{years}}

我看过很多例子,但我看到的所有内容都非常复杂,而且都是关于如何创建字典,这没有帮助。

dictionary variables ansible
1个回答
20
投票

可以创建字典键的列表。例如,

    - set_fact:
        years: "{{ deploy_env.dev.schemas.keys()|list }}"
    - debug:
        var: item
      loop: "{{ years }}"

给出(删节)

    item: year1
    item: year2
    item: year3

注意:方法key()在上面的表达式中是多余的。默认情况下,字典到列表的转换会返回字典键的列表。例如,下面的迭代给出相同的结果

      loop: "{{ deploy_env.dev.schemas | list }}"

参见:Python字典keys()方法


列表与字典

引用问题:

“...我在每年下添加额外的项目(使其成为字典(?)...”

添加项目不会将列表更改为字典。

YAML
中的破折号 - 引入了列表中的一项。

列表示例:

    schemas:
      - year1
      - year2
      - year3

具有单个列表的哈希列表示例:

    schemas:
      - year1:
          - main
          - custom
      - year2:
          - main
          - custom
          - security
      - year3:
          - main
          - custom

字典示例:

    schemas:
      year1:
        - main
        - custom
      year2:
        - main
        - custom
        - security
      year3:
        - main
        - custom

备注:

  • 某些过滤器在用作需要列表的参数时将字典转换为其键列表。例如,过滤器difference操作列表
    - debug:
        msg: "{{ deploy_env.dev.schemas|difference(['year2']) }}"

给予

msg:
  - year1
  - year3

  • 用于测试的完整剧本示例
- hosts: localhost

  vars:

    deploy_env:
      dev:
        schemas:
          year1: [main, custom]
          year2: [main, custom, security]
          year3: [main, custom]

  tasks:

    - set_fact:
        years: "{{ deploy_env.dev.schemas.keys()|list }}"
    - debug:
        var: item
      loop: "{{ years }}"

    - debug:
        msg: "{{ deploy_env.dev.schemas|difference(['year2']) }}"
© www.soinside.com 2019 - 2024. All rights reserved.