Patrick
Patrick

Reputation: 628

Adding field to dict items

Consider the following play. What I am trying to do is add a field, tmp_path which is basically the key and revision appended together to each element in the scripts dict.

---
- hosts: localhost
  connection: local
  gather_facts: no
  vars:
    scripts:
      a.pl:
        revision: 123
      b.pl:
        revision: 456
  tasks:
     - with_dict: "{{ scripts }}"
       debug:
         msg: "{{ item.key }}_{{ item.value.revision }}"
#     - with_items: "{{ scripts }}"
#       set_fact: {{item.value.tmp_path}}="{{item.key}}_{{item.value.revision}}"
#     - with_items: "{{ scripts }}"
#       debug:
#         msg: "{{ item.value.tmp_path }}"
...

Obviously the commented code doesn't work, any idea how I can get this working? Is it possible to alter the scripts dict directly, or should I somehow be creating a new dict to reference instead?

By the way welcome to correct the terminology for what I am trying to do.

Upvotes: 2

Views: 529

Answers (1)

Patrick
Patrick

Reputation: 628

OK, I think I got a solution (below), at least to let me move forwards with this. Disadvantages are it has removed the structure of my dict and also seems a bit redundant having to redefine all the fields and use a new variable, If anyone can provide a better solution I will accept that instead.

---
- hosts: localhost
  connection: local
  gather_facts: no
  vars:
    scripts:
      a.pl:
        revision: 123
      b.pl:
        revision: 456
  tasks:
     - with_dict: "{{ scripts }}"
       debug:
         msg: "{{ item.key }}_{{ item.value.revision }}"
     - with_dict: "{{ scripts }}"
       set_fact:
         new_scripts: "{{ (new_scripts | default([]))  + [ {'name': item.key, 'revision': item.value.revision, 'tmp_path': item.key ~ '_' ~ item.value.revision}] }}"
#     - debug:
#         var: x
#     - with_dict: "{{ scripts }}"
     - with_items: "{{ new_scripts }}"
       debug:
         msg: "{{ item.tmp_path }}"
...

BTW credit to the following question which pointed me in the right direction: Using Ansible set_fact to create a dictionary from register results

Upvotes: 1

Related Questions