Sounds like you need to address the limitations of your API in your the
inventory script, if it's returning a page full of data, just walk through
the pages, and cache if need be.

Anyway, this is really a topic for ansible-devel, since this is development
related.

I should say, if you want your script to respond to environment variables
it of course can.  for instance, if you were using ACME_FOO_CLOUD you might
have it filter by paying attention to a ACME_FOO_CLOUD_REGION variable.

This is all 100% up to you.

Also, the aforementioned tooling should really give proper credit for it's
origins as we invented host selectors for Func and that's where they came
from :)




On Fri, Dec 13, 2013 at 12:46 PM, E.C. Raymond <[email protected]> wrote:

> Hi Matt,
>
> I appreciate your help, and I do understand what you are explaining.  My
> inventory script does not return all my hosts with all respective groups.
>  This is a limitation based on the number of hosts and how the api outputs
> a query on our end.  I understand that ansible expects the inventory to
> return all hosts, but I was trying to circumnavigate the ansible call, and
> be able to pass through the group from the command arguments to get only a
> limited number of hosts.
>
> Thanks again.
>
>
> On Friday, December 13, 2013 9:39:33 AM UTC-8, Matt Martz wrote:
>
>> I really do believe you are missing what we are saying.  Either that or I
>> am just uber confused about what you are doing that we are not providing
>> you with an explanation for.
>>
>> You do not need to limit the output of the inventory script itself, you
>> do that filtering with the ansible/ansible-playbook commands. Your
>> inventory should return *all* groups and hosts.  The ansible and
>> ansible-playbook commands offer the ability to filter the list of
>> groups/hosts that you want to run the tasks on.
>>
>> Then you would so something like:
>>
>> ansible webserver -i /path/to/inventory.py -m ping
>>
>> In that example, the 2nd argument there is the group you are targeting,
>> or it can be a host, a pattern...
>>
>> or
>>
>> ansible-playbook -i /path/to/inventory.py --limit web server
>> my-playbook.py
>>
>> In this example --limit allows you to limit to a group, or hosts, etc…
>> that you want to target
>>
>>
>> Also note that the ansible command also offers -l/--limit
>>
>> You might want to look at http://www.ansibleworks.
>> com/docs/intro_adhoc.html also
>>
>> --
>> Matt Martz
>> [email protected]
>>
>> On December 13, 2013 at 11:29:39 AM, E.C. Raymond ([email protected])
>> wrote:
>>
>> Thanks for all the help everyone.  The GROUP os env variable being passed
>> just makes for a confusing simple one-liner call.  I was hoping to find
>> something similar to how saltstack can do a in-line list call with -L: salt
>> -L web1,web2,web3 test.ping
>>
>> I guess I will put that in as a feature request.
>>
>> On Thursday, December 12, 2013 5:07:22 PM UTC-8, Matt Martz wrote:
>>>
>>>  When using ansible-playbook, if you *only* wanted to operate on that
>>> group and your inventory script can limit it, you basically run it like:
>>>
>>>  GROUP=webservers ansible-playbook -i /path/to/custom_inventory.py
>>> my-playbook.yml
>>>
>>>  In my-playbook.yml you specify “hosts: webservers” or “hosts: all”.
>>>
>>>  Generally, I just wouldn’t limit the output from the inventory script,
>>> and let the inventory script return *all* hosts and groups, still with the
>>> correct data structure with host groups.
>>>
>>>  From a one-liner, it would look like:
>>>
>>>  GROUP=webservers ansible webservers -i /path/to/custom_inventory.py -m
>>> ping
>>>
>>>  or
>>>
>>>  GROUP=webservers ansible all -i /path/to/custom_inventory.py -m ping
>>>
>>>  In the above one-line examples, using web servers or all would give you
>>> the same thing, since you are limiting the response from your inventory
>>> script to only the webservers group.
>>>
>>>  If you just returned all hosts and groups, you could skip the
>>> GROUP=whatever part and just do something like:
>>>
>>>  ansible webservers -i /path/to/custom_inventory.py -m ping
>>> --
>>> Matt Martz
>>> [email protected]
>>>
>>> On December 12, 2013 at 6:49:35 PM, E.C. Raymond ([email protected])
>>> wrote:
>>>
>>>  This is exactly what my inventory/cmdb does already.  At the heart of
>>> my custom script is basically a call that looks similar to ansibles output,
>>> but I also format into a json dictionary:
>>>
>>> From custom_inventory.py script, i have a function called
>>> get_hosts_by_role and it looks like:
>>>
>>> # /usr/local/bin/lookup_hosts group webservers
>>>     web1
>>>     web2
>>>     web3
>>>
>>>
>>> Ansible Inventory plugin:
>>>
>>>  (ans-prod)/srv/ansible$ ./plugins/inventory/custom_inventory.py --list
>>> {
>>>     "webservers": {
>>>         "hosts": [
>>>             "web1",
>>>             "web2",
>>>             "web3",
>>>             "web4"
>>>         ]
>>>     }
>>> }
>>>
>>> This works if I use the GROUP="webservers", then os.gentenv('GROUP') and
>>> run the custom script manually with --list.  But if I were to use a
>>> playbook or even a one-liner, how would I specify the group "webservers"
>>> and be able to pass that to the inventory or ansible to look up?
>>>
>>> I feel like I am asking the same question over and over.
>>>
>>> On Thursday, December 12, 2013 4:15:53 PM UTC-8, Matt Martz wrote:
>>>>
>>>>  Maybe I am making too much of an assumption here.  But generally you
>>>> would store the host groupings in some way in your custom inventory/cmdb.
>>>>
>>>>  Then, using that information (hosts + groupings) you return something
>>>> from your inventory script that looks similar to
>>>> http://www.ansibleworks.com/docs/developing_inventory.html#id2 where
>>>> the top level keys of the json response are the groups, that contain a list
>>>> of hosts.
>>>>
>>>>  Also, you can have hosts in more than a single group.
>>>>
>>>>  But from my previous response, if you need to pass info into your
>>>> inventory, you need to use environment variables.
>>>>
>>>> --
>>>> Matt Martz
>>>> [email protected]
>>>>
>>>> On December 12, 2013 at 6:03:51 PM, E.C. Raymond ([email protected])
>>>> wrote:
>>>>
>>>>
>>>>>  When I run ansible in one-liner mode:
>>>>>
>>>>> ansible webserver --list-hosts; ansible webserver -m ping
>>>>>
>>>>> How am I able to pass the "webserver" argument to the inventory script?
>>>>>
>>>>> I am not understanding from the documentation and examples of how the
>>>>> execution flow works with ansible and inventory scripts.
>>>>>
>>>>> The documentation seems to indicate that the inventory needs to dump
>>>>> ALL hosts and groups, and then to create a dictionary grouping the host 
>>>>> -->
>>>>> group, and then dumps the group and hosts.  When running:
>>>>>
>>>>> ./my_custom_inventory --list
>>>>>
>>>>> there is no grouping passed to identify which servers should be stored
>>>>> together.  I apologize for the confusing post, but I am just trying to
>>>>> understand how I should pass arguments to my custom api calls and return
>>>>> back something that ansible will understand.  The closest I am able to
>>>>> getting something similar to what I want is from the ec2 inventory 
>>>>> example.
>>>>>  Using the region to help dictate what list to pass into the call to 
>>>>> gather
>>>>> the list of hosts.
>>>>>
>>>>  --
>>>> 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].
>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>
>>>>   --
>>> 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].
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>>   --
>> 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].
>>
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>  --
> 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].
> For more options, visit https://groups.google.com/groups/opt_out.
>



-- 
Michael DeHaan <[email protected]>
CTO, AnsibleWorks, Inc.
http://www.ansibleworks.com/

-- 
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].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to