How to extract a specific value from input list ?

38 views
Skip to first unread message

dudu.c...@gmail.com

unread,
Aug 9, 2022, 2:07:32 AM8/9/22
to Ansible Project

I have the following input list

postgres_create_users:
        - {role: user1 , password: password1 }
        - {role: user2, password: password2}
        - {role: user3, password: password3}
        - {role: user4, password: password4}

 

As part of J2 template file I need to extract the password of user4  - How this can be done ?

 

insights.jdbc.password={{ postgres_create_users ??? }}

 

Thank you

Vladimir Botka

unread,
Aug 9, 2022, 6:49:20 AM8/9/22
to dudu.c...@gmail.com, ansible...@googlegroups.com
On Mon, 8 Aug 2022 23:07:32 -0700 (PDT)
"dudu.c...@gmail.com" <dudu.c...@gmail.com> wrote:

> insights.jdbc.password={{ postgres_create_users ??? }}

Create a dictionary. The best choice might be the same place the list
*postgres_create_users* comes from. For example,

shell> cat group_vars/all/postgres_create_users.yml
postgres_create_users:
- {role: user1, password: password1}
- {role: user2, password: password2}
- {role: user3, password: password3}
- {role: user4, password: password4}
pcu_dict: "{{ postgres_create_users|
items2dict(key_name='role',
value_name='password') }}"

gives

pcu_dict:
user1: password1
user2: password2
user3: password3
user4: password4

The usage is trivial. For example, the template

shell> cat templates/server.xml.j2
insights.jdbc.password="{{ pcu_dict.user4 }}"

and the playbook

shell> cat pb.yml
- hosts: localhost
tasks:
- debug:
msg: "{{ lookup('template', 'server.xml.j2') }}"

gives (abridged)

shell> ansible-playbook pb.yml

TASK [debug]
**************************************
ok: [localhost] => msg: |-
insights.jdbc.password="password4"

--
Vladimir Botka

Walter Rowe

unread,
Aug 9, 2022, 8:09:41 AM8/9/22
to Ansible Project
You also can use json_query. 

---
- name: test
  hosts: localhost
  become: no
  gather_facts: no
  vars:
    postgres_create_users:
      - {role: user1, password: password1}
      - {role: user2, password: password2}
      - {role: user3, password: password3}
      - {role: user4, password: password4}
    my_user: user4
  tasks:
    - debug:
        msg: "{{ (postgres_create_users | json_query('[?role==`'+my_user+'`]'))[0].password }}"


Note that in my jinja2 variable template in the debug statement I insert a variable "my_user" to show that json queries can be dynamic based on a value only known at run-time. Change the value of my_user on the command line and see how it changes the output.

% ansible-playbook foo.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [test] ************************************************************************************************************
TASK [debug] ***********************************************************************************************************
ok: [localhost] => {
    "msg": "password4"
}
PLAY RECAP *************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

% ansible-playbook foo.yml -e my_user=user2
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [test] ************************************************************************************************************
TASK [debug] ***********************************************************************************************************
ok: [localhost] => {
    "msg": "password2"
}
PLAY RECAP *************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
--
Walter Rowe, Chief
Infrastructure Services
Office of Information Systems Management
National Institute of Standards and Technology
United States Department of Commerce

Vladimir Botka

unread,
Aug 9, 2022, 9:01:31 AM8/9/22
to 'Walter Rowe' via Ansible Project
On Tue, 9 Aug 2022 05:09:41 -0700 (PDT)
"'Walter Rowe' via Ansible Project"
<ansible...@googlegroups.com> wrote:

> You also can use json_query.

For example, the template

shell> cat templates/server.xml.j2
insights.jdbc.password="{{ my_pswd }}"

and the task

- debug:
msg: "{{ lookup('template', 'server.xml.j2') }}"
vars:
my_user: user4
my_pswd: "{{ postgres_create_users|
json_query(_query)|first }}"
_query: '[?role==`{{ my_user }}`].password'

gives the same result

Richard Megginson

unread,
Aug 9, 2022, 9:10:54 AM8/9/22
to ansible...@googlegroups.com
Here is a way that
* uses only ansible built-ins (note that json_query is a) in an unsupported collection b) requires python json libraries which may not be available)
* works with every version of jinja2 (EL7 and later controller)

insights.jdbc.password={{ postgres_create_users | selectattr('role', 'match', '^user4$') | map(attribute='password') | first }}

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/cbdebba3-d3b0-455d-ac16-498e773c0c4cn%40googlegroups.com.

Rowe, Walter P. (Fed)

unread,
Aug 9, 2022, 10:13:55 AM8/9/22
to ansible...@googlegroups.com
Nice!

Walter
--
Walter Rowe, Division Chief
Infrastructure Services, OISM
Mobile: 202.355.4123

You received this message because you are subscribed to a topic in the Google Groups "Ansible Project" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ansible-project/Vx1VC0R3nb0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/CALF5A-K13OZu6i%3Dbh8TriR8CDcPVvaOztv88QqcM%2BmBOw0E-Hw%40mail.gmail.com.

Walter Rowe

unread,
Aug 9, 2022, 10:17:46 AM8/9/22
to Ansible Project
Ansible is an amazing tool. So many creative and powerful ways to massage data and get what we want.
--
Walter Rowe, Chief
Infrastructure Services
Office of Information Systems Management
National Institute of Standards and Technology
United States Department of Commerce

Reply all
Reply to author
Forward
0 new messages