Dynamic inventory, empty group with children

Hello list,

I’m working on a dynamic inventory script for our Ansible deployment. Mostly we’re going to be dealing with clusters of machines, so from our side we’re grouping hosts into the cluster they’ll be in and each host of a cluster has the same set of Ansible variables pushed to it.

These groups of clusters then need to be assigned to the type of cluster they are in Ansible so we run the correct playbook against them - lets say we have clusters of layer 4 and layer 7 loadbalancers and some HA Varnish boxes, so we’d have three Ansible groups “l4”, “l7” and “varnish” and these would get assigned appropriate Ansible roles. Since each cluster should get the same set of variables, it made sense to me that these should go into group_vars, then each host may or may not have individual host_vars.

This is what my dynamic inventory script is currently spitting out (excuse the random names, I auto-generated the test data from /usr/share/dict/words!): http://p.rig.gr/view/6472db0c

You can see that I’ve got the cluster groups at the top level, but then I’m trying to group these within Ansible:

    "varnish": {
        "children": [
            "turbinate80",
            "roofgarden90"
        ]
    }

This way, I know that the clusters "turbinate80" and "roofgarden90" (which both contain two hosts each) are Varnish boxes and should run the Varnish role. The hosts inside those groups will get their associated group_vars, then pull in any host vars from the _meta bit (currently empty).

What actually happens is that the 'empty' varnish group (and l4/l7) is being picked up as a host in it's own right, rather than as just a group:

(env)[dane@shrike ...nsible/spire]% ansible all -i spire.py --list-hosts
    192.168.0.131
    192.168.0.132
    192.168.0.115
    192.168.0.116
    192.168.0.130
    192.168.0.129
    l7
    192.168.0.15
    192.168.0.16
    192.168.0.25
    192.168.0.26
    l4
    webcel

(env)[dane@shrike …nsible/spire]% ansible l4 -i spire.py --list-hosts

l4

192.168.0.131

192.168.0.132

Now, I can move stuff around to make this work (getting rid of group_vars and dumping everything under _meta, even though this will duplicate some stuff), but I’m wondering if there’s a way to do what I’m after (group of groups, I guess) or if I’m just approaching this in the wrong way?

Thanks

Dane

I suspect the code is looking for a “hosts” entry in the JSON, and it’s not there. Can you try adding an empty “hosts” array in that group response?

That was it! Seems to be working how I want it to now. Many thanks!

Dane