diff --git a/input_file_generated/openstack_nginx_ir.json b/input_file_generated/openstack_nginx_ir.json
new file mode 100644
index 0000000000000000000000000000000000000000..d6ad467ed3c99f64d8c915076991853f51ffb0cb
--- /dev/null
+++ b/input_file_generated/openstack_nginx_ir.json
@@ -0,0 +1,54 @@
+{
+  "output_path": "output_files_generated/nginx_openstack/",
+  "steps": [
+    {
+      "data": {
+        "credentials": [
+          {
+            "algorithm": "RSA",
+            "bits": 4096,
+            "keyfile": "/home/user1/.ssh/openstack.key",
+            "name": "ssh_key",
+            "user": "ubuntu"
+          }
+        ],
+        "networks": [
+          {
+            "addressRange": "16.0.0.0/24",
+            "infra_element_name": "net1",
+            "name": "concrete_net",
+            "protocol": "tcp/ip"
+          }
+        ],
+        "provider": "openstack",
+        "vmImages": [
+          {
+            "infra_element_name": "v_img",
+            "kind": "SCRIPT",
+            "name": "concrete_vm_image"
+          }
+        ],
+        "vms": [
+          {
+            "credentials": "ssh_key",
+            "generatedFrom": "v_img",
+            "group": "sg",
+            "i1": {
+              "associated": "sg",
+              "belongsTo": "net1",
+              "endPoint": "16.0.0.1",
+              "name": "i1"
+            },
+            "infra_element_name": "vm1",
+            "name": "concrete_vm",
+            "os": "ubuntu-20.04.3",
+            "vm_flavor": "small",
+            "vm_key_name": "user1",
+            "vm_name": "nginx-host"
+          }
+        ]
+      },
+      "programming_language": "terraform"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/output_file_example/nginx_openstack/ansible/config.yaml b/output_file_example/nginx_openstack/ansible/config.yaml
index f5b9945aea768b2e8fa0d458646b3db9ed9d1ae5..31417c5bec8dc6e439af0aa05dddae529473a0ba 100644
--- a/output_file_example/nginx_openstack/ansible/config.yaml
+++ b/output_file_example/nginx_openstack/ansible/config.yaml
@@ -1,5 +1,6 @@
 ---
-input: []
+input:
+  - instance_server_public_key
 output: []
 engine: ansible
 ...
diff --git a/output_file_example/nginx_openstack/ansible/nginx.play b/output_file_example/nginx_openstack/ansible/nginx.play
index c8790e19071787ba9fef7d270947c8ec6f09048d..758a689e705a6af5823ea2c5cfb5f1f603f1b2a3 100644
--- a/output_file_example/nginx_openstack/ansible/nginx.play
+++ b/output_file_example/nginx_openstack/ansible/nginx.play
@@ -3,7 +3,7 @@
   gather_facts: no
   become: yes
   vars:
-    ansible_ssh_private_key_file: "/home/user1/.ssh/openstack.key"
+    ansible_ssh_private_key_file: "{{instance_server_public_key}}"
     ansible_ssh_user: "ubuntu"
   tasks:
     - name: Update repositories
diff --git a/output_file_example/nginx_openstack/terraform/config.yaml b/output_file_example/nginx_openstack/terraform/config.yaml
index 54f446cb906877c64ffb8adf442a47bb53ef3b01..77edc6dfdcdd484647221fab5e92ad6e2c491696 100644
--- a/output_file_example/nginx_openstack/terraform/config.yaml
+++ b/output_file_example/nginx_openstack/terraform/config.yaml
@@ -1,5 +1,7 @@
 ---
 engine: terraform
 input: []
-output: []
+output:
+  - instance_server_public_key
+  - instance_server_private_key
 ...
diff --git a/output_file_example/nginx_openstack/terraform/main.tf b/output_file_example/nginx_openstack/terraform/main.tf
index 4d9b4d34d3fa42ff7c9e05d3f422c37d19b1abcf..bff9531c2ff7db9c7bdedaaf6a7b6c92c5eafceb 100644
--- a/output_file_example/nginx_openstack/terraform/main.tf
+++ b/output_file_example/nginx_openstack/terraform/main.tf
@@ -33,7 +33,7 @@ data "openstack_networking_secgroup_v2" "default" {
 # Create virtual machine
 resource "openstack_compute_instance_v2" "nginx" {
   name        = "nginx-host"
-  image_name  = "cirros"
+  image_name  = "ubuntu-18.04"
   flavor_name = "m1.tiny"
   key_pair    = openstack_compute_keypair_v2.user_key.name
   network {
diff --git a/output_file_example/nginx_openstack/terraform/output.tf b/output_file_example/nginx_openstack/terraform/output.tf
new file mode 100644
index 0000000000000000000000000000000000000000..ec7fc6ad92d2a213feffb9e65f47146b61f6792c
--- /dev/null
+++ b/output_file_example/nginx_openstack/terraform/output.tf
@@ -0,0 +1,7 @@
+output "instance_server_public_key" {
+  value = openstack_compute_keypair_v2.user_key.public_key
+}
+
+output "instance_server_private_key" {
+  value = openstack_compute_keypair_v2.user_key.private_key
+}
\ No newline at end of file
diff --git a/output_file_example/nginx_openstack_with_agents/ansible/config.yaml b/output_file_example/nginx_openstack_with_agents/ansible/config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f5b9945aea768b2e8fa0d458646b3db9ed9d1ae5
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/ansible/config.yaml
@@ -0,0 +1,5 @@
+---
+input: []
+output: []
+engine: ansible
+...
diff --git a/output_file_example/nginx_openstack_with_agents/ansible/nginx.play b/output_file_example/nginx_openstack_with_agents/ansible/nginx.play
new file mode 100644
index 0000000000000000000000000000000000000000..c8790e19071787ba9fef7d270947c8ec6f09048d
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/ansible/nginx.play
@@ -0,0 +1,45 @@
+---
+- hosts: 16.0.0.1
+  gather_facts: no
+  become: yes
+  vars:
+    ansible_ssh_private_key_file: "/home/user1/.ssh/openstack.key"
+    ansible_ssh_user: "ubuntu"
+  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: ""
+        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_file_example/nginx_openstack_with_agents/config.yaml b/output_file_example/nginx_openstack_with_agents/config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ba7bee3769bb5e1f0c532d343d9bfb96e2163d8a
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/config.yaml
@@ -0,0 +1,5 @@
+---
+iac:
+  - terraform
+  - ansible
+...
\ No newline at end of file
diff --git a/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/ansible.cfg b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/ansible.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..660a5ebcbecd0307307b5c2d2d61083e315c4e45
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/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_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/ansible_requirements.yml b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/ansible_requirements.yml
new file mode 100644
index 0000000000000000000000000000000000000000..58c0cb368b76e9a0313aee87b2296e727877b2d9
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/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_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/hosts.yaml b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/hosts.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b9cbfc6d1be7e249a1f6813793dd228083d669fe
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/hosts.yaml
@@ -0,0 +1,4 @@
+all:
+  hosts:
+    localhost:
+      ansible_connection: local
diff --git a/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/install_playbook_requirements.sh b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/install_playbook_requirements.sh
new file mode 100644
index 0000000000000000000000000000000000000000..843bf3b6e0c4dfb6d6157ae22687cd7585ef3a02
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/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_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/run-playbook.sh b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/run-playbook.sh
new file mode 100644
index 0000000000000000000000000000000000000000..f2bba22bc6dcae68d78545cc6b130677bc5083ef
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/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_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/site.yaml b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/site.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..531dbf50d5ca852802196de7eafe0c238b9beb85
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/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_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/site_requirements.yaml b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/site_requirements.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3e7665dce4e17365bfd08f90425e9408d0f83045
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/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_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/vars/main.yaml b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/ansible/playbooks/pma/vars/main.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ada23165aebadbfe12bffb77368f0181fb4f1737
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/agents_playbook/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_file_example/nginx_openstack_with_agents/terraform/config.yaml b/output_file_example/nginx_openstack_with_agents/terraform/config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b5020bfca6aecac4c769462c05669a28751bbfc4
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/config.yaml
@@ -0,0 +1,7 @@
+---
+engine: terraform
+input: []
+output:
+  - instance_server_key_public_key
+  - instance_server_key_private_key
+...
diff --git a/output_file_example/nginx_openstack_with_agents/terraform/main.tf b/output_file_example/nginx_openstack_with_agents/terraform/main.tf
new file mode 100644
index 0000000000000000000000000000000000000000..ec92de4ecbc60adbf6a8761077ccebb949ae3d62
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/main.tf
@@ -0,0 +1,137 @@
+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" "nginx" {
+  name        = "nginx-host"
+  image_name  = "cirros"
+  flavor_name = "m1.tiny"
+  key_pair    = openstack_compute_keypair_v2.user_key.name
+  network {
+    port = openstack_networking_port_v2.nginx.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.nginx.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 ssh keys
+resource "openstack_compute_keypair_v2" "user_key" {
+  name       = "user1"
+  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAsRO3dcuZVB0but7Ti9eN+Ti4FvRzQfZT6DugkOnasGSwQkuBUxr0RGHYG2O+C/ul4bN4wcM8VZ4aX9bk9vwkvBkk2uJhy0ZHqIzuwzTOmRPScHWApkxGEANO4QYiYdPYdjmGgAVuKhdqPYOJc5Spkf3n4sYrU89rhC4rLyRs7doYofxpwBVaDfUExPLAtwFb2UGGzC6c0SJzqX4ZFq72NC0zs"
+}
+
+# Create floating ip
+resource "openstack_networking_floatingip_v2" "nginx" {
+  pool = "external"
+
+}
+
+# Attach floating ip to instance
+resource "openstack_compute_floatingip_associate_v2" "nginx" {
+  floating_ip = openstack_networking_floatingip_v2.nginx.address
+  instance_id = openstack_compute_instance_v2.nginx.id
+}
+
+## Network
+
+# Create Network
+resource "openstack_networking_network_v2" "generic" {
+  name = " "
+}
+
+# Create Subnet
+resource "openstack_networking_subnet_v2" "nginx" {
+  name            = "subnet-nginx"
+  network_id      = openstack_networking_network_v2.generic.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" "nginx" {
+  name           = "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
+  ]
+  fixed_ip {
+    subnet_id = openstack_networking_subnet_v2.nginx.id
+  }
+}
+
+# Router creation. UUID external gateway
+resource "openstack_networking_router_v2" "generic" {
+  name                = "router-generic"
+  external_network_id = data.openstack_networking_network_v2.external.id    #External network id
+}
+# Router interface configuration
+resource "openstack_networking_router_interface_v2" "nginx" {
+  router_id = openstack_networking_router_v2.generic.id
+  subnet_id = openstack_networking_subnet_v2.nginx.id
+}
+
+resource "openstack_compute_secgroup_v2" "http" {
+  name        = "http"
+  description = "Open input http port"
+  rule {
+    from_port   = 80
+    to_port     = 80
+    ip_protocol = "tcp"
+    cidr        = "0.0.0.0/0"
+  }
+}
+
+resource "openstack_compute_secgroup_v2" "ssh" {
+  name        = "ssh"
+  description = "Open input ssh port"
+  rule {
+    from_port   = 22
+    to_port     = 22
+    ip_protocol = "tcp"
+    cidr        = "0.0.0.0/0"
+  }
+}
diff --git a/output_file_example/nginx_openstack_with_agents/terraform/output.tf b/output_file_example/nginx_openstack_with_agents/terraform/output.tf
new file mode 100644
index 0000000000000000000000000000000000000000..4f2a52f2f9ab10b20d2d58aaae665cf2c81cb63c
--- /dev/null
+++ b/output_file_example/nginx_openstack_with_agents/terraform/output.tf
@@ -0,0 +1,7 @@
+output "instance_server_key_public_key" {
+  value = openstack_compute_keypair_v2.user_key.public_key
+}
+
+output "instance_server_key_private_key" {
+  value = openstack_compute_keypair_v2.user_key.private_key
+}
\ No newline at end of file
diff --git a/templates/terraform/aws/init.tpl b/templates/terraform/aws/init.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/templates/terraform/aws/port_rule.tpl b/templates/terraform/aws/port_rule.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..0e54a7e0543d70b1021db34568d213c85589cbb3
--- /dev/null
+++ b/templates/terraform/aws/port_rule.tpl
@@ -0,0 +1,10 @@
+resource "openstack_compute_secgroup_v2" "{{ name }}" {
+  name        = "{{ name }}"
+  description  = "Security group rule for port {{ fromPort }}"
+  rule {
+    from_port   = {{ fromPort }}
+    to_port     = {{ toPort }}
+    ip_protocol = "{{ protocol }}"
+    cidr        = {% for range in cidr %}"{{ range }}"{% endfor %}
+  }
+}
\ No newline at end of file
diff --git a/templates/terraform/aws/vm.tpl b/templates/terraform/aws/virtual_machine.tpl
similarity index 60%
rename from templates/terraform/aws/vm.tpl
rename to templates/terraform/aws/virtual_machine.tpl
index 41ec39aee04aea340dc8183dd21bea2ba39140b1..4b27da64868ed27ad6508363f7708b0be64bd3ba 100644
--- a/templates/terraform/aws/vm.tpl
+++ b/templates/terraform/aws/virtual_machine.tpl
@@ -13,3 +13,15 @@ resource "aws_instance" "instance{{ id }}" {
      Name = "{{ name }}"
    }
 }
+
+resource "aws_instance" "nginx-app" {
+  ami = {{ os }}
+  instance_type = {{ instance_type }}
+  key_name = "{{ssh_key_name}}"
+
+  network_interface {
+    network_interface_id = aws_network_interface.nginx-network_interface.id
+    device_index = 0
+  }
+}
+
diff --git a/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/ansible.cfg b/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/ansible.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..660a5ebcbecd0307307b5c2d2d61083e315c4e45
--- /dev/null
+++ b/templates/terraform/open_stack/agents_playbook/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/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/ansible_requirements.yml b/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/ansible_requirements.yml
new file mode 100644
index 0000000000000000000000000000000000000000..58c0cb368b76e9a0313aee87b2296e727877b2d9
--- /dev/null
+++ b/templates/terraform/open_stack/agents_playbook/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/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/hosts.yaml b/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/hosts.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b9cbfc6d1be7e249a1f6813793dd228083d669fe
--- /dev/null
+++ b/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/hosts.yaml
@@ -0,0 +1,4 @@
+all:
+  hosts:
+    localhost:
+      ansible_connection: local
diff --git a/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/install_playbook_requirements.sh b/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/install_playbook_requirements.sh
new file mode 100644
index 0000000000000000000000000000000000000000..843bf3b6e0c4dfb6d6157ae22687cd7585ef3a02
--- /dev/null
+++ b/templates/terraform/open_stack/agents_playbook/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/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/run-playbook.sh b/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/run-playbook.sh
new file mode 100644
index 0000000000000000000000000000000000000000..f2bba22bc6dcae68d78545cc6b130677bc5083ef
--- /dev/null
+++ b/templates/terraform/open_stack/agents_playbook/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/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/site.yaml b/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/site.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..531dbf50d5ca852802196de7eafe0c238b9beb85
--- /dev/null
+++ b/templates/terraform/open_stack/agents_playbook/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/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/site_requirements.yaml b/templates/terraform/open_stack/agents_playbook/ansible/playbooks/pma/site_requirements.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3e7665dce4e17365bfd08f90425e9408d0f83045
--- /dev/null
+++ b/templates/terraform/open_stack/agents_playbook/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/utility/FileParsingUtility.py b/utility/FileParsingUtility.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/utility/__init__.py b/utility/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391