Hi Christopher,

Am trying to work on something where the listdisks module can perfectly 
fit, do you mind sharing the code for listdisks module? 

On Friday, January 17, 2014 at 1:33:18 PM UTC-8, Christopher O'Connell 
wrote:
>
> Hello List,
>
> I understand that a decision has been made to remove include + with_items, 
> and I am not trying to directly revisit that decision. What I am trying to 
> figure out is how to effectively replace such constructs in our roles. If 
> someone reads this and concludes that I'm approaching my problem entirely 
> wrong, then please pipe up and let me know I'm an idiot.
>
> Consider a custom module called "listdisks" which (as the name suggests), 
> lists information about the physical disks installed in a system (whether 
> they're formatted and mounted, or not). Example output:
>
> {
>     "changed": false,
>     "drives": [
>         {
>             "hasPartitions": true,
>             "name": "sda",
>             "partitions": [
>                 {
>                     "filesystem": "ext3",
>                     "mount": "/boot",
>                     "name": "1",
>                     "size": "268",
>                     "sizeUnits": "MB"
>                 },
>                 {
>                     "filesystem": "linux-swap",
>                     "mount": null,
>                     "name": "2",
>                     "size": "8590",
>                     "sizeUnits": "MB"
>                 },
>                 {
>                     "filesystem": "ext4",
>                     "mount": "/",
>                     "name": "3",
>                     "size": "111",
>                     "sizeUnits": "GB"
>                 }
>             ],
>             "size": "120",
>             "sizeUnits": "GB"
>         },
>         {
>             "hasPartitions": false,
>             "name": "sdb",
>             "partitions": [],
>             "size": "2000",
>             "sizeUnits": "GB"
>         }
>     ],
> "item":""
> }
>
> As a simple example of the problem, consider a playbook to simply print a 
> debug message for each existing partition which does not have an identified 
> mount point.
>
> This playbook snippet works without using include or with_items:
>
> - name: get outstanding drives
>   listdisks: unpartitioned=true
>   register: system_disks
> - name: identify unmounted partitions
>   debug: msg="/dev/{{ item[0].name }}{{ item[1].name }} ({{ item[1].size 
> }}{{ item[1].sizeUnits }}) not mounted"
>   when: item[0].hasPartitions == True and item[1].mount == None
>   with_subelements:
>     - system_disks.drives
>     - partitions
>
> Sample output (with some specific domain name information elided):
>
> PLAY [configure ceph systems] 
> ************************************************* 
>
> GATHERING FACTS 
> *************************************************************** 
> ok: [system1232]
> ok: [system1233]
> ok: [system1234]
>
> TASK: [ceph | get outstanding drives] 
> ***************************************** 
> ok: [system1233]
> ok: [system1232]
> ok: [system1234]
>
> TASK: [ceph | identify unmounted partitions] 
> ********************************** 
> skipping: [system1233] => (item=({u'hasPartitions': True, u'sizeUnits': 
> u'GB', u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'MB', u'mount': 
> u'/boot', u'size': u'268', u'name': u'1', u'filesystem': u'ext3'}))
> skipping: [system1232] => (item=({u'hasPartitions': True, u'sizeUnits': 
> u'GB', u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'MB', u'mount': 
> u'/boot', u'size': u'268', u'name': u'1', u'filesystem': u'ext3'}))
> skipping: [system1234] => (item=({u'hasPartitions': True, u'sizeUnits': 
> u'GB', u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'MB', u'mount': 
> u'/boot', u'size': u'268', u'name': u'1', u'filesystem': u'ext3'}))
> ok: [system1233] => (item=({u'hasPartitions': True, u'sizeUnits': u'GB', 
> u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'MB', u'mount': None, 
> u'size': u'8590', u'name': u'2', u'filesystem': u'linux-swap'})) => {
>     "item": [
>         {
>             "hasPartitions": true, 
>             "name": "sda", 
>             "size": "120", 
>             "sizeUnits": "GB"
>         }, 
>         {
>             "filesystem": "linux-swap", 
>             "mount": null, 
>             "name": "2", 
>             "size": "8590", 
>             "sizeUnits": "MB"
>         }
>     ], 
>     "msg": "/dev/sda2 (8590MB) not mounted"
> }
> ok: [system1232] => (item=({u'hasPartitions': True, u'sizeUnits': u'GB', 
> u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'MB', u'mount': None, 
> u'size': u'8590', u'name': u'2', u'filesystem': u'linux-swap'})) => {
>     "item": [
>         {
>             "hasPartitions": true, 
>             "name": "sda", 
>             "size": "120", 
>             "sizeUnits": "GB"
>         }, 
>         {
>             "filesystem": "linux-swap", 
>             "mount": null, 
>             "name": "2", 
>             "size": "8590", 
>             "sizeUnits": "MB"
>         }
>     ], 
>     "msg": "/dev/sda2 (8590MB) not mounted"
> }
> skipping: [system1233] => (item=({u'hasPartitions': True, u'sizeUnits': 
> u'GB', u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'GB', u'mount': 
> u'/', u'size': u'111', u'name': u'3', u'filesystem': u'ext4'}))
> ok: [system1234] => (item=({u'hasPartitions': True, u'sizeUnits': u'GB', 
> u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'MB', u'mount': None, 
> u'size': u'8590', u'name': u'2', u'filesystem': u'linux-swap'})) => {
>     "item": [
>         {
>             "hasPartitions": true, 
>             "name": "sda", 
>             "size": "120", 
>             "sizeUnits": "GB"
>         }, 
>         {
>             "filesystem": "linux-swap", 
>             "mount": null, 
>             "name": "2", 
>             "size": "8590", 
>             "sizeUnits": "MB"
>         }
>     ], 
>     "msg": "/dev/sda2 (8590MB) not mounted"
> }
> skipping: [system1232] => (item=({u'hasPartitions': True, u'sizeUnits': 
> u'GB', u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'GB', u'mount': 
> u'/', u'size': u'111', u'name': u'3', u'filesystem': u'ext4'}))
> skipping: [system1234] => (item=({u'hasPartitions': True, u'sizeUnits': 
> u'GB', u'size': u'120', u'name': u'sda'}, {u'sizeUnits': u'GB', u'mount': 
> u'/', u'size': u'111', u'name': u'3', u'filesystem': u'ext4'}))
>
> PLAY RECAP 
> ******************************************************************** 
> system1232        : ok=3    changed=0    unreachable=0    failed=0   
> system1233        : ok=3    changed=0    unreachable=0    failed=0   
> system1234        : ok=3    changed=0    unreachable=0    failed=0 
>
> This playbook works perfectly. The problem is that it is virtually 
> unreadable. Take a look at just the command to debug information about the 
> unmounted drives:
>
>   debug: msg="/dev/{{ item[0].name }}{{ item[1].name }} ({{ item[1].size 
> }}{{ item[1].sizeUnits }}) not mounted"
>   when: item[0].hasPartitions == True and item[1].mount == None
>   with_subelements:
>     - system_disks.drives
>     - partitions
>
> Simply looking at that command makes very little sense of what it actually 
> does. Furthermore, the when and with_subelements clauses must be repeated 
> for every single item in a long role. In the role I've drawn this example 
> from, I need to partition, format and mount drives newly connected (or 
> reconnected after a drive replacement) to the system and then inform the 
> ceph agent about these devices. At the moment I have about 14 tasks with 
> the ugly when + with_subelements clauses. This wildly violates the 
> principle of "Don't Repeat Yourself", and not just in an abstract way -- 
> the impetus to write this email came after spending nearly 4 hours tracking 
> down a typo in a single one of these repeated clauses. Surely there must be 
> a better way, either already baked into Ansible, or if not, then added to 
> the road map.
>
> On a related note, since updating to the 1.5 working branch, I've noticed 
> a regression using include + when where some of the included tasks also 
> have a when clause. Based on reading this closed bug [
> https://github.com/ansible/ansible/issues/3269] it appears that include + 
> when and an inner when clause should work, but I have not found this to 
> be the case. I haven't spent considerable time trying to debug this since 
> I'm moving away from using include at all and towards really long roles, 
> but if this behavior is being intentionally removed, some documentation 
> seems like a good idea.
>
> All the best,
>
> ~ Christopher
>
> P.S. If the listdisks module seems like something of interest, I'll 
> consider adding it to the ansible-galaxy thingy.
>

-- 
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 post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/4b6bd9f9-c54c-4aad-8a70-f71840040975%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to