Hi,

I'm considering of writing a plugin, but would need some pointers/tips 
what's the best way to achieve what I'm after.

Basically I do a lot of firewall rules for host to host connections (based 
on groups), so I've currently done something like:


- source: "{{ groups.mygroup | map('extract', hostvars, 'my_ip_variable') | 
list }}"

The syntax is quite verbose, but there's a bigger problem that accessing 
hostvars like that is extremely slow when working with 1000+ hosts. So I 
though I could construct a dict that would contain my groups and the 
required variables, something like this:

my_net_vars:
  mygroup:
    my_ip_variable: [10.0.0.1]
    my_other_ip_variable: [192.168.0.1]

which would allow me to have simplified usage just with:
- source:"{{ my_net_vars.mygroup.my_ip_variable }}"

There seems to be a few alternatives I've been looking in to:

1) lookup plugin

since lookup plugins already have the variable information available, it 
would be rather simple to construct this type of information from that. 
Then I could just set 
my_net_vars: "{ lookup('my plugin') }}"

in my group_vars/all. The issue here is still the slowness. The lookup 
seems to happen for every host every time a variable is used which results 
in a lot of calls. I managed to get it faster by manually generating a json 
that would be exactly the same for each host, but in practice this would 
mean I would need to implement my own caching that would live either "for 
the current ansible run" or then I would need to look for ways to detect if 
the inventory has changed. Would there be anything in ansible that could be 
used for this kind of caching?

2) vars plugin

This would probably suit, but I'm struggling to get information about hosts 
and their groups. What would be an easy way to have that information 
available for a variable plugin, since although it gets groups and hosts as 
entities, my play might be limited to a specific set?

3) inventory plugin
I'm already relying on the ini inventory plugin and host_group_vars plugin, 
so would it then just to make sense to subclass this one and inject my own 
variables here instead?

I can expect my variables be available in ansible base 
dir/host_vars/hostname/host.yml in a non-templated format, so I could even 
parse these files to make it possibly quicker, unless those are available 
as cached somehow. 

Also constructed plugin sounded nice, but doesn't seem to work if the 
variables come from a variable plugin such as the built in host_group_vars, 
as the variables are not visible at that point. So any suggested 
approaches? Or other alternatives to these ones? I realize if I wrote an 
inventory plugin, that could be extended later on to cover multiple 
inventory sources I might have in the future, but for now I'm using 
something that's readily available.

-- 
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/e85f8399-553c-4380-9d7b-02e4f1fa7304%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to