I don't know what with_subelements: is but here is what I know of
with_nested that works for me - this is creating a Oracle
databse server...with the database name...which some of these files from
db_create_files_1 needs the ora_sid to replace it inside the files, that is
all mapped out with the when if the inventory_host name equals the host in
the var then use that ora_sid.    If this helps


:

- name: Create scripts for database configuration files on the target
without ORA_SID placing in the root of DBcreate
  ansible.builtin.template:
    src: "{{ Oracle_Template_Dir }}/create/{{ item.0.file_name }}"
    dest: "{{ DB_Create_Dir }}/{{ item.0.file_name | replace('.j2', '')
}}.{{ item.0.ext }}"
    mode: 'a+x'
  with_nested:
    - "{{ db_create_files_1 }}" # <-- for the vars with item.0.x pulling
from this entry in the variable file
    - "{{ specific_hosts_conf }}" # <-- for the vars with item.1.x pulling
from this entry in the variable file
  when: (item.1.ora_sid|upper not in Database_Name.stdout) and
(inventory_hostname == item.1.host)



Defined in the variable...
specific_hosts_conf:
- {host: 'servername.domain.com', specific_ip: '192.168.1.46', specific_host:
'servername.domain.com', ora_sid: 'DogsDB', RCATHOST_IP: '192.168.1.49',
db_domain: 'domain.com'}
db_create_files_1: #ora_stage/DBcreate/
- {file_name: 'profile19c_new.j2', ext: ''}
- {file_name: 'cr_temp_profile.j2', ext: 'sql'}
- {file_name: 'cron.j2', ext: 'header'}
- {file_name: 'tnsnames.j2', ext: 'ora'}
- {file_name: 'sqlnet.ora.j2', ext: 'default'}
- {file_name: 'init.j2', ext: 'new'}
- {file_name: 'listener.j2', ext: 'ora'}

On Mon, Jul 17, 2023 at 9:58 PM Todd Lewis <[email protected]> wrote:

> Is it loop behaviour in general that's confusing, or the effect of
> *with_subelements*? Remember that the *with_** construct is implemented
> as a *lookup*. Once you understand what the *subelements* *lookup* does,
> then this specific loop should make more sense.
>
> Here's a playbook and its output log, using a your data with some
> modifications to make it easier to see what's going on. I've added a '
> *user4*' with no '*keys*' to show how to handle that case, too.
>
> The first *debug* task loops they same way your playbook loops, using
> *with_subelements*.
>
> The second *debug* task doesn't loop, but invokes the *subelements*
> *lookup* directly, with parameters identical to those passed to the prior
> task's *with_subelements*. The *subelements* *lookup* produces a list
> which, not surprisingly, matches what the prior task looped over.
>
> [utoddl@tango ansible]$ *cat test-subelements2.yml*
> ---
> - name: Demonstrate subelements
>   hosts: localhost
>   gather_facts: false
>   vars:
>     engineers:
>       - username: user1
>         state: present
>         keys:
>           - user1keyA
>           - user1KeyB
>       - username: user2
>         state: present
>         keys:
>           - user2keyA
>       - username: user3
>         state: present
>         keys:
>           - user3keyA
>       - username: user4
>         state: present
>         note: Look! No 'keys'!
>   tasks:
>     - name: *Show subelements one per loop*
>       ansible.builtin.debug:
>         msg: "{{ item }}"
>       with_subelements:
>         - "{{ engineers }}"
>         - keys
>         - {'skip_missing': true}
>
>     - name: *Show the same subelements all in one go*
>       ansible.builtin.debug:
>         msg: "{{ *lookup('subelements', engineers, 'keys', {'skip_missing': 
> true})* }}"
> [utoddl@tango ansible]$ *ansible-playbook test-subelements2.yml*
>
> PLAY [Demonstrate subelements] 
> *********************************************************
>
> TASK [*Show subelements one per loop*] 
> ***************************************************
> ok: [localhost] => (item=[{'username': 'user1', 'state': 'present'}, 
> 'user1keyA']) => {
>     "msg": [
>         {
>             "state": "present",
>             "username": "user1"
>         },
>         "user1keyA"
>     ]
> }
> ok: [localhost] => (item=[{'username': 'user1', 'state': 'present'}, 
> 'user1KeyB']) => {
>     "msg": [
>         {
>             "state": "present",
>             "username": "user1"
>         },
>         "user1KeyB"
>     ]
> }
> ok: [localhost] => (item=[{'username': 'user2', 'state': 'present'}, 
> 'user2keyA']) => {
>     "msg": [
>         {
>             "state": "present",
>             "username": "user2"
>         },
>         "user2keyA"
>     ]
> }
> ok: [localhost] => (item=[{'username': 'user3', 'state': 'present'}, 
> 'user3keyA']) => {
>     "msg": [
>         {
>             "state": "present",
>             "username": "user3"
>         },
>         "user3keyA"
>     ]
> }
>
> TASK [*Show the same subelements all in one go*] 
> *****************************************
> ok: [localhost] => {
>     "msg": [
>         [
>             {
>                 "state": "present",
>                 "username": "user1"
>             },
>             "user1keyA"
>         ],
>         [
>             {
>                 "state": "present",
>                 "username": "user1"
>             },
>             "user1KeyB"
>         ],
>         [
>             {
>                 "state": "present",
>                 "username": "user2"
>             },
>             "user2keyA"
>         ],
>         [
>             {
>                 "state": "present",
>                 "username": "user3"
>             },
>             "user3keyA"
>         ]
>     ]
> }
>
> PLAY RECAP 
> ************************************************************************************************
> localhost                  : ok=2    changed=0    unreachable=0    failed=0   
>  skipped=0    rescued=0    ignored=0
>
> Do let us know if something is still unclear.
> --
> Todd
>
> On 7/16/23 3:30 AM, Werner van der Merwe wrote:
>
> Hi,
>
> This code works, I just don't understand the indexing and loop behaviour.
> Hoping someone can help me understand the indexing, and why the variables
> are equal to the values.
>
> Here the code:
>
> ```
> engineers:
>   - username: user1
>     state: present
>     keys:
>       - ssh-rsa AAAAB3Nza....
>       - ssh-rsa AAAAB3Nza....
>   - username: user2
>     state: present
>     keys:
>       - ssh-rsa AAAAB3NzaC....
>   - username: user3
>     state: present
>     keys:
>       - ssh-rsa AAAAB3NzaC1....
> ```
>
> and I have a working code snippet:
> ```
> - name: Manage authorized keys
>   authorized_key:
>     user: "{{ item.0.username }}"
>     state: present
>     key: "{{ item.1 }}"
>   with_subelements:
>     - "{{ engineers }}"
>     - keys
>   loop_control:
>     loop_var: item
> ```
>
>
> --
> 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/7f4ea37c-ce57-220a-d42d-2f6bd52173d0%40gmail.com
> <https://groups.google.com/d/msgid/ansible-project/7f4ea37c-ce57-220a-d42d-2f6bd52173d0%40gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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/CA%2Brg-CfS37PtrkEJsA6iAVUirw0u5AG3M1o1afKT%2B9ijiZhmQQ%40mail.gmail.com.

Reply via email to