Loop over facts in playbook

2,371 views
Skip to first unread message

Edgars

unread,
Mar 24, 2015, 6:23:41 AM3/24/15
to ansible...@googlegroups.com
Hi

I have some troubles to understand how to loop over facts in playbook. Suppose I have the following:


ansible node01 -m setup -a 'filter=ansible_devices'
SSH password
:
SU password
[defaults to SSH password]:
node01
| success >> {
   
"ansible_facts": {
       
"ansible_devices": {
           
"sda": {
               
"holders": [],
               
"host": "Serial Attached SCSI controller: VMware PVSCSI SCSI Controller (rev 02)",
               
"model": "Virtual disk",
               
"partitions": {
                   
"sda1": {
                       
"sectors": "204800",
                       
"sectorsize": 512,
                       
"size": "100.00 MB",
                       
"start": "2048"
                   
},
                   
"sda2": {
                       
"sectors": "104650752",
                       
"sectorsize": 512,
                       
"size": "49.90 GB",
                       
"start": "206848"
                   
}
               
},
               
"removable": "0",
               
"rotational": "1",
               
"scheduler_mode": "noop",
               
"sectors": "104857600",
               
"sectorsize": "512",
               
"size": "50.00 GB",
               
"support_discard": "0",
               
"vendor": "VMware"
           
},
           
"sdb": {
               
"holders": [],
               
"host": "Serial Attached SCSI controller: VMware PVSCSI SCSI Controller (rev 02)",
               
"model": "Virtual disk",
               
"partitions": {
                   
"sdb1": {
                       
"sectors": "10469376",
                       
"sectorsize": 512,
                       
"size": "4.99 GB",
                       
"start": "16384"
                   
}
               
},
               
"removable": "0",
               
"rotational": "1",
               
"scheduler_mode": "noop",
               
"sectors": "10485760",
               
"sectorsize": "512",
               
"size": "5.00 GB",
               
"support_discard": "0",
               
"vendor": "VMware"
           
},
           
"sdc": {
               
"holders": [],
               
"host": "Serial Attached SCSI controller: VMware PVSCSI SCSI Controller (rev 02)",
               
"model": "Virtual disk",
               
"partitions": {},
               
"removable": "0",
               
"rotational": "1",
               
"scheduler_mode": "noop",
               
"sectors": "14680064",
               
"sectorsize": "512",
               
"size": "7.00 GB",
               
"support_discard": "0",
               
"vendor": "VMware"
           
}
       
}
   
},
   
"changed": false
}

So there are 3 disks: sda, sdb and sdc. Two of them has partitions, one does not. So I want to loop over all disks and check which disk have partitions and which does not have and then do something about it. I know I can do something like this:

{{ ansible_devices['sda']['partitions'] }}

But when I will run this playbook I will not know neither disk labels nor number of disks.

Any ideas?

Thanks
Edgars

Jonathan Davila

unread,
Mar 24, 2015, 9:37:34 AM3/24/15
to ansible...@googlegroups.com
Hi Edgars,

You want to use ansible's with_dict method of looping. Here is an example of looping through that dict and then a sample conditional for it as well

# This is the sample with_dict loop
   
- debug: msg="The device {{ item.key }} with these partitions {{ item.value.partitions }}"
      with_dict
: ansible_devices

# This msg will only be printed on the condition that a device has no partitions
   
- debug: msg="The device {{ item.key }} has no partitions"
      with_dict
: ansible_devices
     
when: not item.value.partitions

Hopefully that helps you out.

Edgars

unread,
Mar 24, 2015, 11:23:32 AM3/24/15
to ansible...@googlegroups.com
Great!! Thanks a lot!

Edgars

DS

unread,
Nov 14, 2015, 5:34:11 PM11/14/15
to Ansible Project
Hey Guys,

I have the exact same issue where I need to find the drive that does not have any partitions on it.

so I have the exact same output from ansible_devices but I can't figure out how I load the output into ansible so I can run the filter on it

basically i need an output like /dev/sdb  or /dev/sdb or whatever the actual device name is that does not have partitions on it so I can then use that value in a subsequent - command: /usr/sbin//fdisk -l <device> for example - command: /usr/sbin/fdisk -l /dev/sdb

any help will be much appreciated

Thanks

Jonathan Davila

unread,
Nov 16, 2015, 10:34:32 AM11/16/15
to Ansible Project
DS, 

Try this. 

This simple example will print the device name whenever the device has no partitions


- name: Loop facts
  hosts
: localhost
  connection
: local
  tasks
:
   
- name: looping
      debug
:
        msg
: "{{ item.key }}"
     
when: "not {{ item.value.partitions }}"
      with_dict
: ansible_devices

DS

unread,
Nov 16, 2015, 11:40:29 AM11/16/15
to Ansible Project

Hey Jonathan,

Thanks for this.

I've figured it out using the previous examples and some more googleing :)

I got it to execute a shell command which i what I needed it to do:

  - shell: pvcreate /dev/"{{ item.key }}" 
    with_dict: ansible_devices
    when: not item.value.partitions and item.key != "sr0" and item.key != "fd0"

Thanks again
Reply all
Reply to author
Forward
0 new messages