From 2f60aca75d2affb082f1809c3f34d071f033ca4a Mon Sep 17 00:00:00 2001 From: Attila Farkas <x394097@fi.muni.cz> Date: Mon, 30 Sep 2019 15:38:55 +0200 Subject: [PATCH] add ansible roles --- README.md | 2 +- ...generator.py => ansible_data_generator.py} | 1 + modules/file_generator.py | 94 ++++++++++++++----- templates/base | 37 -------- templates/host | 16 ---- templates/router | 18 ---- test.yaml => test.yml | 0 7 files changed, 72 insertions(+), 96 deletions(-) rename modules/{ansible_files_generator.py => ansible_data_generator.py} (95%) delete mode 100644 templates/base delete mode 100644 templates/host delete mode 100644 templates/router rename test.yaml => test.yml (100%) diff --git a/README.md b/README.md index 22553b4..72f8155 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ generate.py is a python program that generates a vagrant source file from a defi ### Usage: 1. Clone the project. 2. Navigate to the project folder. -3. Type `$ python3 generate.py yaml_file.yaml`. There is a test yaml file in the repository called test.yaml. +3. Type `$ python3 generate.py yaml_file.yml`. There is a test yaml file in the repository called test.yml. 4. Run `$ vagrant up` ### Input yaml file structure diff --git a/modules/ansible_files_generator.py b/modules/ansible_data_generator.py similarity index 95% rename from modules/ansible_files_generator.py rename to modules/ansible_data_generator.py index 3f00ec9..1768e83 100644 --- a/modules/ansible_files_generator.py +++ b/modules/ansible_data_generator.py @@ -26,6 +26,7 @@ def create_host_map(net_mappings, router_mappings): for net_mapping in net_mappings: host = dict() host["host_name"] = net_mapping["host"] + host["host_ip"] = net_mapping["ip"] host["router_ip"] = _find_router_ip( net_mapping["network"], router_mappings) hosts.append(host) diff --git a/modules/file_generator.py b/modules/file_generator.py index 0e29698..b0d1bb2 100644 --- a/modules/file_generator.py +++ b/modules/file_generator.py @@ -2,7 +2,7 @@ import jinja2 import os from modules.device_creator import create_devices -from modules.ansible_files_generator import create_network_map, create_host_map +from modules.ansible_data_generator import create_network_map, create_host_map def _load_template(template_name): @@ -23,59 +23,105 @@ def _generate_file(filename, output_string): print("Error: cannot write to this location.") +def _create_role_directory(role_name): + """ Creates directory structure for a role. """ + + try: + os.mkdir("provision") + except FileExistsError: + pass + try: + os.mkdir("provision/roles") + except FileExistsError: + pass + try: + os.mkdir("provision/roles/" + role_name) + except FileExistsError: + pass + try: + os.mkdir("provision/roles/" + role_name +"/tasks") + except FileExistsError: + pass + + def generate_vagrantfile(definitions): """ Writes the prepared output to a Vagrantfile. """ device_definitions = create_devices(definitions) - template = _load_template("base") + template = _load_template("vagrantfile") output = template.render(devices=device_definitions) _generate_file("Vagrantfile", output) print("Info: Vagrantfile successfully created.") -def _generate_routers_playbook(definitions): - """ Generates ansible playbook for router configuration. """ - - if not definitions['routers'] or not definitions['router_mappings']: - print("Info: No router definition was found. Skipping router creation.") - return - - network = create_network_map( - definitions["net_mappings"], definitions["router_mappings"]) +def _generate_playbook(): + """ Generates the main playbook. """ - template = _load_template("router") - output = template.render(network=network) + template = _load_template("playbook") + output = template.render() try: os.mkdir("provision") except FileExistsError: pass - _generate_file("./provision/routers_playbook.yaml", output) + _generate_file("./provision/playbook.yml", output) - print("Info: Routers successfully created.") - -def _generate_host_playbook(definitions): - """ Generates ansible playbook for host configuration. """ +def _generate_device_configuration(definitions): + """ Generates a playbook with basic device configutarion. """ host_map = create_host_map(definitions["net_mappings"], definitions["router_mappings"]) + network = create_network_map( + definitions["net_mappings"], definitions["router_mappings"]) - template = _load_template("host") - output = template.render(hosts=host_map) + template = _load_template("device_configuration") + output = template.render(hosts=host_map, routers=network) try: os.mkdir("provision") except FileExistsError: pass - _generate_file("./provision/hosts_playbook.yaml", output) + _generate_file("./provision/device_configuration.yml", output) + + +def _generate_hosts_role(definitions): + """ Generates hosts role. """ + + host_map = create_host_map(definitions["net_mappings"], definitions["router_mappings"]) + + template = _load_template("hosts") + output = template.render(hosts=host_map) + + _create_role_directory("hosts") + _generate_file("./provision/roles/hosts/tasks/main.yml", output) + - print("Info: Hosts successfully created.") +def _generate_routers_role(definitions): + """ Generates routers role. """ + + if not definitions['routers'] or not definitions['router_mappings']: + print("Info: No router definition was found. Skipping router creation.") + return + + network = create_network_map( + definitions["net_mappings"], definitions["router_mappings"]) + + template = _load_template("routers") + output = template.render(network=network) + + _create_role_directory("routers") + _generate_file("./provision/roles/routers/tasks/main.yml", output) def generate_ansible_files(device_definitions): """ Generates files for ansible. """ - _generate_routers_playbook(device_definitions) - _generate_host_playbook(device_definitions) + + _generate_playbook() + _generate_device_configuration(device_definitions) + _generate_hosts_role(device_definitions) + _generate_routers_role(device_definitions) + + print("Info: Ansible files successfully created.") diff --git a/templates/base b/templates/base deleted file mode 100644 index d8d7e42..0000000 --- a/templates/base +++ /dev/null @@ -1,37 +0,0 @@ -# Generated vagrant file -# -# -*- mode: ruby -*- -# vi: set ft=ruby : - -{# Macro that prints out attributes of a device #} -{% macro printAttributes(device_name) %} -{% for command in devices[device_name] %} - {{ command }} -{% endfor %} -{% endmacro %} - -{# Device definitions #} -Vagrant.configure("2") do |config| -{% for name, attributes in devices.items() %} - - # device: {{ name }} - config.vm.define "{{ name }}" do |device| -{{ printAttributes(name) }} end -{% endfor %} - - # host configuration - config.vm.provision "ansible" do |ansible| - ansible.playbook = "provision/hosts_playbook.yaml" - ansible.extra_vars = { - ansible_python_interpreter: "/usr/bin/python3", - } - end - - # router configuration - config.vm.provision "ansible" do |ansible| - ansible.playbook = "provision/routers_playbook.yaml" - ansible.extra_vars = { - ansible_python_interpreter: "/usr/bin/python3", - } - end -end diff --git a/templates/host b/templates/host deleted file mode 100644 index 4ad8ca5..0000000 --- a/templates/host +++ /dev/null @@ -1,16 +0,0 @@ ---- -{% for host in hosts%} -- name: Configuring routing tables on {{ host.host_name }} - hosts: {{ host.host_name }} - tasks: - - - name: Install net-tools - become: yes - command: apt-get install net-tools - - - name: Change default gateway - become: yes - command: route add default gw {{ host.router_ip }} eth1 - -{% endfor %} -... diff --git a/templates/router b/templates/router deleted file mode 100644 index 9bd457e..0000000 --- a/templates/router +++ /dev/null @@ -1,18 +0,0 @@ ---- -{% for routing in network %} -- name: Configuring routing tables on {{ routing.router_name }} - hosts: {{ routing.router_name }} - tasks: - - - name: Enable IP forwarding - become: yes - copy: - dest: "/etc/sysctl.conf" - content: "net.ipv4.ip_forward=1" - - - name: Restarting procps service - become: yes - command: /etc/init.d/procps restart - -{% endfor %} -... diff --git a/test.yaml b/test.yml similarity index 100% rename from test.yaml rename to test.yml -- GitLab