Nested loop with second loop depending on first item

Hi,

I'm trying to do a special kind of nesting loop, using the item of the
first loop in the second loop:

- name: Prepare OSDs
  shell: ceph-deploy osd prepare {{ item[0] }}:{{ item[1] }}
  with_nested:
    - groups['ceph-ODSs']
    - hostvars[item[0]]['disks']

I'm not sure if this is possible, but I can't find any workaround.

Have a look at the with_subelements lookup plugin.

Le 13/12/11 11:18, Serge van Ginderachter claviotta :

Have a look at the with_subelements lookup plugin.

I know very well with_subelements, but in this case I'm not trying to
access a subelement in the first element, I'm trying to use the first
element to access an entry in an other dictionary.

I don't think with_subelements is well suited to this case. Do you
have an example ?

Before we dive into a technical solution let me understand your use case and what you are modelling a bit better.

So groups[‘ceph-ODSs’] would be all machines in the ceph-ODSs group.

I’d probably just define a variable like “disks” on the group, but I’m unclear why that wouldn’t work in your case.

I could probably understand more if I could see how “disks” differs between hosts.

Le 13/12/11 08:05, Michael DeHaan claviotta :

Before we dive into a technical solution let me understand your use case
and what you are modelling a bit better.

So groups['ceph-ODSs'] would be all machines in the ceph-ODSs group.

That's right.

I'd probably just define a variable like "disks" on the group, but I'm
unclear why that wouldn't work in your case.

I could probably understand more if I could see how "disks" differs between
hosts.

It's simple, my Ceph OSD (storage nodes) are all différents. Some
contains 2 hard drives (sdb, sdc), some contains 10 (sdb, sdc, sdd…).
"disks" is a list of hard drives, which is different from one host to
another. ex:

  inventory

osd0
osd1

[ceph-OSDs]
osd0
osd1

  host_vars/osd0

disks:
  - sdb

  host_vars/osd1

disks:
  - sdb
  - sdc

In my nested loop, I need to loop over the Ceph Storage nodes and
their hard drive. The hard drive list is an host variable (accessible
by hostvars[osd0]['disks'], for instance).

With the example above, I want my playbook to do :

ceph_deploy osd prepare osd0:sda
ceph_deploy osd prepare osd1:sda
ceph_deploy osd prepare osd1:sdb

I think you probably want this:

  • shell: echo {{ item.0 }}-{{item.1 }}
    with_together:
  • groups[‘ceph-OSDs’]
  • disks

this will print for the first host

osd0-sdb
osd1-sdb

and for the second host

osd0-sdb
osd0-sdc
osd1-sdb
osd1-sdc

Let me know if that works for you and if I’m missing something we’ll figure it out.

Thanks!

Hum, this is not what I'm looking for, because my action is not
executed on the ceph-OSDs, but on another host (a centralized admin
node).
In this playbook, I'm not doing anything on the ceph-OSDs.

What I need to do (only on my admin node) is :

- shell: echo {{ item.0 }}-{{ item.1 }}
  with_nested:
    - groups['ceph-OSDs']
    - the disks of the current item in the "groups['ceph-OSDs']" loop

I want it to print (on the admin host) :

osd0-sdb
osd1-sdb
osd1-sdc

Do you understand the problem ? I don't see any workaround. This is a
matter of syntax.

Le 13/12/11 08:24, Michael DeHaan claviotta :

After reading nested.py and realizing it would never do what I wanted,
I found a workaround.

On each ceph-ODSs :

- delegate_to: "{{ ceph-admin }}"
  shell: echo {{ inventory_hostname }}-{{ item }}
  with_items: disks

Anyway, thank you very much for your help :slight_smile:

Le 13/12/11 14:53, Guillaume Subiron claviotta :

Guillaume,

I have exactly the same problem with setting up OSD via ADM host and I was pulling my hair for 2 days.
I don’t know how to thank you:)

Hi I have seen ur resolutions in this page i.

I am also having the same issue with nested loops .
my scenario is nothing but th__e matrix multiplication of n*n__
Can some one please suggest how to implement it using ansible loops along with adding conidition of count ++ and count –

Hmm, would the cartesian lookup help you?

https://docs.ansible.com/ansible/latest/plugins/lookup/cartesian.html

actually use the product filter instead of cartesian lookup