I would also find it useful to be able to define a group as an intersection
of two groups. It's something I've wanted for a while but just haven't
gotten around to submitting a feature request for.

If I use the "hosts: dbservers:&production:&northeast" syntax in N
playbooks, then I have N opportunities to make a typo that will have very
bad consequences (leaving out the & by mistake).

Also, if I was able to define a group called
dbservers_production_northeast, and then I decided to change the definition
of the group, I'd only have to change it in one place. If I use it in N
places, I'd have to go and change dbservers:&production:&northeast in N
places. Yuck.

Relying on the "--limit" argument of ansible-playbook is even more
error-prone: there's a risk of applying the playbook to the wrong hosts
*every time* the playbook is invoked by forgetting the --limit argument.

It would be useful if ansible supported pattern syntax for defining
children groups, so users could do something like this:

[dbservers_production_northeast:children]
dbservers:&production:&northeast



On Thu, Aug 14, 2014 at 6:32 PM, Michael DeHaan <[email protected]> wrote:

> It's not an issue of declarative vs imperative here, but saying "talk to
> these groups".
>
> The children are not technically unions either, they are child
> relationships.
>
>
>
>
> On Thu, Aug 14, 2014 at 5:54 PM, Dominic Bou-Samra <[email protected]>
> wrote:
>
>> Perhaps I am doing it wrongly (thus the idiomatic keyword), but I find
>> that less declarative then being able to define intersections in groups.
>>
>>
>> On Friday, August 15, 2014 3:25:35 AM UTC+10, Michael DeHaan wrote:
>>
>>> "I can create a new a group as a union of other groups (groups of
>>> groups), but AFAIK there's no way to create a new group as the intersection
>>> of other groups."
>>>
>>> Shouldn't be needed in the inventory file, as this is something you can
>>> address using the host spec:
>>>
>>> - hosts: alpha:&beta
>>>
>>> or also
>>>
>>> - hosts: alpha
>>>
>>> with
>>>
>>> ansible-playbook foo.yml --limit beta
>>>
>>> Either of these could be used to apply tags.
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Thu, Aug 14, 2014 at 9:42 AM, Lorin Hochstein <
>>> [email protected]> wrote:
>>>
>>>>
>>>>
>>>> On Thu, Aug 14, 2014 at 7:42 AM, Michael DeHaan <[email protected]>
>>>> wrote:
>>>>
>>>>> "You are right about the intersection of groups - it's a shame you
>>>>> cannot declare hosts like (excuse any syntax issues - code looks funny on 
>>>>> a
>>>>> phone):"
>>>>>
>>>>> Can you elaborate on what you think is missing?  ":children" to define
>>>>> child groups is how that part works, so I'm missing the understanding of
>>>>> what part you find lacking there.
>>>>>
>>>>>
>>>> I can create a new a group as a union of other groups (groups of
>>>> groups), but AFAIK there's no way to create a new group as the intersection
>>>> of other groups.
>>>>
>>>> For instance, if I have a group named "atlanta" and a group named
>>>> "webservers", there's no way to define a group called "atlanta_webservers"
>>>> that refers to the intersection of those two groups. You have to do "hosts:
>>>> atlanta:&webservers" in plays.
>>>>
>>>> Intersections would be really useful because I want to tag my EC2
>>>> instances like:
>>>>
>>>> type=webserver
>>>> env=production
>>>>
>>>> And then define a "production_webservers" group as the intersection of
>>>> these.
>>>>
>>>> Lorin
>>>>
>>>>
>>>>
>>>>
>>>>>
>>>>> On Wed, Aug 13, 2014 at 3:12 AM, Dominic Bou-Samra <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> Hi Lorin,
>>>>>>
>>>>>> Thanks for replying.
>>>>>>
>>>>>> So the above presentation is exactly the solution we had arrived at
>>>>>> in our Ansible spikes. I wish I had seen that 1 week ago :P.
>>>>>>
>>>>>> You are right about the intersection of groups - it's a shame you
>>>>>> cannot declare hosts like (excuse any syntax issues - code looks funny 
>>>>>> on a
>>>>>> phone):
>>>>>>
>>>>>> [staging]
>>>>>> [staging:children]
>>>>>> tag_env_staging
>>>>>>
>>>>>> [transporters]
>>>>>> [transporters:children]
>>>>>> tag_type_transporter
>>>>>>
>>>>>> [staging_transporters]
>>>>>> [staging_transporters:children]
>>>>>> staging
>>>>>> transporters
>>>>>>
>>>>>> And then in your playbook, declare:
>>>>>>
>>>>>> hosts: staging_transporters
>>>>>>
>>>>>>  But perhaps it's better to pass in variables like:
>>>>>>
>>>>>> // configure all staging transporters in us-east-1. Staging inventory
>>>>>> declares group_var with staging param
>>>>>> ansible-playbook -i staging -e zone=us-east-1 transporter.yml
>>>>>>
>>>>>> With transporter.yml looking like:
>>>>>>
>>>>>> - name: Config transporters
>>>>>>   hosts: {{environment}}:&{{zone}}:&transporters
>>>>>>
>>>>>> What do you think of that?
>>>>>>
>>>>>> On Tuesday, August 12, 2014 12:39:26 PM UTC+10, Lorin Hochstein wrote:
>>>>>>>
>>>>>>> Hi Dominic:
>>>>>>>
>>>>>>> To support mixing static with dynamic inventory, have the "hostfile"
>>>>>>> entry in your ansible.cfg point to a directory instead of a file. For
>>>>>>> example, my ansible.cfg contains:
>>>>>>>
>>>>>>> [defaults]
>>>>>>> hostfile = inventory
>>>>>>>
>>>>>>> And my inventory directory looks like this:
>>>>>>>
>>>>>>> inventory/hosts
>>>>>>> inventory/ec2.py
>>>>>>> inventory/ec2.ini
>>>>>>>
>>>>>>> The inventory/hosts file is a static Ansible inventory file. The
>>>>>>> inventory/ec2.py and inventory/ec2.ini are the dynamic inventory parts. 
>>>>>>> You
>>>>>>> can edit ec2.ini to specify which regions you want, the example ec2.ini
>>>>>>> file that ships with ansible is pretty clear on how to do this.
>>>>>>>
>>>>>>> I gave a talk on this topic a few months back, the slides may not
>>>>>>> mean too much without me talking (they're pretty sparse) but here they 
>>>>>>> are:
>>>>>>> http://go-talks.appspot.com/github.com/lorin/camp-devops-tal
>>>>>>> k/talk.slide
>>>>>>>
>>>>>>> You can provision instances using the ec2 module. I recommend that
>>>>>>> you use tags when you do provisioning because ec2.py will automatically
>>>>>>> create groups based on tags. One gotcha here is that ec2.py will cache 
>>>>>>> by
>>>>>>> default, so if you want to launch an instance and then configure it
>>>>>>> immediately after it comes up, you'll need to disable caching before in
>>>>>>> ec2.ini (set cache_max_age=0).
>>>>>>>
>>>>>>> If you want to do "Australian transporters in production", I don't
>>>>>>> think you can actually define a new group as an intersection of groups, 
>>>>>>> so
>>>>>>> you'd have to specify the hosts by explicitly doing the intersection of
>>>>>>> groups:
>>>>>>>
>>>>>>> hosts: australia:&transports:&production
>>>>>>>
>>>>>>> (where "australia", "transports" and "production" are all groups
>>>>>>> that I have assumed you have created via tags).
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Monday, August 11, 2014 3:21:47 AM UTC-4, Dominic Bou-Samra wrote:
>>>>>>>>
>>>>>>>> Hi all,
>>>>>>>>
>>>>>>>> I've been playing with Ansible as a solution to our deployment
>>>>>>>> infrastructure. Our stack is:
>>>>>>>>
>>>>>>>>    - Dozens of "transporters" running on EC2.
>>>>>>>>    - Dozens of "detectors" running on EC2
>>>>>>>>    - Production and staging environments
>>>>>>>>    - Multiple regions (atm US East and Sydney)
>>>>>>>>
>>>>>>>> What I require from Ansible is:
>>>>>>>>
>>>>>>>>    - A dynamic inventory, MIXED IN with a static group
>>>>>>>>    declaration. I would like to be able to refer to my "Australian
>>>>>>>>    transporters in production", as easily as possible. I would like no
>>>>>>>>    IP's/hostnames stored locally (i.e, use EC2.py as a dynamic 
>>>>>>>> inventory).
>>>>>>>>    - Ability to provision new EC2 instances in any region, in any
>>>>>>>>    environment.
>>>>>>>>    - As little duplication as possible.
>>>>>>>>
>>>>>>>> I am struggling with trying to lay my project out so that I can
>>>>>>>> achieve these goals.
>>>>>>>>
>>>>>>>>
>>>>>>>> Could anyone provide me with some suggestions or example layouts,
>>>>>>>> ideally with sample command? Let me know if you need more information 
>>>>>>>> and
>>>>>>>> what I have so far
>>>>>>>>
>>>>>>>  --
>>>>>> 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/fb2e7d05-0664-445a-81a9-
>>>>>> 64c6b2a8ab0e%40googlegroups.com
>>>>>> <https://groups.google.com/d/msgid/ansible-project/fb2e7d05-0664-445a-81a9-64c6b2a8ab0e%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>>  --
>>>>> You received this message because you are subscribed to a topic in the
>>>>> Google Groups "Ansible Project" group.
>>>>> To unsubscribe from this topic, visit https://groups.google.com/d/
>>>>> topic/ansible-project/Ohx3KEYwZdw/unsubscribe.
>>>>>  To unsubscribe from this group and all its topics, 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/CA%2BnsWgym88h0GsehetMbygfPGwzvKJ
>>>>> TkgmNs0fabhmCdgN%2BD8w%40mail.gmail.com
>>>>> <https://groups.google.com/d/msgid/ansible-project/CA%2BnsWgym88h0GsehetMbygfPGwzvKJTkgmNs0fabhmCdgN%2BD8w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>  --
>>>> 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/CACkJihNU1xdY75QXkub2yVBR19XsW
>>>> y7zXJBsbzhu4uWu1GMH4A%40mail.gmail.com
>>>> <https://groups.google.com/d/msgid/ansible-project/CACkJihNU1xdY75QXkub2yVBR19XsWy7zXJBsbzhu4uWu1GMH4A%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  --
>> 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/37de6fe4-748e-444e-be96-1508ded8675c%40googlegroups.com
>> <https://groups.google.com/d/msgid/ansible-project/37de6fe4-748e-444e-be96-1508ded8675c%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>  --
> You received this message because you are subscribed to a topic in the
> Google Groups "Ansible Project" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/ansible-project/Ohx3KEYwZdw/unsubscribe.
> To unsubscribe from this group and all its topics, 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/CA%2BnsWgxy6d2Os1nX0ADQumK%2BRLcjKbqLv_qei7-eDy0%3DR0xqyQ%40mail.gmail.com
> <https://groups.google.com/d/msgid/ansible-project/CA%2BnsWgxy6d2Os1nX0ADQumK%2BRLcjKbqLv_qei7-eDy0%3DR0xqyQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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/CACkJihMfwk%3D9jBENe5WsZsnjNBprGkv82kOQ3g%2BUx660CcSMZg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to