Как получить список имен, разделенных запятыми? - PullRequest
1 голос
/ 21 июня 2020

Это мой список адресов в файле 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» не имеет атрибута «имя»

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Простой фильтр json_query может использоваться для достижения результата.

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

дает

ok: [localhost] => 
  msg: Maria, July, John, Simon
1 голос
/ 21 июня 2020

Фильтр map фактически применяет фильтр к последовательности объектов или ищет атрибут.

Но здесь у вас есть словарь, а не последовательность объектов или объект только с атрибутами.

Для достижения того, что вы ищете, есть два пути:

  1. Если вы придерживаетесь своей фактической структуры YAML, вы можете включить ваш dict обратно в нормализованный список, используя Ansible dict2items filter:

    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. Playbook с использованием 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  
    
...