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