Version: Ansible 1.9.4
I'm going to try and describe this as well as a I can. Please comment and
let me know any questions.
I'm trying to design a role that will do the following:
* Get a list of interface IP addresses for each host (minus 'lo' and any
non-active interfaces)
* Use that IP listing to test each IP against a IP subnet(VLAN)
- I have a quick perl script I had written to test this (rc.0 = on same
subnet/VLAN, rc.1 = NOT on the same VLAN/subnet)
- This script also prints to stdout the VLAN/subnet "group name" when
there is a match
* I'd then like to take each subnet written to stdout (not the skipped
items or anything null, obviously)
- Use that list to somehow set facts that could then be used to put hosts
in various host groups based on those subnet names
This sounds simple enough, though I'm not the most advanced Ansible user
and certainly not a Python dev. I've been trying a bunch of approach,
though I appear to be getting farther from a solution lately.
Here is what my vars look like (slightly modified to reveal less):
=====
network_script_packages:
- perl-NetAddr-IP
check_network_script: check-IP-network.pl
check_network_remotedir: /usr/local/bin
network_VLAN_remotedir: /var/cache/ansible-network-vlans
network_VLAN_remotesubdirs:
- primary
- member
network_VLANs:
- vlan_id: 250
vlan_name: VLAN-250
vlan_network: 10.16.250.0/24
vlan_groupname: network-VLAN-250
vlan_description: "Management VLAN"
- vlan_id: 103
vlan_name: VLAN-103
vlan_network: 10.16.3.0/24
vlan_groupname: network-VLAN-103
vlan_description: "Storage VLAN"
- vlan_id: 722
vlan_name: VLAN-722
vlan_network: 172.16.2.0/24
vlan_groupname: network-VLAN-722
vlan_description: "Restricted VLAN"
====
Here is what my tasks look like (keep in mind that I've made a mess of
things trying approaches):
=====
---
- name: NETWORK | Get all host interface IP addresses
shell: "echo {{ hostvars[inventory_hostname]['ansible_' +
item].ipv4.address }}"
register: network_interface_IPs
with_items: ansible_interfaces
changed_when: False
when: "item != 'lo' and {{ hostvars[inventory_hostname]['ansible_' +
item].active }} == True"
- name: NETWORK | Copy network check script
sudo: yes
copy: src={{ check_network_script }} dest={{ check_network_remotedir
}}/{{ check_network_script }} owner=root group=root mode=755
run_once: yes
delegate_to: 127.0.0.1
- name: NETWORK | Determine network membership
command: "{{ check_network_remotedir }}/{{ check_network_script }} {{
item.1 }} {{ item.0.vlan_network }} {{ item.0.vlan_groupname }}"
# command: "{{ check_network_remotedir }}/{{ check_network_script }} {{
item.1.stdout }} {{ item.0.vlan_network }} {{ item.0.vlan_groupname }}"
register: network_VLAN_groups
delegate_to: 127.0.0.1
with_nested:
- network_VLANs
- "{{ network_interface_IPs.results|map(attribute='stdout')|list }}"
# - "{{ network_interface_IPs.results|map(attribute='stdout')|list }}"
# - network_interface_IPs.results
changed_when: "network_VLAN_groups.rc == 0"
failed_when: False
when:
- not((item.1 is undefined) or (item.1 is none) or (item.1|trim ==
''))
# - not((item.1.stdout is undefined) or (item.1.stdout is none) or
(item.1.stdout|trim == ''))
### **** The rest seems to get messy as I obviously get very large
dictionary where getting JUST the stdout entries (perhaps since these are
made up of multiple dictionary from the previous commands)
- name: FACT | Set facts for VLAN membership
set_fact:
"host_VLANS={{ [ item.stdout ] }}"
with_items: network_VLAN_groups.results
when:
- not((item.stdout is undefined) or (item.stdout is none) or
(item.stdout|trim == ''))
- debug: var={{ item }}
with_items: network_VLAN_groups.results
- name: GROUP | Create a group for each VLAN
group_by: key={{ item }}
with_items: network_VLANs.vlan_groupname
# when: network_VLANs.vlan_groupname == true
===============
You can see all of my multiple attempts are learning and getting this
right. I believe i need ideas of a few key pieces (and advice on
approaches):
1. What is the best way to "clean up" a dictionary in such a way that I can
get a simple list (without all the null, undefined, in it)?
2. How can I utilize that simplified list to run the second command (thus
determining VLAN/subnet matches)?
- I've tried a few ways, but they get sloppy and/or don't _seem_ to give
me what I'm looking for.
3. How can I then store this VLAN/subnet 'membership' into something that
can then be used to generate a hostgroup (dynamically would be preferred)?
- I've seen some combo of set_fact with group_by, however I'm in a
situation where systems will have multiple interfaces on various subnet and
thus will need to be members of multiple groups.
I've tried everything from generating files per subnet/VLAN containing
hostnames, but even then, I'm in a situation where I need to be able to add
hosts to a group based on which files they exist in. Yet another
challenge. :)
In any case, I know this is a long post, but I've been banging my head
against this a while, and I think it is time to get some fresh throughs and
approaches as well as some education. Any help is very much appreciated.
Thanks,
Chris
--
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/34d6be3d-f287-49f4-b3c6-3abcdcb08e07%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.