From fcaa658fba4926cc7618a4a2b8f16d3e793b1b51 Mon Sep 17 00:00:00 2001
From: Debora Benedetto <debora.benedetto@hpe.com>
Date: Mon, 25 Jul 2022 15:16:20 +0200
Subject: [PATCH] remove output_file_generated folder from gitignore, add
 ssh_key file generation for ansible

---
 .gitignore                                    |   2 +-
 .../nginx_openstack/ansible/config.yaml       |   2 +-
 .../nginx_openstack/ansible/inventory.j2      |   2 +-
 .../nginx_openstack/ansible/ssh_key.j2        |   1 +
 .../nginx_openstack/terraform/main.tf         |  13 +-
 .../nginx_openstack/ansible/config.yaml       |   8 +
 .../nginx_openstack/ansible/inventory.j2      |   9 +
 .../nginx_openstack/ansible/nginx.yaml        |  44 +++++
 .../nginx_openstack/ansible/ssh_key.j2        |   1 +
 .../nginx_openstack/config.yaml               |   5 +
 .../ansible/playbooks/pma/ansible.cfg         |   7 +
 .../playbooks/pma/ansible_requirements.yml    |   8 +
 .../ansible/playbooks/pma/hosts.yaml          |   4 +
 .../pma/install_playbook_requirements.sh      |  33 ++++
 .../ansible/playbooks/pma/run-playbook.sh     |  33 ++++
 .../terraform/ansible/playbooks/pma/site.yaml |  30 +++
 .../playbooks/pma/site_requirements.yaml      |   9 +
 .../ansible/playbooks/pma/vars/main.yaml      |  23 +++
 .../nginx_openstack/terraform/config.yaml     |  16 ++
 .../nginx_openstack/terraform/main.tf         | 174 ++++++++++++++++++
 .../nginx_openstack/terraform/output.tf       |  14 ++
 plugin/AnsiblePlugin.py                       |   2 +
 plugin/TemplateUtils.py                       |   7 +-
 templates/ansible/ubuntu/config.tpl           |   1 -
 24 files changed, 431 insertions(+), 17 deletions(-)
 create mode 100644 output_file_example/nginx_openstack/ansible/ssh_key.j2
 create mode 100644 output_files_generated/nginx_openstack/ansible/config.yaml
 create mode 100644 output_files_generated/nginx_openstack/ansible/inventory.j2
 create mode 100644 output_files_generated/nginx_openstack/ansible/nginx.yaml
 create mode 100644 output_files_generated/nginx_openstack/ansible/ssh_key.j2
 create mode 100644 output_files_generated/nginx_openstack/config.yaml
 create mode 100644 output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible.cfg
 create mode 100644 output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible_requirements.yml
 create mode 100644 output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/hosts.yaml
 create mode 100644 output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/install_playbook_requirements.sh
 create mode 100644 output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/run-playbook.sh
 create mode 100644 output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site.yaml
 create mode 100644 output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site_requirements.yaml
 create mode 100644 output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/vars/main.yaml
 create mode 100644 output_files_generated/nginx_openstack/terraform/config.yaml
 create mode 100644 output_files_generated/nginx_openstack/terraform/main.tf
 create mode 100644 output_files_generated/nginx_openstack/terraform/output.tf

diff --git a/.gitignore b/.gitignore
index e51cffd..49f0b2a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
 .idea
 *.tar.gz
 icgparser/doml/*domlx
-output_files_generated/*
+# output_files_generated/*
 
 # Byte-compiled / optimized / DLL files
 __pycache__/
diff --git a/output_file_example/nginx_openstack/ansible/config.yaml b/output_file_example/nginx_openstack/ansible/config.yaml
index 072faf2..250c62c 100644
--- a/output_file_example/nginx_openstack/ansible/config.yaml
+++ b/output_file_example/nginx_openstack/ansible/config.yaml
@@ -1,6 +1,6 @@
 ---
 input:
-  - instance_server_public_key
+  - instance_server_private_key
   - instance_ip
 output: []
 engine: ansible
diff --git a/output_file_example/nginx_openstack/ansible/inventory.j2 b/output_file_example/nginx_openstack/ansible/inventory.j2
index c928da8..3dd97c3 100644
--- a/output_file_example/nginx_openstack/ansible/inventory.j2
+++ b/output_file_example/nginx_openstack/ansible/inventory.j2
@@ -4,4 +4,4 @@
 [vms:vars]
 ansible_connection=ssh
 ansible_user=ubuntu
-ansible_ssh_private_key_file={{ ssh_key_file }}
+ansible_ssh_private_key_file=ssh_key
diff --git a/output_file_example/nginx_openstack/ansible/ssh_key.j2 b/output_file_example/nginx_openstack/ansible/ssh_key.j2
new file mode 100644
index 0000000..1b9ad07
--- /dev/null
+++ b/output_file_example/nginx_openstack/ansible/ssh_key.j2
@@ -0,0 +1 @@
+{{ instance_server_private_key }}
\ No newline at end of file
diff --git a/output_file_example/nginx_openstack/terraform/main.tf b/output_file_example/nginx_openstack/terraform/main.tf
index 6fa1015..7245762 100644
--- a/output_file_example/nginx_openstack/terraform/main.tf
+++ b/output_file_example/nginx_openstack/terraform/main.tf
@@ -18,19 +18,11 @@ data "openstack_networking_network_v2" "external" {
   name = "external"
 }
 
-data "openstack_identity_project_v3" "test_tenant" {
-  name = "admin"
-}
-
-data "openstack_networking_secgroup_v2" "default" {
-  name = "default"
-  tenant_id = data.openstack_identity_project_v3.test_tenant.id
-}
 # Create virtual machine
 resource "openstack_compute_instance_v2" "nginx" {
   name        = "nginx-host"
   image_name  = "Ubuntu-Focal-20.04-Daily-2022-04-19"
-  flavor_name = "ubuntu"
+  flavor_name = "łubuntu"
   key_pair    = openstack_compute_keypair_v2.user_key.name
   network {
     port = openstack_networking_port_v2.nginx.id
@@ -75,7 +67,8 @@ resource "openstack_networking_port_v2" "nginx" {
   network_id     = openstack_networking_network_v2.generic.id
   admin_state_up = true
   security_group_ids = [
-    data.openstack_networking_secgroup_v2.default.id        #default flavour id
+    openstack_compute_secgroup_v2.ssh.id,
+    openstack_compute_secgroup_v2.http.id
   ]
   fixed_ip {
     subnet_id = openstack_networking_subnet_v2.nginx.id
diff --git a/output_files_generated/nginx_openstack/ansible/config.yaml b/output_files_generated/nginx_openstack/ansible/config.yaml
new file mode 100644
index 0000000..e84af9b
--- /dev/null
+++ b/output_files_generated/nginx_openstack/ansible/config.yaml
@@ -0,0 +1,8 @@
+
+---
+input:
+  - instance_ip_nginx-host
+  - instance_server_private_key_
+output: []
+engine: ansible
+...
diff --git a/output_files_generated/nginx_openstack/ansible/inventory.j2 b/output_files_generated/nginx_openstack/ansible/inventory.j2
new file mode 100644
index 0000000..7bd4920
--- /dev/null
+++ b/output_files_generated/nginx_openstack/ansible/inventory.j2
@@ -0,0 +1,9 @@
+
+
+[servers_for_nginx]
+{{ instance_ip_nginx-host }}
+
+[servers_for_nginx:vars]
+ansible_connection=ssh
+ansible_user=
+ansible_ssh_private_key_file={{ instance_server_private_key_ }}
diff --git a/output_files_generated/nginx_openstack/ansible/nginx.yaml b/output_files_generated/nginx_openstack/ansible/nginx.yaml
new file mode 100644
index 0000000..7cd932f
--- /dev/null
+++ b/output_files_generated/nginx_openstack/ansible/nginx.yaml
@@ -0,0 +1,44 @@
+
+
+---
+- hosts: servers_for_nginx
+  gather_facts: no
+  become: yes
+  tasks:
+    - name: Update repositories
+      apt:
+        update_cache: yes
+
+    - name: Install nginx
+      package:
+        name: nginx
+
+    - name: Start nginx
+      service:
+        name: nginx
+        enabled: yes
+        state: started
+
+    - name: Set attributes
+      set_stats:
+        data:
+          site_config_dir: /etc/nginx/conf.d
+
+    - name: Install sample site
+      copy:
+        dest: "{{ item }}"
+        content: |
+          <!doctype html>
+          <html lang="en">
+          <head>
+            <title>Hello World!</title>
+          </head>
+          <body>
+            <h1>Sample web page</h1>
+            <p>With little content ;)</p>
+          </body>
+          </html>
+      with_items:
+        - /var/www/html/index.html
+        - /usr/share/nginx/html/index.html
+
diff --git a/output_files_generated/nginx_openstack/ansible/ssh_key.j2 b/output_files_generated/nginx_openstack/ansible/ssh_key.j2
new file mode 100644
index 0000000..1b9ad07
--- /dev/null
+++ b/output_files_generated/nginx_openstack/ansible/ssh_key.j2
@@ -0,0 +1 @@
+{{ instance_server_private_key }}
\ No newline at end of file
diff --git a/output_files_generated/nginx_openstack/config.yaml b/output_files_generated/nginx_openstack/config.yaml
new file mode 100644
index 0000000..6464675
--- /dev/null
+++ b/output_files_generated/nginx_openstack/config.yaml
@@ -0,0 +1,5 @@
+---
+iac:
+- terraform
+- ansible
+...
\ No newline at end of file
diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible.cfg b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible.cfg
new file mode 100644
index 0000000..660a5eb
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible.cfg
@@ -0,0 +1,7 @@
+# https://docs.ansible.com/ansible/latest/reference_appendices/config.html
+[defaults]
+host_key_checking = False
+inventory = {{CWD}}/hosts.yaml  ; This points to the file that lists your hosts
+remote_user = esilab
+deprecation_warnings=False ; to remove the python version depretation warning
+display_skipped_hosts = no 
\ No newline at end of file
diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible_requirements.yml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible_requirements.yml
new file mode 100644
index 0000000..58c0cb3
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/ansible_requirements.yml
@@ -0,0 +1,8 @@
+roles:
+#  - name: dj-wasabi.telegraf
+#    version: 0.13.2
+#    source: https://galaxy.ansible.com
+  - name: dj-wasabi.telegraf
+    src: https://github.com/dj-wasabi/ansible-telegraf.git
+    scm: git
+    version: 0.13.2
diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/hosts.yaml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/hosts.yaml
new file mode 100644
index 0000000..b9cbfc6
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/hosts.yaml
@@ -0,0 +1,4 @@
+all:
+  hosts:
+    localhost:
+      ansible_connection: local
diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/install_playbook_requirements.sh b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/install_playbook_requirements.sh
new file mode 100644
index 0000000..843bf3b
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/install_playbook_requirements.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+set -e
+
+SCRIPT_DIR=$(dirname "$0")
+
+# to avoid the being run in a world writable directory we explicitly assign the ANSIBLE_CONFIG variable 
+if [[ -f ./ansible.cfg ]]
+then
+    export ANSIBLE_CONFIG=./ansible.cfg
+else 
+    if [[ -f $SCRIPT_DIR/ansible.cfg ]]
+    then
+        export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg
+    fi
+fi
+
+if [[ -z "$ANSIBLE_CONFIG" ]]
+then 
+    echo ANSIBLE_CONFIG to assigned using default https://docs.ansible.com/ansible/latest/reference_appendices/config.html
+else 
+    echo ANSIBLE_CONFIG=$ANSIBLE_CONFIG
+fi
+
+if [[ -z "$1" ]]
+then 
+    # echo without params 
+    echo ansible-playbook $SCRIPT_DIR/site_requirements.yaml
+    ansible-playbook $SCRIPT_DIR/site_requirements.yaml
+else 
+    # echo with params
+    echo ansible-playbook $SCRIPT_DIR/site_requirements.yaml --extra-vars "$1"
+    ansible-playbook $SCRIPT_DIR/site_requirements.yaml --extra-vars "$1"
+fi
diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/run-playbook.sh b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/run-playbook.sh
new file mode 100644
index 0000000..f2bba22
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/run-playbook.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+set -e
+
+SCRIPT_DIR=$(dirname "$0")
+
+# to avoid the being run in a world writable directory we explicitly assign the ANSIBLE_CONFIG variable 
+if [[ -f ./ansible.cfg ]]
+then
+    export ANSIBLE_CONFIG=./ansible.cfg
+else 
+    if [[ -f $SCRIPT_DIR/ansible.cfg ]]
+    then
+        export ANSIBLE_CONFIG=$SCRIPT_DIR/ansible.cfg
+    fi
+fi
+
+if [[ -z "$ANSIBLE_CONFIG" ]]
+then 
+    echo ANSIBLE_CONFIG to assigned using default https://docs.ansible.com/ansible/latest/reference_appendices/config.html
+else 
+    echo ANSIBLE_CONFIG=$ANSIBLE_CONFIG
+fi
+
+if [[ -z "$1" ]]
+then 
+    # echo without params 
+    echo ansible-playbook $SCRIPT_DIR/site.yaml
+    ansible-playbook $SCRIPT_DIR/site.yaml
+else 
+    # echo with params
+    echo ansible-playbook $SCRIPT_DIR/site.yaml --extra-vars "$1"
+    ansible-playbook $SCRIPT_DIR/site.yaml --extra-vars "$1"
+fi
diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site.yaml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site.yaml
new file mode 100644
index 0000000..531dbf5
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site.yaml
@@ -0,0 +1,30 @@
+- hosts: all
+  pre_tasks:
+    - name: Check parameters
+      fail:
+        msg: 'variable {{item}} not defined'
+      when: item is not defined
+      with_items:
+        - pma_deployment_id
+        - pma_influxdb_bucket
+        - pma_influxdb_token
+        - pma_influxdb_org
+        - pma_influxdb_addr
+    - name: Print parameters
+      debug:
+        msg: 
+          - "pma_deployment_id: {{ pma_deployment_id }}"
+          - "pma_influxdb_bucket: {{ pma_influxdb_bucket }}"
+          - "pma_influxdb_token: {{ pma_influxdb_token }}"
+          - "pma_influxdb_org: {{ pma_influxdb_org }}"
+          - "pma_influxdb_addr: {{ pma_influxdb_addr }}"
+    - name: Ensure gnupg package
+      package:
+        name: gnupg
+        state: present
+      become: true
+      
+  vars_files:
+    - vars/main.yaml
+  roles:
+    - dj-wasabi.telegraf
diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site_requirements.yaml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site_requirements.yaml
new file mode 100644
index 0000000..3e7665d
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/site_requirements.yaml
@@ -0,0 +1,9 @@
+- hosts: localhost
+  tasks:
+    - name: print disclamer
+      debug:
+        msg: this can also be done with "ansible-galaxy install -r requirements"
+    - name: install telegraf from galaxy
+      community.general.ansible_galaxy_install:
+        type: role
+        requirements_file: ansible_requirements.yml
diff --git a/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/vars/main.yaml b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/vars/main.yaml
new file mode 100644
index 0000000..ada2316
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/ansible/playbooks/pma/vars/main.yaml
@@ -0,0 +1,23 @@
+telegraf_agent_package_state: latest
+
+telegraf_agent_output:
+  - type: influxdb_v2
+    config:
+      - urls = ["{{ pma_influxdb_addr }}"]
+      - token = "{{ pma_influxdb_token }}"
+      - organization = "{{ pma_influxdb_org }}"
+      - bucket = "{{ pma_influxdb_bucket }}"
+      - insecure_skip_verify = true
+
+telegraf_global_tags:
+  - tag_name: deployment_id
+    tag_value: "{{ pma_deployment_id }}"
+
+telegraf_plugins_default:
+  - plugin: cpu
+  - plugin: mem
+  - plugin: processes
+  - plugin: disk
+  - plugin: net
+  
+  
diff --git a/output_files_generated/nginx_openstack/terraform/config.yaml b/output_files_generated/nginx_openstack/terraform/config.yaml
new file mode 100644
index 0000000..405c556
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/config.yaml
@@ -0,0 +1,16 @@
+
+
+---
+engine: terraform
+input:
+  - OS_USERNAME
+  - OS_PASSWORD
+  - OS_AUTH_URL
+  - OS_PROJECT_NAME
+output:
+
+  - instance_server_public_key_
+  - instance_server_private_key_
+  - instance_ip_nginx-host
+
+...
diff --git a/output_files_generated/nginx_openstack/terraform/main.tf b/output_files_generated/nginx_openstack/terraform/main.tf
new file mode 100644
index 0000000..11c005e
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/main.tf
@@ -0,0 +1,174 @@
+
+
+terraform {
+required_version = ">= 0.14.0"
+  required_providers {
+    openstack = {
+      source  = "terraform-provider-openstack/openstack"
+      version = "~> 1.35.0"
+    }
+  }
+}
+
+# Configure the OpenStack Provider
+provider "openstack" {
+  #user_name   = var.openstack_username
+  #tenant_name = "admin"
+  #password    = var.openstack_password
+  #auth_url    = var.openstack_auth_url
+  insecure    = true
+}
+
+# Retrieve data
+data "openstack_networking_network_v2" "external" {
+  name = "external"
+}
+
+data "openstack_identity_project_v3" "test_tenant" {
+  name = "admin"
+}
+
+data "openstack_networking_secgroup_v2" "default" {
+  name = "default"
+  tenant_id = data.openstack_identity_project_v3.test_tenant.id
+}
+
+
+# Create virtual machine
+resource "openstack_compute_instance_v2" "vm1" {
+  name        = "nginx-host"
+  image_name  = "Ubuntu-Focal-20.04-Daily-2022-04-19"
+  flavor_name = "small"
+  key_pair    = openstack_compute_keypair_v2.ssh_key.name
+  network {
+    port = openstack_networking_port_v2.net1.id
+  }
+
+  ## AGENTS TO ADD
+  # this is subject to be moved to IEM as part of its baseline
+    provisioner "local-exec" {
+    command = "ansible-galaxy collection install community.general"
+  }
+
+  # this is subject to be moved to IEM as part of its baseline
+  provisioner "local-exec" {
+    command = "ansible-playbook ansible/playbooks/pma/site_requirements.yaml"
+  }
+
+  # secrets can be taken from environment variables at IEM but these security issues I will leave them to y2, the user can also be problematic ubuntu/root/centos/...
+  provisioner "local-exec" {
+    command = "ansible-playbook -u root -i '${openstack_networking_floatingip_v2.vm1_floating_ip.address},' ansible/playbooks/pma/site.yaml --extra-vars '{\"pma_deployment_id\": \"123e4567-e89b-12d3-a456-426614174002\", \"pma_influxdb_bucket\": \"bucket\", \"pma_influxdb_token\": \"piacerePassword\", \"pma_influxdb_org\": \"piacere\", \"pma_influxdb_addr\": \"https://influxdb.pm.ci.piacere.digital.tecnalia.dev\" }'"
+  }
+
+}
+
+# Create floating ip
+resource "openstack_networking_floatingip_v2" "vm1_floating_ip" {
+  pool = "external"
+  # fixed_ip = ""
+}
+
+# Attach floating ip to instance
+resource "openstack_compute_floatingip_associate_v2" "vm1_floating_ip_association" {
+  floating_ip = openstack_networking_floatingip_v2.vm1_floating_ip.address
+  instance_id = openstack_compute_instance_v2.vm1.id
+}
+
+
+
+## Network
+
+# Create Network
+resource "openstack_networking_network_v2" "net1" {
+  name = "concrete_net"
+}
+
+# Create Subnet
+resource "openstack_networking_subnet_v2" "net1_subnet" {
+  name            = "concrete_net_subnet"
+  network_id      = openstack_networking_network_v2.net1.id
+  cidr            = "16.0.0.0/24"
+  dns_nameservers = ["8.8.8.8", "8.8.8.4"]
+}
+
+# Attach networking port
+resource "openstack_networking_port_v2" "net1" {
+  name           = "concrete_net"
+  network_id     = openstack_networking_network_v2.net1.id
+  admin_state_up = true
+  security_group_ids = [
+    data.openstack_networking_secgroup_v2.default.id        #default flavour id
+  ]
+  fixed_ip {
+    subnet_id = openstack_networking_subnet_v2.net1_subnet.id
+  }
+}
+
+# Create router
+resource "openstack_networking_router_v2" "net1_router" {
+  name                = "net1_router"
+  external_network_id = data.openstack_networking_network_v2.external.id    #External network id
+}
+# Router interface configuration
+resource "openstack_networking_router_interface_v2" "net1_router_interface" {
+  router_id = openstack_networking_router_v2.net1_router.id
+  subnet_id = openstack_networking_subnet_v2.net1_subnet.id
+}
+
+
+
+# Create ssh keys
+resource "openstack_compute_keypair_v2" "ssh_key" {
+  name       = "ubuntu"
+  # public_key = "ubuntu"
+}
+
+
+
+# CREATING SECURITY_GROUP
+  
+resource "openstack_compute_secgroup_v2" "icmp" {
+  name        = "icmp"
+  description  = "Security group rule for port -1"
+  rule {
+    from_port   = -1
+    to_port     = -1
+    ip_protocol = "icmp"
+    cidr        = "0.0.0.0/0"
+  }
+}
+ 
+resource "openstack_compute_secgroup_v2" "http" {
+  name        = "http"
+  description  = "Security group rule for port 80"
+  rule {
+    from_port   = 80
+    to_port     = 80
+    ip_protocol = "tcp"
+    cidr        = "0.0.0.0/0"
+  }
+}
+ 
+resource "openstack_compute_secgroup_v2" "https" {
+  name        = "https"
+  description  = "Security group rule for port 443"
+  rule {
+    from_port   = 443
+    to_port     = 443
+    ip_protocol = "tcp"
+    cidr        = "0.0.0.0/0"
+  }
+}
+ 
+resource "openstack_compute_secgroup_v2" "ssh" {
+  name        = "ssh"
+  description  = "Security group rule for port 22"
+  rule {
+    from_port   = 22
+    to_port     = 22
+    ip_protocol = "tcp"
+    cidr        = "0.0.0.0/0"
+  }
+}
+
+
diff --git a/output_files_generated/nginx_openstack/terraform/output.tf b/output_files_generated/nginx_openstack/terraform/output.tf
new file mode 100644
index 0000000..2f4e6e3
--- /dev/null
+++ b/output_files_generated/nginx_openstack/terraform/output.tf
@@ -0,0 +1,14 @@
+
+
+output "instance_server_public_key_" {
+  value = openstack_compute_keypair_v2.ssh_key.public_key
+}
+
+output "instance_server_private_key_" {
+  value = openstack_compute_keypair_v2.ssh_key.private_key
+}
+
+output "instance_ip_nginx-host" {
+  value = openstack_compute_floatingip_associate_v2.vm1_floating_ip_association.floating_ip
+}
+
diff --git a/plugin/AnsiblePlugin.py b/plugin/AnsiblePlugin.py
index 3ff921a..e0eb144 100644
--- a/plugin/AnsiblePlugin.py
+++ b/plugin/AnsiblePlugin.py
@@ -56,6 +56,7 @@ def create_files(parameters, output_path):
             ansible_output_file_path = output_path + "/".join([language, resource_name]) + ".yaml"
             inventory_output_file_path = output_path + "/".join([language, "inventory"]) + ".j2"
             config_output_file_path = output_path + "/".join([language, "config"]) + ".yaml"
+            ssh_key_output_file_path = output_path + "/".join([language, "ssh_key.j2"])
 
             template = TemplateUtils.read_template(ansible_template_path)
             template_filled = TemplateUtils.edit_template(template, resource_params)
@@ -66,5 +67,6 @@ def create_files(parameters, output_path):
             TemplateUtils.write_template(inventory_template_filled, inventory_output_file_path)
             TemplateUtils.write_template(template_filled, ansible_output_file_path)
             TemplateUtils.write_template(config_template_filled, config_output_file_path)
+            TemplateUtils.write_template("{{ instance_server_private_key }}", ssh_key_output_file_path)
 
     logging.info("File available at: {}".format(output_path))
diff --git a/plugin/TemplateUtils.py b/plugin/TemplateUtils.py
index 67a1221..6f5a140 100644
--- a/plugin/TemplateUtils.py
+++ b/plugin/TemplateUtils.py
@@ -11,7 +11,7 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-#-------------------------------------------------------------------------
+# -------------------------------------------------------------------------
 
 import configparser
 import logging
@@ -25,6 +25,7 @@ from jinja2 import Template
 def get_context(c):
     return c
 
+
 def find_template_path(iac_language, key, resource_name):
     try:
         properties_reader = configparser.ConfigParser()
@@ -42,7 +43,7 @@ def edit_template(template, parameters: dict):
     template.globals['context'] = get_context
     template.globals['callable'] = callable
     render = template.render(parameters)
-    template_with_custom_params = ""+render+"\n"
+    template_with_custom_params = "" + render + "\n"
     return template_with_custom_params
 
 
@@ -62,4 +63,4 @@ def write_template(template, output_path_file):
     file = open(output_path_file, "w+")
     file.write(template)
     logging.info("Writing file at: '%s'", output_path_file)
-    file.close()
\ No newline at end of file
+    file.close()
diff --git a/templates/ansible/ubuntu/config.tpl b/templates/ansible/ubuntu/config.tpl
index b161cb4..d589352 100644
--- a/templates/ansible/ubuntu/config.tpl
+++ b/templates/ansible/ubuntu/config.tpl
@@ -13,7 +13,6 @@
 # limitations under the License.
 #-------------------------------------------------------------------------
 #}
-
 ---
 input:
   - instance_ip_{{ node.vm_name }}
-- 
GitLab