Skip to content

Latest commit

 

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

Topics

Resources

Stars

19 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages