{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# inventory: YAMLInventory\n", "\n", "\n", "[YAMLInventory](../api/inventory.rst#nornir_utils.plugins.inventory.YAMLInventory) is an inventory plugin that builds the inventory from a few YAML files.\n", "\n", "## Data\n", "\n", "Let's see how it works by example. First let's look at the different files the plugin takes:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---\r\n", "dev1.group_1:\r\n", " port: 65020\r\n", " hostname: localhost\r\n", " username: a_user\r\n", " password: a_password\r\n", " platform: eos\r\n", " data:\r\n", " my_var: comes_from_dev1.group_1\r\n", " www_server: nginx\r\n", " role: www\r\n", " nested_data:\r\n", " a_dict:\r\n", " a: 1\r\n", " b: 2\r\n", " a_list: [1, 2]\r\n", " a_string: asdasd\r\n", " groups:\r\n", " - group_1\r\n", " connection_options:\r\n", " paramiko:\r\n", " port: 65020\r\n", " hostname:\r\n", " username: root\r\n", " password: docker\r\n", " platform: linux\r\n", " extras: {}\r\n", " dummy:\r\n", " hostname: dummy_from_host\r\n", " port:\r\n", " username:\r\n", " password:\r\n", " platform:\r\n", " extras:\r\n", " blah: from_host\r\n", "dev2.group_1:\r\n", " port: 65021\r\n", " hostname: localhost\r\n", " platform: junos\r\n", " data:\r\n", " role: db\r\n", " nested_data:\r\n", " a_dict:\r\n", " b: 2\r\n", " c: 3\r\n", " a_list: [2, 3]\r\n", " a_string: qwe\r\n", " groups:\r\n", " - group_1\r\n", " connection_options:\r\n", " paramiko:\r\n", " username: root\r\n", " password: docker\r\n", " platform: linux\r\n", " extras: {}\r\n", " dummy2:\r\n", " username: dummy2_from_host\r\n", "dev3.group_2:\r\n", " port: 65022\r\n", " hostname: localhost\r\n", " platform: linux\r\n", " data:\r\n", " www_server: apache\r\n", " role: www\r\n", " groups:\r\n", " - group_2\r\n", " connection_options:\r\n", " napalm:\r\n", " platform: mock\r\n", "dev4.group_2:\r\n", " port: 65023\r\n", " hostname: localhost\r\n", " platform: linux\r\n", " data:\r\n", " my_var: comes_from_dev4.group_2\r\n", " role: db\r\n", " groups:\r\n", " - group_2\r\n", " - parent_group\r\n", " connection_options:\r\n", " paramiko:\r\n", " hostname: localhost\r\n", " username: root\r\n", " password: docker\r\n", " platform: linux\r\n", " netmiko:\r\n", " hostname: localhost\r\n", " username: root\r\n", " password: docker\r\n", " platform: linux\r\n", "dev5.no_group:\r\n", " port: 65024\r\n", " hostname: localhost\r\n", " platform: linux\r\n" ] } ], "source": [ "%cat data/hosts.yaml" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---\r\n", "parent_group:\r\n", " password: from_parent_group\r\n", " data:\r\n", " a_var: blah\r\n", " a_false_var: false\r\n", " connection_options:\r\n", " dummy:\r\n", " hostname: dummy_from_parent_group\r\n", " extras:\r\n", " blah: from_group\r\n", " dummy2:\r\n", " hostname: dummy2_from_parent_group\r\n", " extras:\r\n", " blah: from_group\r\n", "group_1:\r\n", " password: from_group1\r\n", " platform:\r\n", " data:\r\n", " my_var: comes_from_group_1\r\n", " site: site1\r\n", " groups:\r\n", " - parent_group\r\n", "group_2:\r\n", " data:\r\n", " site: site2\r\n", "group_3:\r\n", " data:\r\n", " site: site2\r\n" ] } ], "source": [ "%cat data/groups.yaml" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---\r\n", "username: root\r\n", "password: docker\r\n", "platform: linux\r\n", "data:\r\n", " my_var: comes_from_defaults\r\n", " only_default: only_defined_in_default\r\n", "connection_options:\r\n", " dummy:\r\n", " hostname: dummy_from_defaults\r\n", " extras:\r\n", " blah: from_defaults\r\n" ] } ], "source": [ "%cat data/defaults.yaml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example\n", "\n", "Once you have the yaml files, using the plugin is very simple, you just need to specify the plugin you want to use is `YAMLInventory` and where to find the files:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from nornir import InitNornir\n", "\n", "nr = InitNornir(\n", " inventory={\n", " \"plugin\":\"YAMLInventory\",\n", " \"options\": {\n", " \"host_file\": \"data/hosts.yaml\",\n", " \"group_file\": \"data/groups.yaml\",\n", " \"defaults_file\": \"data/defaults.yaml\",\n", " }\n", " }\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just like that, you can verify the inventory playing with or just printing it as a `dict()`" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'hosts': {'dev1.group_1': {'name': 'dev1.group_1',\n", " 'connection_options': {'paramiko': {'extras': {},\n", " 'hostname': None,\n", " 'port': 65020,\n", " 'username': 'root',\n", " 'password': 'docker',\n", " 'platform': 'linux'},\n", " 'dummy': {'extras': {'blah': 'from_host'},\n", " 'hostname': 'dummy_from_host',\n", " 'port': None,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': None}},\n", " 'groups': ['group_1'],\n", " 'data': {'my_var': 'comes_from_dev1.group_1',\n", " 'www_server': 'nginx',\n", " 'role': 'www',\n", " 'nested_data': {'a_dict': {'a': 1, 'b': 2},\n", " 'a_list': [1, 2],\n", " 'a_string': 'asdasd'}},\n", " 'hostname': 'localhost',\n", " 'port': 65020,\n", " 'username': 'a_user',\n", " 'password': 'a_password',\n", " 'platform': 'eos'},\n", " 'dev2.group_1': {'name': 'dev2.group_1',\n", " 'connection_options': {'paramiko': {'extras': {},\n", " 'hostname': None,\n", " 'port': None,\n", " 'username': 'root',\n", " 'password': 'docker',\n", " 'platform': 'linux'},\n", " 'dummy2': {'extras': None,\n", " 'hostname': None,\n", " 'port': None,\n", " 'username': 'dummy2_from_host',\n", " 'password': None,\n", " 'platform': None}},\n", " 'groups': ['group_1'],\n", " 'data': {'role': 'db',\n", " 'nested_data': {'a_dict': {'b': 2, 'c': 3},\n", " 'a_list': [2, 3],\n", " 'a_string': 'qwe'}},\n", " 'hostname': 'localhost',\n", " 'port': 65021,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': 'junos'},\n", " 'dev3.group_2': {'name': 'dev3.group_2',\n", " 'connection_options': {'napalm': {'extras': None,\n", " 'hostname': None,\n", " 'port': None,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': 'mock'}},\n", " 'groups': ['group_2'],\n", " 'data': {'www_server': 'apache', 'role': 'www'},\n", " 'hostname': 'localhost',\n", " 'port': 65022,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': 'linux'},\n", " 'dev4.group_2': {'name': 'dev4.group_2',\n", " 'connection_options': {'paramiko': {'extras': None,\n", " 'hostname': 'localhost',\n", " 'port': None,\n", " 'username': 'root',\n", " 'password': 'docker',\n", " 'platform': 'linux'},\n", " 'netmiko': {'extras': None,\n", " 'hostname': 'localhost',\n", " 'port': None,\n", " 'username': 'root',\n", " 'password': 'docker',\n", " 'platform': 'linux'}},\n", " 'groups': ['group_2', 'parent_group'],\n", " 'data': {'my_var': 'comes_from_dev4.group_2', 'role': 'db'},\n", " 'hostname': 'localhost',\n", " 'port': 65023,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': 'linux'},\n", " 'dev5.no_group': {'name': 'dev5.no_group',\n", " 'connection_options': {},\n", " 'groups': [],\n", " 'data': {},\n", " 'hostname': 'localhost',\n", " 'port': 65024,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': 'linux'}},\n", " 'groups': {'parent_group': {'name': 'parent_group',\n", " 'connection_options': {'dummy': {'extras': {'blah': 'from_group'},\n", " 'hostname': 'dummy_from_parent_group',\n", " 'port': None,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': None},\n", " 'dummy2': {'extras': {'blah': 'from_group'},\n", " 'hostname': 'dummy2_from_parent_group',\n", " 'port': None,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': None}},\n", " 'groups': [],\n", " 'data': {'a_var': 'blah', 'a_false_var': False},\n", " 'hostname': None,\n", " 'port': None,\n", " 'username': None,\n", " 'password': 'from_parent_group',\n", " 'platform': None},\n", " 'group_1': {'name': 'group_1',\n", " 'connection_options': {},\n", " 'groups': ['parent_group'],\n", " 'data': {'my_var': 'comes_from_group_1', 'site': 'site1'},\n", " 'hostname': None,\n", " 'port': None,\n", " 'username': None,\n", " 'password': 'from_group1',\n", " 'platform': None},\n", " 'group_2': {'name': 'group_2',\n", " 'connection_options': {},\n", " 'groups': [],\n", " 'data': {'site': 'site2'},\n", " 'hostname': None,\n", " 'port': None,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': None},\n", " 'group_3': {'name': 'group_3',\n", " 'connection_options': {},\n", " 'groups': [],\n", " 'data': {'site': 'site2'},\n", " 'hostname': None,\n", " 'port': None,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': None}},\n", " 'defaults': {'data': {'my_var': 'comes_from_defaults',\n", " 'only_default': 'only_defined_in_default'},\n", " 'connection_options': {'dummy': {'extras': {'blah': 'from_defaults'},\n", " 'hostname': 'dummy_from_defaults',\n", " 'port': None,\n", " 'username': None,\n", " 'password': None,\n", " 'platform': None}},\n", " 'hostname': None,\n", " 'port': None,\n", " 'username': 'root',\n", " 'password': 'docker',\n", " 'platform': 'linux'}}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nr.inventory.dict()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" } }, "nbformat": 4, "nbformat_minor": 4 }