nmake / inventory

Use a CSV file as an ansible inventory

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CSV based ansible inventory

Quick start

  1. Clone the repository

  2. Link the repo into the default collection path

mkdir -p ~/.ansible/collections/ansible_collections/nmake
ln -s ~/projects/inventory ~/.ansible/collections/ansible_collections/nmake
  1. Define a nmake_inventory_csv.yaml file:
plugin: nmake.inventory.csv
source: "/full/path/to/inventory.csv"

# add an attribute to each host based on a conditional
compose:
  ansible_become: ansible_network_os == "eos"
  ansible_python_interpreter: python

# build dynamic groups based on csv columns
keyed_groups:
  - key: site
    prefix: site
  - key: ansible_network_os
    prefix: ""
    separator: ""

# allow the csv to contain `vars:xxx` values which reference these
vars:
  ansible_user: "{{ lookup('env', 'ansible_user') }}"
  ansible_password: "{{ lookup('env', 'ansible_password') }}"
  ansible_become_pass: "{{ lookup('env', 'ansible_become_pass') }}"

# add an attribute to each host if it's not in the csv
defaults:
  ansible_become_method: enable
  ansible_connection: network_cli
  ansible_python_interpreter: python


# in case the CSV columns don't match what we need
column_replace:
  os: ansible_network_os
  1. Define the CSV file:

Note:

  • A value in the format of vars:xxx will be replaced with values from the yaml file above
  • A column called groups should contain a space delimited list of groups the host should belong to
  • All other columns will be added as attributes of the host in the inventory
  • See the constructued inventory plugin for details about compose, keyed_groups and groups
host,os,ansible_user,ansible_password,ansible_become_pass,site,groups
nxos101,nxos,vars:ansible_user,vars:ansible_password,vars:ansible_become_pass,my_lab,red blue
nxos102,nxos,vars:ansible_user,vars:ansible_password,vars:ansible_become_pass,my_lab,blue yellow
nxos103,nxos,vars:ansible_user,vars:ansible_password,vars:ansible_become_pass,my_lab,red blue
nxos104,nxos,vars:ansible_user,vars:ansible_password,vars:ansible_become_pass,my_lab,blue yellow
eos10[1:4],eos,vars:ansible_user,vars:ansible_password,vars:ansible_become_pass,my_lab,orange red
vyos10[1:4],vyos,vars:ansible_user,vars:ansible_password,vars:ansible_become_pass,my_lab,orange red
  1. Update the ansible.cfg file to allow the CSV inventory plugin:
[inventory]
enable_plugins = nmake.inventory.csv
  1. Check the inventory
ansible-inventory -i nmake_inventory_csv.yaml --list
{
    "_meta": {
        "hostvars": {
            "eos101": {
                "ansible_become": true,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "eos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "eos102": {
                "ansible_become": true,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "eos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "eos103": {
                "ansible_become": true,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "eos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "eos104": {
                "ansible_become": true,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "eos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "nxos101": {
                "ansible_become": false,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "nxos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "nxos102": {
                "ansible_become": false,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "nxos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "nxos103": {
                "ansible_become": false,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "nxos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "nxos104": {
                "ansible_become": false,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "nxos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "vyos101": {
                "ansible_become": false,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "vyos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "vyos102": {
                "ansible_become": false,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "vyos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "vyos103": {
                "ansible_become": false,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "vyos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            },
            "vyos104": {
                "ansible_become": false,
                "ansible_become_method": "enable",
                "ansible_become_pass": "{{ lookup('env', 'ansible_become_pass') }}",
                "ansible_connection": "network_cli",
                "ansible_network_os": "vyos",
                "ansible_password": "{{ lookup('env', 'ansible_password') }}",
                "ansible_python_interpreter": "python",
                "ansible_user": "{{ lookup('env', 'ansible_user') }}",
                "site": "my_lab"
            }
        }
    },
    "all": {
        "children": [
            "blue",
            "eos",
            "nxos",
            "orange",
            "red",
            "site_my_lab",
            "ungrouped",
            "vyos",
            "yellow"
        ]
    },
    "blue": {
        "hosts": [
            "nxos101",
            "nxos102",
            "nxos103",
            "nxos104"
        ]
    },
    "eos": {
        "hosts": [
            "eos101",
            "eos102",
            "eos103",
            "eos104"
        ]
    },
    "nxos": {
        "hosts": [
            "nxos101",
            "nxos102",
            "nxos103",
            "nxos104"
        ]
    },
    "orange": {
        "hosts": [
            "eos101",
            "eos102",
            "eos103",
            "eos104",
            "vyos101",
            "vyos102",
            "vyos103",
            "vyos104"
        ]
    },
    "red": {
        "hosts": [
            "eos101",
            "eos102",
            "eos103",
            "eos104",
            "nxos101",
            "nxos103",
            "vyos101",
            "vyos102",
            "vyos103",
            "vyos104"
        ]
    },
    "site_my_lab": {
        "hosts": [
            "eos101",
            "eos102",
            "eos103",
            "eos104",
            "nxos101",
            "nxos102",
            "nxos103",
            "nxos104",
            "vyos101",
            "vyos102",
            "vyos103",
            "vyos104"
        ]
    },
    "vyos": {
        "hosts": [
            "vyos101",
            "vyos102",
            "vyos103",
            "vyos104"
        ]
    },
    "yellow": {
        "hosts": [
            "nxos102",
            "nxos104"
        ]
    }
}
  1. Run ansible:
# site.yaml
- hosts: all
  gather_facts: False
  tasks:
  - name: Use the platform facts module for each
    action: "{{ ansible_network_os }}_facts"
    args:
      gather_network_resources:
      - interfaces
  - debug:
      msg: "{{ hostvars[inventory_hostname] }}"
ansible-playbook -i nmake_inventory_csv.yaml site.yaml

About

Use a CSV file as an ansible inventory

License:GNU General Public License v3.0


Languages

Language:Python 100.0%