Search code examples
listdictionaryansiblekey-value

How to create new key: value items and add them to an existing list?


*This is an Ansible question *

Here is my list:

  userdata.list:
  - ClassType: Full Time
    FirstName: Grace
    LastName: Higgins
    Username: g.higgins
  - ClassType: Part Time
    FirstName: Robert
    LastName: Miller
    Username: robmil
  - ClassType: Flexi
    FirstName: Jeffrey
    LastName: Keller
    Username: jeff.k

I want to append the following values to the existing list, looping for each user:

EmailAddress: {{ Username }} append to '@gmail.com'
OtherAddresses: primary:{{ Username }}@gmail.com,secondary:{{ Username }}@outlook.com
Registered: Yes

Expected output:

  userdata.list:
  - ClassType: Full Time
    FirstName: Grace
    LastName: Higgins
    Username: g.higgins
    EmailAddress: [email protected]
    OtherAddresses: primary:[email protected],secondary:[email protected]
    Registered: Yes
  - ClassType: Part Time
    FirstName: Robert
    LastName: Miller
    Username: robmil
    EmailAddress: [email protected]
    OtherAddresses: primary:[email protected],secondary:[email protected]
    Registered: Yes
  - ClassType: Flexi
    FirstName: Jeffrey
    LastName: Keller
    Username: jeff.k
    EmailAddress: [email protected]
    OtherAddresses: primary:[email protected],secondary:[email protected]
    Registered: Yes

How do I create the dictionary to append the three new key: values, and loop for each user to produce the above output?

This is my current playbook:

- hosts: localhost
  tasks:
    - read_csv:
        path: /var/lib/awx/projects/file/creation.csv
        # key: FirstName 
        fieldnames: FirstName,LastName,ClassType
        delimiter: ','
      register: userdata

    - debug:
        var: userdata.list

Solution

  • Given the mre data

      userdata:
        - Username: g.higgins
        - Username: robmil
        - Username: jeff.k
    

    Use Jinja and create the dictionary update

      update: |
          {% filter from_yaml %}
          {% for user in  userdata|map(attribute='Username') %}
          - EmailAddress: {{ user }}@gmail.com
            OtherAddresses: 'primary:{{ user }}@gmail.com,secondary:{{ user }}@outlook.com'
            Registered: 'Yes'
          {% endfor %}
          {% endfilter %}
    

    gives

      update:
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
    

    zip and combine the items of the lists

        - set_fact:
            userdata: "{{ userdata|zip(update)|map('combine') }}"
    

    Example of a complete mre playbook for testing

    shell> cat pb.yml
    - hosts: localhost
    
      vars:
    
        userdata:
          - Username: g.higgins
          - Username: robmil
          - Username: jeff.k
    
        update: |
          {% filter from_yaml %}
          {% for user in  userdata|map(attribute='Username') %}
          - EmailAddress: {{ user }}@gmail.com
            OtherAddresses: 'primary:{{ user }}@gmail.com,secondary:{{ user }}@outlook.com'
            Registered: 'Yes'
          {% endfor %}
          {% endfilter %}
    
      tasks:
    
        - debug:
            var: update
    
        - set_fact:
            userdata: "{{ userdata|zip(update)|map('combine') }}"
        - debug:
            var: userdata
    

    gives

    shell> ansible-playbook pb.yml
    
    PLAY [localhost] ******************************************************************************
    
    TASK [debug] **********************************************************************************
    ok: [localhost] => 
      update:
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
    
    TASK [set_fact] *******************************************************************************
    ok: [localhost]
    
    TASK [debug] **********************************************************************************
    ok: [localhost] => 
      userdata:
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
        Username: g.higgins
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
        Username: robmil
      - EmailAddress: [email protected]
        OtherAddresses: primary:[email protected],secondary:[email protected]
        Registered: 'Yes'
        Username: jeff.k
    
    PLAY RECAP ************************************************************************************
    localhost: ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0