【问题标题】:How can I get a comma separated list of firstnames?如何获得逗号分隔的名字列表?
【发布时间】:2020-06-21 10:02:49
【问题描述】:

这是我在 YAML 文件中的地址列表:

addresses:
  person1:
    firstname: Maria
    lastname:  Smith
  person2:
    firstname: July
    lastname:  Weber
  person3:
    firstname: John
    lastname:  Kurt
  person4:
    firstname: Simon
    lastname:  Gates

我需要的是一个逗号分隔的字符串,例如Maria, July, John, Simon

我尝试了以下方法:

firstnames: >-
  {% set lastnames_list= [] %}
  {% for name in addresses %}
      {{ name.firstname | join(",")}}
  {% endfor %}
  {{ lastnames_list }} 

firstnames: >-
  {% set lastnames_list= [] %}
  {% for name in addresses %}
      {{ name | map(attribute="firstname") | join(",") }}
  {% endfor %}
  {{ lastnames_list }} 

firstnames: '{{ addresses | map(attribute="firstname") | join(",") }}' 

但 Ansible 给出以下输出:

任务包含一个带有未定义变量的选项。错误是:“unicode object”没有属性“firstname”

【问题讨论】:

    标签: ansible yaml jinja2 ansible-template


    【解决方案1】:

    简单的json_query filter就可以达到效果了。

    - debug:
        msg: '{{ addresses | json_query("@.*.firstname") | join(", ") }}'
    

    给予

    ok: [localhost] => 
      msg: Maria, July, John, Simon
    

    【讨论】:

      【解决方案2】:

      map 过滤器实际上对一系列对象应用过滤器或查找属性。

      但是在这里,你确实有一个字典,而不是一个对象序列,也不是一个只有属性的对象。

      为了实现您所寻找的,有两条路径:

      1. 如果您坚持使用实际的 YAML 结构,您可以使用 Ansible dict2items 过滤器将您的 dict 转回规范化列表中:

        firstnames: "{{ addresses | dict2items | map(attribute='value') | map(attribute='firstname') | join(',') }}"
        
      2. 你可以把你的字典转换成一个列表,这样改变你的地址列表的结构,然后你的 Jinja 就可以工作了:

        addresses:
          - firstname: Maria
            lastname:  Smith
          - firstname: July
            lastname:  Weber
          - firstname: John
            lastname:  Kurt
          - firstname: Simon
            lastname:  Gates
        

        将与

        firstnames: "{{ addresses | map(attribute='firstname') | join(',') }}" 
        

      以下是工作示例及其相应的概述。

      1. 使用dict2items 的剧本:
        - hosts: local
          gather_facts: no
          vars:
            addresses:
              person1:
                firstname: Maria
                lastname:  Smith
              person2:
                firstname: July
                lastname:  Weber
              person3:
                firstname: John
                lastname:  Kurt
              person4:
                firstname: Simon
                lastname:  Gates
        
          tasks:
            - debug:
                msg: "{{ addresses | dict2items | map(attribute='value') | map(attribute='firstname') | join(',') }}"
        
        回顾一下:
        PLAY [local]    **************************************************************************************************************
        
        TASK [debug]    **************************************************************************************************************
        ok: [local] => {
            "msg": "Maria,July,John,Simon"
        }
        
        PLAY RECAP    ****************************************************************************************************************
        local                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0     
        
      2. Playbook 更改 YAML 地址结构:
        - hosts: local
          gather_facts: no
          vars:
            addresses:
              - firstname: Maria
                lastname:  Smith
              - firstname: July
                lastname:  Weber
              - firstname: John
                lastname:  Kurt
              - firstname: Simon
                lastname:  Gates
        
          tasks:
            - debug:
                msg: "{{ addresses | map(attribute='firstname') | join(',') }}"
        
        回顾一下:
        PLAY [local]    **************************************************************************************************************
        
        TASK [debug]    **************************************************************************************************************
        ok: [local] => {
            "msg": "Maria,July,John,Simon"
        }
        
        PLAY RECAP    ****************************************************************************************************************
        local                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
        

      【讨论】:

      • 非常感谢您的回复。我考虑改成一个列表,但是在剧本的其他地方使用了字典....
      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多