Let's assume the following fictional dictionary with nested lists, 
dictionaries, and strings, of arbitrary depth.:
*domain_definition.yml*
```
---
domain_definition:
        - name: server01
          cluster: cluster0
          port: '8070'
        - name: server11
          cluster: cluster1
          port: '8080'
          workstations:
                  - name: debian1
                    revision: '2016-06-21'
                    url: http://debian1.example.com:9911/2016-06-21
                  - name: ubuntu1
                    revision: '2017-08-16'
                    url: http://ubuntu1.example.com:9912/2017-08-16
        - name: server12
          cluster: cluster2
          port: '8090'
          workstations:
                  - name: debian2
                    revision: '2018-04-15'
                    url: http://debian2.example.com:9921/2018-04-15
                  - name: ubuntu2
                    revision: '2020-01-12'
                    url: http://ubuntu2.example.com:9922/2020-01-12
```
The goal is to extract as efficiently as possible (the original file can be 
quite large) a workstation <url> matching:

   - a workstation os <name> with its <revision>: for instance ubuntu1 
   <--> 2017-08-16
   - only a workstation os <name>: for instance debian2

As you can see from example above, the <workstations> key is not always set.
A major constraint is to avoid "json_query" as it cannot deal properly with 
keys  containing a colon (as it may happen in my real context), last time I 
checked

I unsuccessfully tried different tasks, including the following:
```
- name: Extracting a value of a field deep within a list of complex 
dictionaries when some keys match other values
  hosts:
        - localhost
  strategy: debug
  tasks:
        - name: Including domain_definition
          include_vars: "domain_definition.yml"

        - name: Extracting the OS URL when <os_revision> is known
          vars:
                - os_name: ubuntu1
                - os_revision: 2017-08-16
          debug:
                msg: 
                        "os_url: {{ domain_definition |
                                    selectattr('workstations') |
                                    list |
                                    selectattr('name', 'eq', os_name) |
                                    list |
                                    selectattr('revision', 'eq', 
os_revision) |
                                    map(attribute= 'url') |
                                    first }}"
          ignore_errors: yes

        - name: Extracting the OS URL when <os_revision> is known
          vars:
                - os_name: ubuntu1
                - os_revision: 2017-08-16
          debug:
                msg: 
                        "os_url: {{ domain_definition |
                                    selectattr('workstations.name', 'eq', 
os_name) |
                                    list |
                                    selectattr('workstations.revision', 
'eq', os_revision) |
                                    map(attribute= 'workstations.url') |
                                    first }}"
          ignore_errors: yes

        - name: Extracting the OS URL when <os_revision> is unknown
          vars:
                - os_name: debian2
          debug:
                msg: 
                        "os_url: {{ domain_definition |
                                    selectattr('workstations') |
                                    list |
                                    selectattr('name', 'eq', os_name) |
                                    map(attribute= 'url') |
                                    first }}"
          ignore_errors: yes

        - name: Extracting the OS URL when <os_revision> is unknown
          vars:
                - os_name: debian2
          debug:
                msg: 
                        "os_url: {{ domain_definition |
                                    selectattr('workstations.name', 'eq', 
os_name) |
                                    map(attribute= 'workstations.url') |
                                    first }}"
          ignore_errors: yes
```
I always get the error msg: 'dict object' has no attribute 'workstations'.

Any suggestion?

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/de8ac1bb-011e-4e1b-8319-3a776d86d4ffn%40googlegroups.com.

Reply via email to