From 5b04d13149bdb7e0f089d5fe178eed88fb89898b Mon Sep 17 00:00:00 2001
From: handreas <andreas.hamacher@monash.edu>
Date: Thu, 23 Apr 2020 06:10:20 +0000
Subject: [PATCH] Revert "removing dead code"

This reverts commit 194f75bf5a70453122b3b1e3a4503ca23534aaab [formerly d506d5da5ed639d97f918fb87a2368db2ef34db0].


Former-commit-id: 35f5f8a14091b7a6a1240d50f8074a93f94aef35
---
 buildCert.yml                                 |  88 ++++++
 buildKaraage3.x.yml                           | 216 +++++++++++++++
 createNode                                    | 157 +++++++++++
 dynamicInventory-mcc2                         |  76 ++++++
 extra_packages/tasks/main.yml                 |  20 ++
 extra_packages/vars/main.yml                  | 254 ++++++++++++++++++
 headNode.yaml                                 |  44 +++
 installNFS.yml                                |  24 ++
 playbook/cvl2.yml                             | 192 +++++++++++++
 playbook/massive_var/main.yml                 |  71 +++++
 playbook/massive_var/package.yml              |   8 +
 playbook/readme.txt                           |   1 +
 roles/commonVars/vars/readme.txt              |   2 +
 roles/enable_root/tasks/main.yml              |   3 +
 .../enable_root/templates/authorized_keys.j2  |  11 +
 ...DIA-Linux-x86_64-352.93.run.REMOVED.git-id |   1 +
 scripts/get_or_make_passwd.py                 |  28 ++
 scripts/userData.sh                           |   5 +
 syncNFS.yml                                   |  14 +
 templates/easy-rsa/vars.j2                    |  80 ++++++
 20 files changed, 1295 insertions(+)
 create mode 100644 buildCert.yml
 create mode 100644 buildKaraage3.x.yml
 create mode 100644 createNode
 create mode 100755 dynamicInventory-mcc2
 create mode 100644 extra_packages/tasks/main.yml
 create mode 100644 extra_packages/vars/main.yml
 create mode 100644 headNode.yaml
 create mode 100644 installNFS.yml
 create mode 100644 playbook/cvl2.yml
 create mode 100644 playbook/massive_var/main.yml
 create mode 100644 playbook/massive_var/package.yml
 create mode 100644 playbook/readme.txt
 create mode 100644 roles/commonVars/vars/readme.txt
 create mode 100644 roles/enable_root/tasks/main.yml
 create mode 100644 roles/enable_root/templates/authorized_keys.j2
 create mode 100644 roles/gpu_update/files/NVIDIA-Linux-x86_64-352.93.run.REMOVED.git-id
 create mode 100755 scripts/get_or_make_passwd.py
 create mode 100644 scripts/userData.sh
 create mode 100644 syncNFS.yml
 create mode 100644 templates/easy-rsa/vars.j2

diff --git a/buildCert.yml b/buildCert.yml
new file mode 100644
index 00000000..eb6a72f3
--- /dev/null
+++ b/buildCert.yml
@@ -0,0 +1,88 @@
+--- 
+- name: "Check client ca certificate"
+  register: ca_cert
+  stat: "path={{ x509_cacert_file }}"
+
+- name: "Check certificate and key"
+  shell: (openssl x509 -noout -modulus -in {{ x509_cert_file }}  | openssl md5 ; openssl rsa -noout -modulus -in {{ x509_key_file }} | openssl md5) | uniq | wc -l
+  register: certcheck
+
+- name: "Check certificate"
+  register: cert
+  stat: "path={{ x509_cert_file }}"
+
+- name: "Check key"
+  register: key
+  stat: "path={{ x509_key_file }}"
+  become: true
+
+- name: "Default: we don't need a new certificate"
+  set_fact: needcert=False
+
+- name: "Set need cert if key is missing"
+  set_fact: needcert=True
+  when: key.stat.exists == false
+
+- name: "set needcert if cert is missing"
+  set_fact: needcert=True
+  when: cert.stat.exists == false
+
+- name: "set needcert if cert doesn't match key"
+  set_fact: needcert=True
+  when: certcheck.stdout == '2'
+
+
+- name: "Creating Keypair"
+  shell: "echo noop when using easy-rsa"
+  when: needcert
+
+- name: "Creating CSR"
+  shell: " cd /etc/easy-rsa/2.0; source ./vars; export EASY_RSA=\"${EASY_RSA:-.}\"; \"$EASY_RSA\"/pkitool --csr {{ x509_csr_args }} {{ common_name }}"
+  when: needcert
+  become: true
+
+- name: "Copy CSR to ansible host"
+  fetch: "src=/etc/easy-rsa/2.0/keys/{{ common_name }}.csr dest=/tmp/{{ common_name }}/ fail_on_missing=yes validate_md5=yes flat=yes"
+  become: true
+  when: needcert
+
+- name: "Copy CSR to CA"
+  delegate_to: "{{ x509_ca_server }}"
+  copy: "src=/tmp/{{ ansible_fqdn }}/{{ common_name }}.csr dest=/etc/easy-rsa/2.0/keys/{{ common_name }}.csr force=yes"
+  when: needcert
+  become: true
+
+- name: "Sign Certificate"
+  delegate_to: "{{ x509_ca_server }}"
+  shell:    "source ./vars; export EASY_RSA=\"${EASY_RSA:-.}\" ;\"$EASY_RSA\"/pkitool --sign {{ common_name }}"
+  args:
+    chdir: "/etc/easy-rsa/2.0"
+  become: true
+  when: needcert
+
+- name: "Copy the Certificate to ansible host"
+  delegate_to: "{{ x509_ca_server }}"
+  fetch: "src=/etc/easy-rsa/2.0/keys/{{ common_name }}.crt dest=/tmp/{{ common_name }}/ fail_on_missing=yes validate_md5=yes flat=yes"
+  become: true
+  when: needcert
+
+- name: "Copy the CA Certificate to the ansible host"
+  delegate_to: "{{ x509_ca_server }}"
+  fetch: "src=/etc/easy-rsa/2.0/keys/ca.crt dest=/tmp/ca.crt fail_on_missing=yes validate_md5=yes flat=yes"
+  become: true
+  when: "ca_cert.stat.exists == false"
+
+- name: "Copy the certificate to the node"
+  copy: "src=/tmp/{{ common_name }}/{{ common_name }}.crt dest={{ x509_cert_file }} force=yes"
+  become: true
+  when: needcert
+
+- name: "Copy the CA certificate to the node"
+  copy: "src=/tmp/ca.crt dest={{ x509_cacert_file }}"
+  become: true
+  when: "ca_cert.stat.exists == false"
+
+- name: "Copy the key to the correct location"
+  shell: "mkdir -p `dirname {{ x509_key_file }}` ; chmod 700 `dirname {{ x509_key_file }}` ; cp /etc/easy-rsa/2.0/keys/{{ common_name }}.key {{ x509_key_file }}"
+  become: true
+  when: needcert
diff --git a/buildKaraage3.x.yml b/buildKaraage3.x.yml
new file mode 100644
index 00000000..fcd33602
--- /dev/null
+++ b/buildKaraage3.x.yml
@@ -0,0 +1,216 @@
+---
+-
+  hosts: ldap-server
+  pre_tasks:
+    - sysctl: name=kernel.hostname value={{ inventory_hostname }} state=present
+      ignore_errors: yes
+    - service: name=network state=restarted
+      when: ansible_os_family == 'RedHat'
+  roles:
+    - etcHosts
+    - easy-rsa-CA
+    - easy-rsa-certificate
+    - ldapserver
+  become: true
+  vars:
+   - x509_ca_server: "{% for host in groups['ldap-server'] %}{{ hostvars[host]['ansible_fqdn'] }}{% endfor %}"
+   - countryName: "AU"
+   - reginalName: "Victoria"
+   - cityName: "Melbourne"
+   - organizationName: "Monash University"
+   - emailAddress: "shahaan@gmail.com"
+   - organizationUnit: "defaultUnit"
+   - ldapDomain: "dc=monash,dc=edu,dc=au"
+   - ldapManager: "cn=Manager,dc=monash,dc=edu,dc=au"
+   - ldapBindDN: "cn=ldapuser,ou=users,dc=monash,dc=edu,dc=au"
+   - ldapUserBase: "ou=users,dc=monash,dc=edu,dc=au"
+   - ldapGroupBase: "ou=groups,dc=monash,dc=edu,dc=au"
+   - ldapBase: "dc=monash,dc=edu,dc=au"
+   - ldapURI: "{% for host in groups['ldap-server'] %}ldaps://{{ hostvars[host]['ansible_fqdn'] }}{% endfor %}"
+   - smtp_smarthost: "{{ ansible_hostname }}"
+   - ldapManagerPassword: "imldap"
+   - ldapBindDNPassword: "imbinddn"
+   - domain: ""
+   - karaage_sql_password: "imkaraage"
+   - mysql_root_password: "immysql"
+   - x509_key_file: "/etc/ssl/private/server.key"
+   - x509_cert_file: "/etc/ssl/certs/server.crt"
+   - x509_cacert_file: "/etc/ssl/certs/ca.crt"
+   - x509_csr_args: ""
+   - x509_sign_args: "{{ x509_csr_args }}"
+   - x509_common_name: "{{ inventory_hostname }}"
+- 
+  hosts: karaage-server
+  pre_tasks:
+    - sysctl: name=kernel.hostname value={{ inventory_hostname }} state=present
+      ignore_errors: yes
+    - service: name=network state=restarted
+      when: ansible_os_family == 'RedHat'
+  roles:
+    - etcHosts
+    - easy-rsa-certificate
+    - karaage3.1.17
+    - shibboleth-sp
+  become: true
+  vars:
+   - x509_ca_server: "{% for host in groups['ldap-server'] %}{{ hostvars[host]['ansible_fqdn'] }}{% endfor %}"
+   - countryName: "AU"
+   - reginalName: "Victoria"
+   - cityName: "Melbourne"
+   - organizationName: "Monash University"
+   - emailAddress: "shahaan@gmail.com"
+   - organizationUnit: "defaultUnit"
+   - ldapDomain: "dc=monash,dc=edu,dc=au"
+   - ldapManager: "cn=Manager,dc=monash,dc=edu,dc=au"
+   - ldapBindDN: "cn=ldapuser,ou=users,dc=monash,dc=edu,dc=au"
+   - ldapUserBase: "ou=users,dc=monash,dc=edu,dc=au"
+   - ldapGroupBase: "ou=groups,dc=monash,dc=edu,dc=au"
+   - ldapBase: "dc=monash,dc=edu,dc=au"
+   - ldapURI: "{% for host in groups['ldap-server'] %}ldaps://{{ hostvars[host]['ansible_fqdn'] }}{% endfor %}"
+   - smtp_smarthost: "{{ ansible_hostname }}"
+   - ldapManagerPassword: "imldap"
+   - ldapBindDNPassword: "imbinddn"
+   - domain: ""
+   - karaage_sql_password: "imkaraage"
+   - mysql_root_password: "immysql"
+   - x509_key_file: "/etc/ssl/private/server.key"
+   - x509_cert_file: "/etc/ssl/certs/server.crt"
+   - x509_cacert_file: "/etc/ssl/certs/ca.crt"
+   - x509_csr_args: ""
+   - x509_sign_args: "{{ x509_csr_args }}"
+   - x509_common_name: "{{ inventory_hostname }}"
+   - aaf_federation_url: "https://ds.test.aaf.edu.au/distribution/metadata"
+   - aaf_discovery_url: "https://ds.test.aaf.edu.au/discovery/DS"
+   - admin_email: "shahaan@gmail.com"
+   - aaf_metadata_xml: '<EntityDescriptor entityID="https://vm-118-138-241-159.erc.monash.edu.au/shibboleth" xmlns="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:shibmd="urn:mace:shibboleth:metadata:1.0" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="urn:oasis:names:tc:SAML:2.0:metadata saml-schema-metadata-2.0.xsd urn:mace:shibboleth:metadata:1.0 shibboleth-metadata-1.0.xsd http://www.w3.org/2000/09/xmldsig# xmldsig-core-schema.xsd">
+  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+    <Extensions>
+      <dsr:DiscoveryResponse xmlns:dsr="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" Binding="urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/Login" index="0" isDefault="true" />
+    </Extensions>
+    <KeyDescriptor use="signing">
+      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+        <ds:X509Data>
+          <ds:X509Certificate>
+MIIFDDCCA/SgAwIBAgIJALO1/Blx64tvMA0GCSqGSIb3DQEBCwUAMIG0MQswCQYD
+VQQGEwJBVTEMMAoGA1UECBMDVklDMRIwEAYDVQQHEwlNZWxib3VybmUxDTALBgNV
+BAoTBE1lUkMxETAPBgNVBAsTCG9wZW5sZGFwMS0wKwYDVQQDEyR2bS0xMTgtMTM4
+LTI0MS0xNTkuZXJjLm1vbmFzaC5lZHUuYXUxEDAOBgNVBCkTB0Vhc3lSU0ExIDAe
+BgkqhkiG9w0BCQEWEXNoYWhhYW5AZ21haWwuY29tMB4XDTE1MDMyMzEyMjYzOFoX
+DTI1MDMyMDEyMjYzOFowgbQxCzAJBgNVBAYTAkFVMQwwCgYDVQQIEwNWSUMxEjAQ
+BgNVBAcTCU1lbGJvdXJuZTENMAsGA1UEChMETWVSQzERMA8GA1UECxMIb3Blbmxk
+YXAxLTArBgNVBAMTJHZtLTExOC0xMzgtMjQxLTE1OS5lcmMubW9uYXNoLmVkdS5h
+dTEQMA4GA1UEKRMHRWFzeVJTQTEgMB4GCSqGSIb3DQEJARYRc2hhaGFhbkBnbWFp
+bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTcsIqn/HKgeRK
+gj4rXYu8V/kTkv63d2Rtmv6zSlRwtjKBCvePEo/4ZpwOK235kBfX9KZKU9wlyFhf
+DdmOvIBYvhrLqtIYNfMWLt8iUFkdt2N/dNmftu7WUXuZezsRXMqbPG7dLjMLyJ7D
+7UCox1IB2SYzHx0K9w7PtCleV5A/o9Eg/7G8/FvOCB5askY/YywzEWLrxIYYn6Cr
+Gsioh5hXxac9p3KuO6dvbMLIMHVZ4u7mbLrdp/e6TZTlyZN+Tfbjta0VYBw0beuS
+KpwZc8Toow2B22O3K15o6tr0nvVSTEj2Qrd+LPolFSFBKVaD+9G/i0FMLHNOuQVP
+Cw/62vEnAgMBAAGjggEdMIIBGTAdBgNVHQ4EFgQUouRhu/Wc+jU1rfUd+kiqbtg/
+q3cwgekGA1UdIwSB4TCB3oAUouRhu/Wc+jU1rfUd+kiqbtg/q3ehgbqkgbcwgbQx
+CzAJBgNVBAYTAkFVMQwwCgYDVQQIEwNWSUMxEjAQBgNVBAcTCU1lbGJvdXJuZTEN
+MAsGA1UEChMETWVSQzERMA8GA1UECxMIb3BlbmxkYXAxLTArBgNVBAMTJHZtLTEx
+OC0xMzgtMjQxLTE1OS5lcmMubW9uYXNoLmVkdS5hdTEQMA4GA1UEKRMHRWFzeVJT
+QTEgMB4GCSqGSIb3DQEJARYRc2hhaGFhbkBnbWFpbC5jb22CCQCztfwZceuLbzAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDFKPmj1TGpUZsdviOwMjU/
+IHqZ+3RwFcvkfBu8JmwxaO86GrC1mwZyQExvQLQF6LLaGHyVlZa3PxUkmcqq1for
+ZcYYyVRip4fgtOI6WcKg+nWI9+rDX5fU5gZAYm3er4MNZ/R7sTmgHEemOcuSiatQ
+hDoUkv9GOZKoxw4uJJq/yUumAkziAIuMWoTHYrR9cqOkoKQiFUjqmhI3m4phtoV4
+OaeVf3hkhXakbk1OkAAAzPxsrpAaUM5eLC75SV5Hopid9ltpFjpD457TXKdE+IyB
+oBDUnCaHSkrDmbeX6iSUHLWjjcOs0MI0UOXH+XNKNR3kUUvS+0ZCwRIPXc11/AFN
+</ds:X509Certificate>
+        </ds:X509Data>
+      </ds:KeyInfo>
+    </KeyDescriptor>
+    <KeyDescriptor use="encryption">
+      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+        <ds:X509Data>
+          <ds:X509Certificate>
+MIIFDDCCA/SgAwIBAgIJALO1/Blx64tvMA0GCSqGSIb3DQEBCwUAMIG0MQswCQYD
+VQQGEwJBVTEMMAoGA1UECBMDVklDMRIwEAYDVQQHEwlNZWxib3VybmUxDTALBgNV
+BAoTBE1lUkMxETAPBgNVBAsTCG9wZW5sZGFwMS0wKwYDVQQDEyR2bS0xMTgtMTM4
+LTI0MS0xNTkuZXJjLm1vbmFzaC5lZHUuYXUxEDAOBgNVBCkTB0Vhc3lSU0ExIDAe
+BgkqhkiG9w0BCQEWEXNoYWhhYW5AZ21haWwuY29tMB4XDTE1MDMyMzEyMjYzOFoX
+DTI1MDMyMDEyMjYzOFowgbQxCzAJBgNVBAYTAkFVMQwwCgYDVQQIEwNWSUMxEjAQ
+BgNVBAcTCU1lbGJvdXJuZTENMAsGA1UEChMETWVSQzERMA8GA1UECxMIb3Blbmxk
+YXAxLTArBgNVBAMTJHZtLTExOC0xMzgtMjQxLTE1OS5lcmMubW9uYXNoLmVkdS5h
+dTEQMA4GA1UEKRMHRWFzeVJTQTEgMB4GCSqGSIb3DQEJARYRc2hhaGFhbkBnbWFp
+bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTcsIqn/HKgeRK
+gj4rXYu8V/kTkv63d2Rtmv6zSlRwtjKBCvePEo/4ZpwOK235kBfX9KZKU9wlyFhf
+DdmOvIBYvhrLqtIYNfMWLt8iUFkdt2N/dNmftu7WUXuZezsRXMqbPG7dLjMLyJ7D
+7UCox1IB2SYzHx0K9w7PtCleV5A/o9Eg/7G8/FvOCB5askY/YywzEWLrxIYYn6Cr
+Gsioh5hXxac9p3KuO6dvbMLIMHVZ4u7mbLrdp/e6TZTlyZN+Tfbjta0VYBw0beuS
+KpwZc8Toow2B22O3K15o6tr0nvVSTEj2Qrd+LPolFSFBKVaD+9G/i0FMLHNOuQVP
+Cw/62vEnAgMBAAGjggEdMIIBGTAdBgNVHQ4EFgQUouRhu/Wc+jU1rfUd+kiqbtg/
+q3cwgekGA1UdIwSB4TCB3oAUouRhu/Wc+jU1rfUd+kiqbtg/q3ehgbqkgbcwgbQx
+CzAJBgNVBAYTAkFVMQwwCgYDVQQIEwNWSUMxEjAQBgNVBAcTCU1lbGJvdXJuZTEN
+MAsGA1UEChMETWVSQzERMA8GA1UECxMIb3BlbmxkYXAxLTArBgNVBAMTJHZtLTEx
+OC0xMzgtMjQxLTE1OS5lcmMubW9uYXNoLmVkdS5hdTEQMA4GA1UEKRMHRWFzeVJT
+QTEgMB4GCSqGSIb3DQEJARYRc2hhaGFhbkBnbWFpbC5jb22CCQCztfwZceuLbzAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDFKPmj1TGpUZsdviOwMjU/
+IHqZ+3RwFcvkfBu8JmwxaO86GrC1mwZyQExvQLQF6LLaGHyVlZa3PxUkmcqq1for
+ZcYYyVRip4fgtOI6WcKg+nWI9+rDX5fU5gZAYm3er4MNZ/R7sTmgHEemOcuSiatQ
+hDoUkv9GOZKoxw4uJJq/yUumAkziAIuMWoTHYrR9cqOkoKQiFUjqmhI3m4phtoV4
+OaeVf3hkhXakbk1OkAAAzPxsrpAaUM5eLC75SV5Hopid9ltpFjpD457TXKdE+IyB
+oBDUnCaHSkrDmbeX6iSUHLWjjcOs0MI0UOXH+XNKNR3kUUvS+0ZCwRIPXc11/AFN
+</ds:X509Certificate>
+        </ds:X509Data>
+      </ds:KeyInfo>
+    </KeyDescriptor>
+    <ContactPerson contactType="technical">
+      <Company>Monash University</Company>
+      <GivenName>Shahaan</GivenName>
+      <SurName>Ayyub</SurName>
+      <EmailAddress>mailto:shahaan.ayyub@monash.edu</EmailAddress>
+    </ContactPerson>
+    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/SLO/Artifact" />
+    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/SLO/POST" />
+    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/SLO/SOAP" />
+    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/SLO/Redirect" />
+    <ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/NIM/POST" />
+    <ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/NIM/Redirect" />
+    <ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/NIM/SOAP" />
+    <ManageNameIDService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/NIM/Artifact" />
+    <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
+    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/SAML2/Artifact" index="3" isDefault="false" />
+    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://vm-118-138-241-159.erc.monash.edu.au/Shibboleth.sso/SAML2/POST" index="1" isDefault="true" />
+    <AttributeConsumingService index="1" isDefault="false">
+      <ServiceName xml:lang="en">vm-118-138-241-159.erc.monash.edu.au</ServiceName>
+      <RequestedAttribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" Name="urn:oid:2.5.4.3" FriendlyName="commonName" isRequired="true" />
+      <RequestedAttribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" Name="urn:oid:0.9.2342.19200300.100.1.3" FriendlyName="email" isRequired="true" />
+      <RequestedAttribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" Name="urn:oid:2.5.4.42" FriendlyName="givenName" isRequired="false" />
+      <RequestedAttribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" Name="urn:oid:2.5.4.4" FriendlyName="surname" isRequired="true" />
+    </AttributeConsumingService>
+  </SPSSODescriptor>
+  <Organization>
+    <OrganizationName xml:lang="en">monash.edu.au</OrganizationName>
+    <OrganizationDisplayName xml:lang="en">Monash University</OrganizationDisplayName>
+    <OrganizationURL xml:lang="en">https://manager.aaf.edu.au/support</OrganizationURL>
+  </Organization>
+</EntityDescriptor>'
+   - aaf_metadata_cert: '-----BEGIN CERTIFICATE-----
+MIIEbDCCA1SgAwIBAgIESWrmGDANBgkqhkiG9w0BAQUFADCB9zEQMA4GA1UEBhMH
+VW5rbm93bjEQMA4GA1UECBMHVW5rbm93bjEQMA4GA1UEBxMHVW5rbm93bjEQMA4G
+A1UEChMHVW5rbm93bjFaMFgGA1UECxNRb3BlbnNzbCB4NTA5IC1vdXQgbWV0YWRh
+dGEtY2VydC5wZW0gLW91dGZvcm0gcGVtIC1pbiBtZXRhZGF0YS1kZXIuY3J0IC1p
+bmZvcm0gZGVyMVEwTwYDVQQDDEhrZXl0b29sIC1rZXlzdG9yZSBrZXlzdG9yZS5r
+cyAtZXhwb3J0IC1hbGlhcyBtZXRhZGF0YSA+IG1ldGFkYXRhLWRlci5jcnQwHhcN
+MDkwMTEyMDY0MTI4WhcNMTQwMTExMDY0MTI4WjCB9zEQMA4GA1UEBhMHVW5rbm93
+bjEQMA4GA1UECBMHVW5rbm93bjEQMA4GA1UEBxMHVW5rbm93bjEQMA4GA1UEChMH
+VW5rbm93bjFaMFgGA1UECxNRb3BlbnNzbCB4NTA5IC1vdXQgbWV0YWRhdGEtY2Vy
+dC5wZW0gLW91dGZvcm0gcGVtIC1pbiBtZXRhZGF0YS1kZXIuY3J0IC1pbmZvcm0g
+ZGVyMVEwTwYDVQQDDEhrZXl0b29sIC1rZXlzdG9yZSBrZXlzdG9yZS5rcyAtZXhw
+b3J0IC1hbGlhcyBtZXRhZGF0YSA+IG1ldGFkYXRhLWRlci5jcnQwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZgh/InL2LixNtzuA+dNXSn19/W4IMbD6+
+Zzysk/jMi4Sgr4FrEfMeTi2G2/rpf32TeSG1P4MZqqyy5yuhNX7RQTFSZyl5D9cs
+98dE7FY/g7uySGv7oao1rkJfEmFmcZQIvRkLs89PQqKok2/m807DnzF1zCAt+YcY
+wqHyXyTrzxr4hMDDB2Ij8PeDZeSIB3s/CK2F6hIg13VeYEZjAWf4KPwsOteuzR4Y
+uuuGDlNFjcJGu+97N4LTnOBb6uW8qNtAAq6UWtA28A4KQejrzBZrfBGPLGbe6KHs
+WrziN2uk8kEY1TQw0cp+Am/ph8nl00KU+oVrswjS8oUklL98C5LnAgMBAAEwDQYJ
+KoZIhvcNAQEFBQADggEBAEy0xLMJBneC+DQ0cSNH3kXaW9cdqzsoD/UawJHaDqIJ
+UjIslR38p5H3pRQ7rZ1+c7z0lUaBqQO/i+MZUEMHCpbhEcZK0Ep5dlWc80DFGSxS
+ItbghQ5loS4JOgKYZZdRSzCxV3PAqlzqXoZrFeaeJL7xFIRglpphN06joOlX0zQM
+0iN8qn7oTTaR3U2Kxkh6NQ2qTH3IvP71YJnjSzljqZHFughhTpl8cA8i9ijcmeyP
+Y5TYJTbtwQ0X+435LTX8xxW/B4E8XnH7iEOykvfZMYxt5cSrtzF1eAMQ/ln2r54O
+bk0oX1BGue0XcgeMObQrs/eC+2uspENHKtUdYDU0OK4=
+-----END CERTIFICATE-----'
diff --git a/createNode b/createNode
new file mode 100644
index 00000000..779ebebe
--- /dev/null
+++ b/createNode
@@ -0,0 +1,157 @@
+#!/usr/bin/env python
+import sys, os, string, subprocess, socket, ansible.runner, re
+import copy, shlex,uuid, random, multiprocessing, time, shutil
+import novaclient.v1_1.client as nvclient
+import novaclient.exceptions as nvexceptions
+import glanceclient.v2.client as glclient
+import keystoneclient.v2_0.client as ksclient
+
+class Authenticate:
+	
+	def __init__(self, username, passwd):
+		self.username=username
+		self.passwd=passwd
+		self.tenantName= os.environ['OS_TENANT_NAME']
+		self.authUrl="https://keystone.rc.nectar.org.au:5000/v2.0"
+		kc = ksclient.Client(   auth_url=self.authUrl,
+					username=self.username,
+					password=self.passwd)
+		self.tenantList=kc.tenants.list()
+		self.novaSemaphore = multiprocessing.BoundedSemaphore(value=1)
+	
+	def createNovaObject(self,tenantName):
+		for tenant in self.tenantList:
+			if tenant.name == tenantName:
+				try:
+					nc = nvclient.Client(	auth_url=self.authUrl,
+						username=self.username,
+						api_key=self.passwd,
+						project_id=tenant.name,
+						tenant_id=tenant.id,
+						service_type="compute"
+						)
+					return nc
+				except nvexceptions.ClientException:
+					raise
+	
+	def gatherInfo(self):
+
+		for tenant in self.tenantList: print tenant.name
+		tenantName = raw_input("Please select a project: (Default MCC-On-R@CMON):")
+		if not tenantName or tenantName not in [tenant.name for tenant in self.tenantList]: 
+			tenantName = "MCC_On_R@CMON"
+		print tenantName,"selected\n"
+		
+		## Fetch the Nova Object
+
+		nc = self.createNovaObject(tenantName)
+		
+		## Get the Flavor
+		flavorList = nc.flavors.list()
+		for flavor in flavorList: print flavor.name
+		flavorName = raw_input("Please select a Flavor Name: (Default m1.xxlarge):")
+		if not flavorName or flavorName not in [flavor.name for flavor in flavorList]:
+			flavorName = "m1.xxlarge"
+		print flavorName,"selected\n"
+
+		
+		## Get the Availability Zones
+		az_p1 = subprocess.Popen(shlex.split\
+		("nova availability-zone-list"),stdout=subprocess.PIPE)
+		az_p2 = subprocess.Popen(shlex.split\
+		("""awk '{if ($2 && $2 != "Name")print $2}'"""),\
+		stdin=az_p1.stdout,stdout=subprocess.PIPE)
+		availabilityZonesList =  subprocess.Popen(shlex.split\
+		("sort"),stdin=az_p2.stdout,stdout=subprocess.PIPE).communicate()[0]
+		print  availabilityZonesList
+		availabilityZone = raw_input("Please select an availability zone: (Default monash-01):")
+		if not availabilityZone or \
+		availabilityZone not in [ zone for zone in availabilityZonesList.split()]:
+			availabilityZone = "monash-01"
+		print availabilityZone,"selected\n"
+		
+		## Get the number of instances to spawn
+		numberOfInstances = raw_input\
+		("Please specify the number of instances to launch: (Default 1):")
+		if not numberOfInstances or \
+		not isinstance(int(numberOfInstances), int):
+			numberOfInstances = 1
+		subprocess.call(['clear'])
+		flavorObj = nc.flavors.find(name=flavorName)
+		print "Creating",numberOfInstances,\
+		"instance(s) in",availabilityZone,"zone..."
+		instanceList = []
+		for counter in range(0,int(numberOfInstances)):
+			nodeName = "MCC-Node"+str(random.randrange(1,1000))
+			try:
+				novaInstance =  nc.servers.create\
+				(name=nodeName,image="ddc13ccd-483c-4f5d-a5fb-4b968aaf385b",\
+				flavor=flavorObj,key_name="shahaan",\
+				availability_zone=availabilityZone)
+				instanceList.append(novaInstance)
+			except nvexceptions.ClientException:
+				raise
+				continue
+				
+		while 'BUILD' in [novaInstance.status \
+		for novaInstance in instanceList]:
+			for count in range(0,len(instanceList)):
+				time.sleep(5)
+				if instanceList[count].status != 'BUILD': 
+					continue
+				else:
+					try:
+						instanceList[count] = nc.servers.get(instanceList[count].id)
+					except nvexceptions.ClientException or \
+					nvexceptions.ConnectionRefused or \
+					nvexceptions.InstanceInErrorState:
+						raise
+						del instanceList[count]
+						continue
+		activeHostsList = []
+		SSHports = []
+		for novaInstance in instanceList:
+			if novaInstance.status == 'ACTIVE':
+				hostname = socket.gethostbyaddr(novaInstance.networks.values()[0][0])[0]
+				activeHostsList.append(hostname)
+				SSHDict = {}
+				SSHDict['IP'] = novaInstance.networks.values()[0][0]
+				SSHDict['status'] = 'CLOSED'
+				SSHports.append(SSHDict) 
+		print "Scanning if port 22 is open..."
+		sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+		while 'CLOSED' in [host['status'] for host in SSHports]:
+			for instance in range(0,len(SSHports)):
+				sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+				if SSHports[instance]['status'] == 'CLOSED' and not sock.connect_ex((SSHports[instance]['IP'], 22)):
+					SSHports[instance]['status'] = 'OPEN'
+					print "Port 22, opened for IP:",SSHports[instance]['IP']
+				else:
+					time.sleep(5)
+				sock.close()
+				
+		fr = open('/etc/ansible/hosts.rpmsave','r+')
+		fw = open('hosts.temp','w+')
+		lines = fr.readlines()
+		for line in lines:
+			fw.write(line)
+			if re.search('\[new-servers\]',line):
+				for host in activeHostsList: fw.write(host+'\n')
+		fr.close()
+		fw.close()
+		shutil.move('hosts.temp','/etc/ansible/hosts')
+		print "Building the Nodes now..."
+		subprocess.call(shlex.split("/mnt/nectar-nfs/root/swStack/ansible/bin/ansible-playbook /mnt/nectar-nfs/root/ansible-config-root/mcc-nectar-dev/buildNew.yml -v"))	
+
+if __name__ == "__main__":
+	username = os.environ['OS_USERNAME']
+	passwd = os.environ['OS_PASSWORD']
+	choice = raw_input(username + " ? (y/n):")
+	while choice and choice not in ("n","y"):
+		print "y or n please"
+		choice = raw_input()
+	if choice == "n":
+		username = raw_input("username :")
+		passwd = raw_input("password :")
+	auth = Authenticate(username, passwd)
+	auth.gatherInfo()
diff --git a/dynamicInventory-mcc2 b/dynamicInventory-mcc2
new file mode 100755
index 00000000..dd761641
--- /dev/null
+++ b/dynamicInventory-mcc2
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+import sys, os, string, socket, re
+import shlex, multiprocessing, time, shutil, json
+from novaclient import client as nvclient
+import novaclient.exceptions as nvexceptions
+import keystoneclient.v2_0.client as ksclient
+from joblib import Parallel, delayed
+from multiprocessing import Process, Manager, Pool
+from libnmap.process import NmapProcess
+from libnmap.parser import NmapParser, NmapParserException
+
+def gatherInfo(tenantName, tenantID, userName, passwd, authUrl, inventory):
+	## Fetch the Nova Object
+	projectName = os.path.basename(sys.argv[0])
+	nc = nvclient.Client(	auth_url=authUrl,
+		username=userName,
+		api_key=passwd,
+		project_id=tenantName,
+		tenant_id=tenantID,
+		version="2"
+		)
+	for server in nc.servers.list():
+		if server.metadata and \
+		'ansible_host_groups' in server.metadata and \
+		'project_name' in  server.metadata:
+			if server.metadata['project_name'].strip() != projectName.strip(): continue
+			unwantedChars = """][")("""
+			rgx = re.compile('[%s]' % unwantedChars)
+			ansible_groups = rgx.sub('', server.metadata['ansible_host_groups']).split(',')
+			hostname = socket.gethostbyaddr(server.networks.values()[0][0])[0]
+			novaVolumes = nc.volumes.get_server_volumes(server.id)
+			# Let's do some port scanning using nmap
+			nmproc = NmapProcess(hostname, "-p 22 -sV -Pn")
+			rc = nmproc.run()
+			if rc != 0: continue
+			parsed = NmapParser.parse(nmproc.stdout)
+			# Set Ansible Host Group
+			for group in ansible_groups:
+				groupName = group.strip()
+				if groupName not in inventory: inventory[groupName] = []
+				inventory[groupName].append(hostname)
+			# Add other metadata
+			for key, value in server.metadata.iteritems():
+				if key not in ('project_name','ansible_host_groups'):
+					inventory['_meta']['hostvars'][hostname] = { key:value }
+			if novaVolumes:
+				inventory['_meta']['hostvars'][hostname]['volumeList'] = [ volume.id for volume in novaVolumes ]
+			inventory['_meta']['hostvars'][hostname]['status']  = parsed.hosts[0].status
+		else:
+			continue
+	#print inventory
+
+if __name__ == "__main__":
+	inventory = {}
+	inventory['_meta'] = { 'hostvars': {} }
+	try:
+		authUrl = os.environ['OS_AUTH_URL']
+		userName = os.environ['OS_USERNAME']
+		passwd = os.environ['OS_PASSWORD']
+	except KeyError:
+		print "Env Variables not set, Please run: source <openstack rc file>"
+		sys.exit()
+	kc = ksclient.Client(auth_url=authUrl, username=userName, password=passwd)
+	tenancies = kc.tenants.list()
+	Parallel(n_jobs=len(tenancies), backend="threading")(delayed(gatherInfo)
+	(tenant.name, tenant.id, userName, passwd, authUrl, inventory)
+	for tenant in tenancies)
+	if not inventory['_meta']['hostvars']:
+		print "I could not find any project called ", os.path.basename(sys.argv[0]), "in any of "
+		for tenancy in tenancies: print tenancy.name
+		print "\n1. You can select a project by symlinking to it, for example if you have a project called myProject do ln -s dynamicInventory-mcc2 myProject\n and then run ./myProject"
+		print "2. It is also possible that none of your VMs are allocated to myProject, please add them to the project: e.g. by running"
+		print 'nova --os-tenant-name TF_NNF --os-tenant-id 033asdda60d7046b6affdf31d14asdasb meta nodex set project_name="myProject"'
+		sys.exit()
+	else:
+		print json.dumps(inventory)
diff --git a/extra_packages/tasks/main.yml b/extra_packages/tasks/main.yml
new file mode 100644
index 00000000..5a8c8764
--- /dev/null
+++ b/extra_packages/tasks/main.yml
@@ -0,0 +1,20 @@
+---
+- name: "Install extra packages"
+  yum: "name={{ item }} state=present"
+  with_items: "{{ pkgs }}"
+  become: true
+  ignore_errors: true
+  when: ansible_os_family == 'RedHat'
+
+- name: "Check fusermount user access permission"
+  shell: fusermount --version 
+  ignore_errors: true
+  register: fusermount_user_access_error
+  when: ansible_os_family == 'RedHat'
+
+- name: "Fix fusermount user access permission"
+  file: path=/bin/fusermount mode="o=rx"
+  become: true
+  when: ansible_os_family == 'RedHat' and fusermount_user_access_error.failed
+
+
diff --git a/extra_packages/vars/main.yml b/extra_packages/vars/main.yml
new file mode 100644
index 00000000..b70d611e
--- /dev/null
+++ b/extra_packages/vars/main.yml
@@ -0,0 +1,254 @@
+pkgs:
+ - atlas
+ - babel
+ - bc
+ - bitmap-console-fonts
+ - bitmap-fangsongti-fonts
+ - bitmap-fixed-fonts
+ - bitmap-fonts-compat
+ - bitmap-lucida-typewriter-fonts
+ - bitmap-miscfixed-fonts
+ - blas
+ - compiz-gnome
+ - db4-cxx
+ - db4-devel
+ - dejavu-sans-fonts
+ - enchant
+ - eog
+ - evince
+ - finger
+ - fftw
+ - file-roller
+ - firefox
+ - firstboot
+ - fltk
+ - fontconfig
+ - fontpackages-filesystem
+ - freeglut
+ - ftgl
+ - fuse-sshfs
+ - gd
+ - gdbm-devel
+ - gdm
+ - gedit
+ - gettext
+ - gettext-libs
+ - ghostscript-fonts
+ - giflib
+ - giflib
+ - glibc
+ - glibc
+ - glx-utils
+ - gnome-applets
+ - gnome-backgrounds
+ - gnome-bluetooth-libs
+ - gnome-desktop
+ - gnome-disk-utility
+ - gnome-disk-utility-libs
+ - gnome-disk-utility-ui-libs
+ - gnome-doc-utils-stylesheets
+ - gnome-icon-theme
+ - gnome-keyring
+ - gnome-keyring-pam
+ - gnome-mag
+ - gnome-media
+ - gnome-media-libs
+ - gnome-menus
+ - gnome-panel
+ - gnome-panel-libs
+ - gnome-python2
+ - gnome-python2-applet
+ - gnome-python2-bonobo
+ - gnome-python2-canvas
+ - gnome-python2-desktop
+ - gnome-python2-extras
+ - gnome-python2-gconf
+ - gnome-python2-gnome
+ - gnome-python2-gnomevfs
+ - gnome-python2-libegg
+ - gnome-python2-libwnck
+ - gnome-screensaver
+ - gnome-session
+ - gnome-session-xsession
+ - gnome-settings-daemon
+ - gnome-speech
+ - gnome-system-monitor
+ - gnome-terminal
+ - gnome-themes
+ - gnome-user-docs
+ - gnome-user-share
+ - gnome-utils
+ - gnome-utils-libs
+ - gnome-vfs2
+ - gnome-vfs2-smb
+ - graphviz
+ - gsl
+ - gtkglext-libs
+ - gtksourceview2
+ - gvfs-fuse
+ - hal
+ - hdf
+ - hdf
+ - hdf5
+ - ImageMagick
+ - ImageMagick-c++
+ - inotify-tools
+ - java-1.7.0-openjdk
+ - jline
+ - lapack
+ - leafpad
+ - libblkid
+ - libdrm
+ - libfontenc
+ - libgail-gnome
+ - libgnome
+ - libgnomecanvas
+ - libgnomekbd
+ - libgnomeui
+ - libICE
+ - libjpeg
+ - libopenraw-gnome
+ - libSM
+ - libuuid
+ - libX11
+ - libXau
+ - libXaw
+ - libxcb
+ - libXext
+ - libXext-devel
+ - libXfont
+ - libXi
+ - libXinerama
+ - libxml2
+ - libxml2-python
+ - libXp
+ - libXpm
+ - libXt
+ - libXtst
+ - mailx
+ - man
+ - mod_ssl
+ - mysql-server
+ - nagios-plugins
+ - nagios-plugins-disk
+ - nagios-plugins-load
+ - nagios-plugins-nrpe
+ - nagios-plugins-perl
+ - nagios-plugins-users
+ - nautilus
+ - nautilus-open-terminal
+ - neon
+ - nrpe
+ - nss-softokn-freebl
+ - numactl
+ - numpy
+ - numpy-f2py
+ - openmotif
+ - openssh-askpass
+ - openssl098e
+ - oxygen-icon-theme
+ - perl-devel
+ - perl-ExtUtils-MakeMaker
+ - perl-ExtUtils-ParseXS
+ - perl-HTML-Parser
+ - perl-HTML-Tagset 
+ - perl-Test-Harness
+ - perl-Time-HiRes
+ - pexpect
+ - php
+ - php-cli
+ - php-common
+ - php-ldap
+ - php-mysql
+ - php-pdo
+ - php-pear
+ - pinentry-gtk
+ - plymouth-system-theme
+ - polkit-gnome
+ - postgresql
+ - postgresql-contrib
+ - postgresql-devel
+ - postgresql-libs
+ - postgresql-server
+ - PyGreSQL
+ - pygtksourceview
+ - python-babel
+ - python-dateutil
+ - python-devel
+ - python-ldap
+ - python-matplotlib
+ - python-nose
+ - python-paramiko
+ - python-pmw
+ - python-setuptools
+ - python-psycopg2
+ - pytz
+ - qhull
+ - qt
+ - qt3
+ - qt-sqlite
+ - qt-x11
+ - rhino
+ - rsync 
+ - samba-client
+ - scipy
+ - spice-vdagent
+ - suitesparse
+ - system-gnome-theme
+ - tcl
+ - tcsh
+ - Terminal
+ - texlive-texmf-errata-fonts
+ - texlive-texmf-fonts
+ - tk
+ - tkinter
+ - tumbler
+ - tzdata-java
+ - unixODBC
+ - unzip
+ - util-linux-ng
+ - uuid
+ - vim-X11
+ - vim-common 
+ - vim-enhanced
+ - vim-minimal
+ - wacomexpresskeys
+ - wdaemon
+ - wxBase
+ - wxGTK
+ - wxGTK-gl
+ - wxGTK-media
+ - wxpropgrid
+ - wxPython
+ - xml-common
+ - xml-commons-apis
+ - xml-commons-resolver
+ - xmlrpc-c
+ - xmlrpc-c-client
+ - xorg-x11-drivers
+ - xorg-x11-fonts-100dpi
+ - xorg-x11-fonts-75dpi
+ - xorg-x11-fonts-cyrillic
+ - xorg-x11-fonts-ethiopic
+ - xorg-x11-fonts-ISO8859-1-100dpi
+ - xorg-x11-fonts-ISO8859-14-100dpi
+ - xorg-x11-fonts-ISO8859-14-75dpi
+ - xorg-x11-fonts-ISO8859-15-100dpi
+ - xorg-x11-fonts-ISO8859-15-75dpi
+ - xorg-x11-fonts-ISO8859-1-75dpi
+ - xorg-x11-fonts-ISO8859-2-100dpi
+ - xorg-x11-fonts-ISO8859-2-75dpi
+ - xorg-x11-fonts-ISO8859-9-100dpi
+ - xorg-x11-fonts-ISO8859-9-75dpi
+ - xorg-x11-fonts-misc
+ - xorg-x11-fonts-Type1
+ - xorg-x11-font-utils
+ - xorg-x11-server-utils
+ - xorg-x11-server-Xorg
+ - xorg-x11-util-macros
+ - xorg-x11-utils
+ - xorg-x11-xauth
+ - xorg-x11-xinit
+ - xvattr
+ - yum-utils
+ - zip
diff --git a/headNode.yaml b/headNode.yaml
new file mode 100644
index 00000000..d8fc004d
--- /dev/null
+++ b/headNode.yaml
@@ -0,0 +1,44 @@
+--- 
+description: " A simple template to boot a 3 node cluster"
+heat_template_version: 2013-05-23
+parameters:
+ image_id:
+  type: string
+  label: Image ID
+  description: Image to be used for compute instance
+  default: a5e74703-f343-415a-aa23-bd0f0aacfc9e
+ key_name:
+  type: string
+  label: Key Name
+  description: Name of key-pair to be used for compute instance
+  default: shahaan
+ availability_z:
+  type: string
+  label: Availability Zone
+  description: Availability Zone to be used for launching compute instance
+  default: monash-01
+resources:
+  headNode:
+   type: "OS::Nova::Server"
+   properties:
+    availability_zone: { get_param: availability_z }
+    flavor: m1.small
+    image: { get_param: image_id }
+    key_name: { get_param: key_name }
+    security_groups: [OpenVPN, NSF, default]
+    metadata:
+     ansible_host_group: headNode
+     ansible_ssh_user: ec2-user
+     ansible_ssh_private_key_file: /home/sgeadmin/.ssh/shahaan.pem
+  headVolume:
+   type: OS::Cinder::Volume
+   properties:
+    availability_zone: { get_param: availability_z }
+    description: Volume that will attach the headNode
+    name: headNodeVolume
+    size: 50
+  volumeAttachment:
+   type: OS::Cinder::VolumeAttachment
+   properties:
+    instance_uuid: { get_resource: headNode }
+    volume_id: { get_resource: headVolume }
diff --git a/installNFS.yml b/installNFS.yml
new file mode 100644
index 00000000..6568c450
--- /dev/null
+++ b/installNFS.yml
@@ -0,0 +1,24 @@
+--- 
+- 
+  hosts: openvpn-servers
+  remote_user: ec2-user
+  roles:
+    #- OpenVPN-Server 
+    - nfs-server
+  become: true
+  vars: 
+    x509_ca_server: vm-118-138-240-224.erc.monash.edu.au
+- 
+  hosts: openvpn-clients
+  remote_user: ec2-user
+  roles:
+    #- easy-rsa-common
+    #- easy-rsa-certificate 
+    #- OpenVPN-Client
+    - syncExports
+    - nfs-client
+  become: true
+  vars: 
+    x509_ca_server: vm-118-138-240-224.erc.monash.edu.au
+    openvpn_servers: ['vm-118-138-240-224.erc.monash.edu.au']
+    nfs_server: "vm-118-138-240-224.erc.monash.edu.au"
diff --git a/playbook/cvl2.yml b/playbook/cvl2.yml
new file mode 100644
index 00000000..908e3af3
--- /dev/null
+++ b/playbook/cvl2.yml
@@ -0,0 +1,192 @@
+---
+- hosts: all 
+  vars_files:
+    - massive_var/main.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+    slurmctrl: "{{ groups['ManagementNodes'][0] }}"
+    slurmqueues:
+      - {name: batch, group: ComputeNodes, default: true}
+  roles:
+    - { role: etcHosts,  domain: "{{ ldapDomain }}" }
+
+- hosts: 'ManagementNodes'
+  vars_files:
+    - massive_var/main.yml
+    - massive_var/package.yml
+    - massive_var/passwords.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+    slurmctrl: "{{ groups['ManagementNodes'][0] }}"
+    slurmqueues:
+      - {name: batch, group: ComputeNodes, default: true}
+      - {name: dev, group: ComputeNodesDev, default: false}
+      - {name: multicore, group: ComputeNodesLarge, default: false}
+    mkFileSystems:
+        - {fstype : 'ext4', dev: '/dev/vdc1', opts: ''}
+        - {fstype : 'ext4', dev: '/dev/vdc2', opts: ''}
+        - {fstype : 'ext4', dev: '/dev/vdc3', opts: ''}
+    mountFileSystems:
+        - {fstype : 'ext4', dev: '/dev/vdc1', opts: 'defaults,nofail', name: '/cvl/scratch'}
+        - {fstype : 'ext4', dev: '/dev/vdc2', opts: 'defaults,nofail', name: '/cvl/home'}
+        - {fstype : 'ext4', dev: '/dev/vdc3', opts: 'defaults,nofail', name: '/cvl/local'}
+  roles:
+    - { role: easy-rsa-CA }
+    - { role: OpenVPN-Server }
+    - { role: ntp }
+    - { role: openLdapClient }
+    - { role: slurm-build }
+    - { role: nfs-server, configDiskDevice: true }
+    - { role: slurm, slurm_use_vpn: true}
+    - { role: installPackage, yumGroupPackageList: ['CVL Pre-installation', 'CVL Base Packages'], cliCopy: {'run': 'cp -r /usr/local/Modules/modulefiles/cvl /usr/local/Modules/modulefiles/massive', 'check': '/usr/local/Modules/modulefiles/massive'} }
+
+- hosts: all 
+  vars_files:
+    - massive_var/main.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+  roles:
+    - { role: etcHosts, domain: "{{ ldapDomain }}" }
+
+- hosts: 'ComputeNodes*'
+  vars_files:
+    - massive_var/main.yml
+    - massive_var/passwords.yml
+    - massive_var/package.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+  roles:
+    - { role: OpenVPN-Client }
+
+- hosts: 'LoginNodes'
+  vars_files:
+    - massive_var/main.yml
+    - massive_var/passwords.yml
+    - massive_var/package.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+  roles:
+    - { role: OpenVPN-Client }
+
+- hosts: all 
+  vars_files:
+    - massive_var/main.yml
+    - massive_var/passwords.yml
+    - massive_var/package.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    nfs_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+    groupList:
+      - { name : 'ComputeNodes', interface : 'tun0' }
+      - { name : 'ComputeNodesDev', interface : 'tun0' }
+      - { name : 'ComputeNodesLarge', interface : 'tun0' }
+      - { name : 'LoginNodes', interface : 'tun0' }
+    exportList:
+      - { name: '/usr/local', src: '/cvl/local', fstype: 'nfs4', opts: 'defaults,ro,nofail', interface : 'tun0', srvopts: 'ro,sync' }
+      - { name: '/home', src: '/cvl/home', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' }
+      - { name: '/scratch', src: '/cvl/scratch', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' }
+  roles:
+    - { role: etcHosts, domain: "{{ ldapDomain }}" }
+    - { role: syncExports }
+
+- hosts: 'ComputeNodes'
+  vars_files:
+    - massive_var/main.yml
+    - massive_var/passwords.yml
+    - massive_var/package.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+    slurmctrl: "{{ groups['ManagementNodes'][0] }}"
+    slurmqueues:
+      - {name: batch, group: ComputeNodes, default: true}
+    nfs_server: "{{ groups['ManagementNodes'][0] }}"
+    groupList:
+      - { name : 'ComputeNodes', interface : 'tun0' }
+    exportList: 
+      - { name: '/usr/local', src: '/cvl/local', fstype: 'nfs4', opts: 'defaults,ro,nofail', interface : 'tun0', srvopts: 'ro,sync' } 
+      - { name: '/home', src: '/cvl/home', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' } 
+      - { name: '/scratch', src: '/cvl/scratch', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' }
+  roles:
+    - { role: ntp }
+    - { role: openLdapClient }
+    - { role: nfs-client }
+    - { role: slurm, slurm_use_vpn: true}
+    - { role: installPackage, preInstallation: "umount /usr/local", postInstallation: "mount /usr/local", yumGroupPackageList: ["CVL Pre-installation", "CVL Base Packages"], cliFileCopy: {'src': '/tmp/gconf_path', 'dest': '/etc/gconf/2/path'} }
+
+- hosts: 'ComputeNodesDev'
+  vars_files:
+    - massive_var/main.yml
+    - massive_var/passwords.yml
+    - massive_var/package.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+    slurmctrl: "{{ groups['ManagementNodes'][0] }}"
+    slurmqueues:
+      - {name: dev, group: ComputeNodesDev, default: false}
+    nfs_server: "{{ groups['ManagementNodes'][0] }}"
+    groupList:
+      - { name : 'ComputeNodes', interface : 'tun0' }
+    exportList: 
+      - { name: '/home', src: '/cvl/home', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' } 
+      - { name: '/scratch', src: '/cvl/scratch', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' }
+  roles:
+    - { role: ntp }
+    - { role: openLdapClient }
+    - { role: nfs-client }
+    - { role: slurm, slurm_use_vpn: true}
+    - { role: installPackage, preInstallation: "umount /usr/local", postInstallation: "mount /usr/local", yumGroupPackageList: ["CVL Pre-installation", "CVL Base Packages"], cliFileCopy: {'src': '/tmp/gconf_path', 'dest': '/etc/gconf/2/path'} }
+
+- hosts: 'ComputeNodesLarge'
+  vars_files:
+    - massive_var/main.yml
+    - massive_var/passwords.yml
+    - massive_var/package.yml
+  vars:
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+    slurmctrl: "{{ groups['ManagementNodes'][0] }}"
+    slurmqueues:
+      - {name: multicore, group: ComputeNodesLarge, default: false}
+    nfs_server: "{{ groups['ManagementNodes'][0] }}"
+    groupList:
+      - { name : 'ComputeNodes', interface : 'tun0' }
+    exportList: 
+      - { name: '/usr/local', src: '/cvl/local', fstype: 'nfs4', opts: 'defaults,ro,nofail', interface : 'tun0', srvopts: 'ro,sync' }
+      - { name: '/home', src: '/cvl/home', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' } 
+      - { name: '/scratch', src: '/cvl/scratch', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' }
+  roles:
+    - { role: ntp }
+    - { role: openLdapClient }
+    - { role: nfs-client }
+    - { role: slurm, slurm_use_vpn: true}
+    - { role: installPackage, preInstallation: "umount /usr/local", postInstallation: "mount /usr/local", yumGroupPackageList: ["CVL Pre-installation", "CVL Base Packages"], cliFileCopy: {'src': '/tmp/gconf_path', 'dest': '/etc/gconf/2/path'} }
+
+- hosts: 'LoginNodes'
+  vars_files:
+    - massive_var/main.yml
+    - massive_var/passwords.yml
+  vars:
+    groupList:
+      - { name : 'ComputeNodes', interface : 'tun0' }
+    x509_ca_server: "{{ groups['ManagementNodes'][0] }}"
+    openvpn_servers: "{{ groups['ManagementNodes'] }}"
+    slurmctrl: "{{ groups['ManagementNodes'][0] }}"
+    slurmqueues:
+      - {name: batch, group: ComputeNodes, default: true}
+    exportList: 
+      - { name: '/home', src: '/cvl/home', fstype: 'nfs4', opts: 'defaults,nofail', interface : 'tun0', srvopts: 'rw,root_squash,sync' } 
+  roles:
+    - { role: ntp }
+    - { role: openLdapClient }
+    - { role: nfs-client }
+    - { role: slurm, slurm_use_vpn: true}
+    - { role: installPackage, importRepo: { command: "wget http://cvlrepo.massive.org.au/repo/cvl.repo -O", destination: "/etc/yum.repos.d/cvl.repo" }, yumGroupPackageList: ['CVL Pre-installation', 'CVL Base Packages'], cliCopy: {'run': 'cp -r /usr/local/Modules/modulefiles/cvl /usr/local/Modules/modulefiles/massive', 'check': '/usr/local/Modules/modulefiles/massive'} }
+
diff --git a/playbook/massive_var/main.yml b/playbook/massive_var/main.yml
new file mode 100644
index 00000000..22b78452
--- /dev/null
+++ b/playbook/massive_var/main.yml
@@ -0,0 +1,71 @@
+---
+ldapServerHostIpLine: "130.220.209.234 m2-w.massive.org.au"
+ldapCaCertSrc: "/tmp/m1-w-ca.pem" 
+countryName: "AU"
+reginalName: "Victoria"
+cityName: "Melbourne"
+organizationName: "Monash University"
+emailAddress: "help@massive.org.au"
+organizationUnit: "MASSIVE"
+nfsServerIpAddress: m2-login3.massive.org.au
+
+x509_cert_file: "/etc/openvpn/certs/{{ x509_ca_server }}.crt"
+x509_key_file: "/etc/openvpn/private/{{ x509_ca_server }}.key"
+x509_cacert_file: "/etc/ssl/certs/ca_{{ x509_ca_server }}.crt"
+###x509_common_name: "{{ x509_ca_server }}CommonName"
+x509_common_name: "{{ inventory_hostname }}"
+x509_csr_args: "--server"
+x509_sign_args: "{{ x509_csr_args }}"
+dhparms_file: "/etc/openvpn/private/dh.pem"
+server_network: "10.8.0.0"
+server_netmask: "255.255.255.0"
+
+slurm_version: 14.11.2
+munge_version: 0.5.11
+userRelocationName: "ec2-user"
+userNewHome: "/local_home"
+#nfs_type: "nfs4"
+#nfs_options: "defaults"
+#nfs_server: "m2-login3.massive.org.au"
+ldapServerHost: "130.220.209.234 m2-w.massive.org.au"
+ldapDomain: "massive.org.au"
+ldapURI: "ldaps://m2-w.massive.org.au:1637/"
+ldapBindDN: "cn=ldapbind,cn=users,dc=massive,dc=org,dc=au" 
+ldapBase: "cn=users,dc=massive,dc=org,dc=au"
+ldapUserClass: "user"
+ldapUserHomeDirectory: "unixHomeDirectory"
+ldapUserPricipal: "userPrincipalName"
+ldapGroupBase: "ou=groups,dc=massive,dc=org,dc=au"
+tlsCaCertDirectory: "/etc/openldap/certs"
+ldapCaCertFile: "/etc/openldap/certs/m1-w-ca.pem"
+ldapCaCertFileSource: "/tmp/cvl2server/m1-w-ca.pem"
+cacertFile: "cacert.pem"
+#domain: "cvl.massive.org.au"
+domain: "massive.org.au"
+ldapRfc2307: |
+  ldap_schema = rfc2307
+  ldap_search_base = cn=users,dc=massive,dc=org,dc=au
+  ldap_user_search_base = cn=users,dc=massive,dc=org,dc=au
+  ldap_user_object_class = user
+  ldap_user_home_directory = unixHomeDirectory
+  ldap_user_principal = userPrincipalName
+  ldap_user_name = uid
+  ldap_group_search_base = ou=groups,dc=massive,dc=org,dc=au
+  ldap_group_object_class = group
+  ldap_access_order = expire
+  ldap_account_expire_policy = ad
+
+ldapRfc2307Pam: |
+  scope sub
+  nss_base_passwd cn=users,dc=massive,dc=org,dc=au?sub
+  nss_base_shadow cn=users,dc=massive,dc=org,dc=au?sub
+  nss_base_group cn=users,dc=massive,dc=org,dc=au?sub
+  nss_map_objectclass posixAccount user
+  nss_map_objectclass shadowAccount user
+  nss_map_objectclass posixGroup group
+  nss_map_attribute homeDirectory unixHomeDirectory
+  nss_map_attribute uniqueMember member
+  nss_map_attribute shadowLastChange pwdLastSet
+  pam_login_attribute sAMAccountName
+  pam_filter objectClass=User
+  pam_password ad
diff --git a/playbook/massive_var/package.yml b/playbook/massive_var/package.yml
new file mode 100644
index 00000000..26d13db3
--- /dev/null
+++ b/playbook/massive_var/package.yml
@@ -0,0 +1,8 @@
+---
+importRepo: { command: "wget http://cvlrepo.massive.org.au/repo/cvl.repo -O", destination: "/etc/yum.repos.d/cvl.repo" }
+#yumGroupPackageList:
+#  - CVL Pre-installation
+#  - CVL Base Packages
+#  - CVL System
+#  - CVL System Extension
+#  - CVL General Imaging Tools
diff --git a/playbook/readme.txt b/playbook/readme.txt
new file mode 100644
index 00000000..59ab5815
--- /dev/null
+++ b/playbook/readme.txt
@@ -0,0 +1 @@
+Files in the playbook directory should be used as examples for the reference only.
diff --git a/roles/commonVars/vars/readme.txt b/roles/commonVars/vars/readme.txt
new file mode 100644
index 00000000..8faa3c3c
--- /dev/null
+++ b/roles/commonVars/vars/readme.txt
@@ -0,0 +1,2 @@
+---
+domain: testdomain.massive.org.au
diff --git a/roles/enable_root/tasks/main.yml b/roles/enable_root/tasks/main.yml
new file mode 100644
index 00000000..660c74f2
--- /dev/null
+++ b/roles/enable_root/tasks/main.yml
@@ -0,0 +1,3 @@
+- name: add key to root ssh
+  template: dest=/root/.ssh/authorized_keys mode=600 owner=root group=root src=authorized_keys.j2
+  become: true
diff --git a/roles/enable_root/templates/authorized_keys.j2 b/roles/enable_root/templates/authorized_keys.j2
new file mode 100644
index 00000000..f7eff2cc
--- /dev/null
+++ b/roles/enable_root/templates/authorized_keys.j2
@@ -0,0 +1,11 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvjn5cQuMkqTo04ZnkuDXfUBeAt7oZ6xrT4phfMemqx12dDqLyFrMgUWOoVMFj+TNyR5M8WOCI6CRT6EXOMtqaxhPtWB1QlDNo0Ml8xTzSKckUO0EhdqNKh+nlQfVeaVIx0DZZeWWNpPCrKPCM4TSAXXiwtZuImd6/Zo4RI1x+oTcFR9zQulUGUuX8rf7+4c/oKr58B+La8bXP8QujtfLm29pl1kawSouCfdxt93wRfbISM7mGs/WqzttRXL9m5AeOMuo5S4Ia0GPMcIEUfsQhEyEU7tiTpEq5lDdf6H7a9SlHXzhd9f2Dn3mlv3mmQHaGBJvUuWmVwydxkdtCRQhOQ== root@m2-m
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA2xrAkFRdYBpYs14AYSzdPFcIOt2zKXIgjPpyj/6eg/yl3y8N84T9VNw9ATRzb3+PJEw1lOfah6xLkFl7FueT6359y14c7wkNByGHgcL022SludkhM2zBe/3ebhcBs11L4Z725rqVnGDSKdKuwZjbCmUtu/nHwGYU/BnLKbQXMVyq53L5cbIyWGfvItPnwCF2ZMy1v0lmnFs1O3qDK9U/qcwc/77MTB0Z/ey0zsoXvmxjkdYr+zgQLRNm2+fkCXn+ZorbeDwWjhHE21arhMym5x3VG0XU2Ob9nL1Z2xEGQVSnBVWeadTMNzkfM8U07Md2tSOIC5B3ePETxk97puxbEQ== root@m2-m
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPijQ597uLqEPAvVZXQlSjrUfFl2h7SRBTCRhH4hQJMVu55dhFYiojJZ0tjjV3jTcgWs1AsyRp3wDtNp8iQxbwEY2JPxCOjNuH0et4I/y3y6VUjcVWanSaIkdPf5AFNb9KIXo3Hvdyvav8SfFpioRQ0FKp8SZs1JYXpuQ0mZY26oKCKcNsWXv9ZN7knUN0xvYNMycpCnI2Nl666Zrs0gGyJ6e+Xq5bpk1lm8nuK9q52bTRjxqtdEBuSGwkZea+NBJzpYw5rEucteQI66y6tzFuYJk2WC4bUifffIxnkQXKYVynJg1MJ2CGI69r9hXt9eUtH3WrDxrJGmCau8jD3lib hines@sparge
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnakq6Lgq2n6yjcMaC7xQXMDMRdN33T6mPCqRy+TPdu0aPvVty0UFeAWsCyTxHeVfst9Vr0HwRRBvNihp1CJuOWGbk0H5a8yALDhLqoHazv2jlMQcLDgTktw0Jgo38+tcBShJyey1iHh8X5WgsS5/hgxR3OzoNBEzqzHUidMO/EI0ahNlM60l8EYL8Ww799NmPgqdPbwxK9nHsoFmx/NKhnUdronSg33L0CJZT3t2fccXAq+4Pbm7uYEkL3T/NgMdgpG5mKS3mKDtKyyKm2gOf3fVzExFew2etBxB3ANPEWvSuJ2XwXQv8sFE1722XQVR4RFgilCWUqXSN7EmqoHkNQ== jupiter@cvlproject
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAsBtPRJtDJzyW+Utu0v03wklUpvzS5c1E34ysGDMepGU8VT1phJQ2EwRPWVLdRjVHnuhrEeeUHMyQwOtLEdvTPFnw5u/4bHQ+37iwtAeTV6oyPARJVzJLRGuDUuFdkQbXN7xxi/0KUljWgswLN34UV+p5PL79kQlErh1QCN06z5k=
+
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA2xrAkFRdYBpYs14AYSzdPFcIOt2zKXIgjPpyj/6eg/yl3y8N84T9VNw9ATRzb3+PJEw1lOfah6xLkFl7FueT6359y14c7wkNByGHgcL022SludkhM2zBe/3ebhcBs11L4Z725rqVnGDSKdKuwZjbCmUtu/nHwGYU/BnLKbQXMVyq53L5cbIyWGfvItPnwCF2ZMy1v0lmnFs1O3qDK9U/qcwc/77MTB0Z/ey0zsoXvmxjkdYr+zgQLRNm2+fkCXn+ZorbeDwWjhHE21arhMym5x3VG0XU2Ob9nL1Z2xEGQVSnBVWeadTMNzkfM8U07Md2tSOIC5B3ePETxk97puxbEQ== root@m2-m
+
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEApJTDPfappcYbNE3Z0+5Vsm4Sw2xD3PdcW+V1w6X6tpebG/bpUhnn9XsALkZYyKttql2vV3bqL6Fx5ZAFhHRhH0exdQEgc8hSvpX5gCCCUNqrL+mP8f4S59E0ha5+nBmMaf4WABHiZYfeoGhn7HHNQY0Up/qfzDPSvWo+ZaVQAqXcYLGTxaP70yywHOYABakJtBVKKkI1YPu83HFDVfw1PoYVaS5GAmEscq6nwoyC0Jm/pDirUtMoRibG2iiV6uYKQDvWrO9fBrGmavpmUT/ECtmcnrWj7V9zXzSi17HJhkq6gYc68iu6h8TBNJrIUE9Kgi07aWFRM9fbIM1ZVD/aEQ== ec2-user@cvl23server
+
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpuXUhr1Vzl1WljuFYSFIArU8wtlKWpkVLF4hCUb4dVWNEPU/FM1gkg4hPH+rTNPManRAJ8vxiCtMgLtvae2j1elO0edkM6BZReVDFMYo0fZVBbVR8fzvXRWD5ArXJeNI2uZ4fYTil3SoC3N0n+ySjqFriIkcBpxthKVcoOlK+yccOvCPGNWgqcSGFfMEKTR8P18ED83i7sOF2nzpH0RBo2/N7ry5Gzvfw859W7KScw/3uI7fzog6hW/P4niOQIZfG56enHHos0l7oymxeQRiYITqvf9Es1VatEfybk+tJhTVf1LcIqoM9v9bc0yd6QqST0+6ZiTJXCQCthmS0JVX1 hines@tun
diff --git a/roles/gpu_update/files/NVIDIA-Linux-x86_64-352.93.run.REMOVED.git-id b/roles/gpu_update/files/NVIDIA-Linux-x86_64-352.93.run.REMOVED.git-id
new file mode 100644
index 00000000..38a7bca1
--- /dev/null
+++ b/roles/gpu_update/files/NVIDIA-Linux-x86_64-352.93.run.REMOVED.git-id
@@ -0,0 +1 @@
+48758c1a73f2a27c14f351a99923c3aa6e4c0cdf
\ No newline at end of file
diff --git a/scripts/get_or_make_passwd.py b/scripts/get_or_make_passwd.py
new file mode 100755
index 00000000..5242f1f9
--- /dev/null
+++ b/scripts/get_or_make_passwd.py
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+import random
+import sys
+import string
+def get_passwd(f,passname):
+    f.seek(0)
+    for line in f.readlines():
+        (key,passwd)=line.split(':')
+        if key==passname:
+            f.close()
+            return passwd.rstrip()
+    return None
+
+def mk_passwd(f,passname):
+    passwd=''.join(random.choice(string.ascii_uppercase + string.digits+string.ascii_lowercase) for _ in range(16))
+    f.write("%s:%s\n"%(passname,passwd))
+    return passwd
+   
+try:
+    f=open('../passwd.txt','at+')
+except:
+    f=open('./passwd.txt','at+')
+passname = sys.argv[1]
+passwd = get_passwd(f,passname)
+if passwd == None:
+    passwd = mk_passwd(f,passname)
+print passwd
+f.close()
diff --git a/scripts/userData.sh b/scripts/userData.sh
new file mode 100644
index 00000000..545e9224
--- /dev/null
+++ b/scripts/userData.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+mkdir /local_home
+usermod -m -d /local_home/ec2-user ec2-user
+
diff --git a/syncNFS.yml b/syncNFS.yml
new file mode 100644
index 00000000..9095bfc8
--- /dev/null
+++ b/syncNFS.yml
@@ -0,0 +1,14 @@
+--- 
+- 
+  hosts: openvpn-clients
+  remote_user: ec2-user
+  roles:
+    - syncExports
+    - nfs-client
+  become: true
+  vars: 
+    nfs_server: "vm-118-138-240-224.erc.monash.edu.au"
+    openvpn_servers: 
+      - vm-118-138-240-224.erc.monash.edu.au
+    x509_ca_server: vm-118-138-240-224.erc.monash.edu.au
+
diff --git a/templates/easy-rsa/vars.j2 b/templates/easy-rsa/vars.j2
new file mode 100644
index 00000000..77adaead
--- /dev/null
+++ b/templates/easy-rsa/vars.j2
@@ -0,0 +1,80 @@
+# easy-rsa parameter settings
+
+# NOTE: If you installed from an RPM,
+# don't edit this file in place in
+# /usr/share/openvpn/easy-rsa --
+# instead, you should copy the whole
+# easy-rsa directory to another location
+# (such as /etc/openvpn) so that your
+# edits will not be wiped out by a future
+# OpenVPN package upgrade.
+
+# This variable should point to
+# the top level of the easy-rsa
+# tree.
+export EASY_RSA="/etc/easy-rsa/2.0"
+
+#
+# This variable should point to
+# the requested executables
+#
+export OPENSSL="openssl"
+export PKCS11TOOL="pkcs11-tool"
+export GREP="grep"
+
+
+# This variable should point to
+# the openssl.cnf file included
+# with easy-rsa.
+export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
+
+# Edit this variable to point to
+# your soon-to-be-created key
+# directory.
+#
+# WARNING: clean-all will do
+# a rm -rf on this directory
+# so make sure you define
+# it correctly!
+export KEY_DIR="$EASY_RSA/keys"
+
+# Issue rm -rf warning
+echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
+
+# PKCS11 fixes
+export PKCS11_MODULE_PATH="dummy"
+export PKCS11_PIN="dummy"
+
+# Increase this to 2048 if you
+# are paranoid.  This will slow
+# down TLS negotiation performance
+# as well as the one-time DH parms
+# generation process.
+export KEY_SIZE={{ keySize }}
+
+# In how many days should the root CA key expire?
+export CA_EXPIRE=3650
+
+# In how many days should certificates expire?
+export KEY_EXPIRE=3650
+
+# These are the default values for fields
+# which will be placed in the certificate.
+# Don't leave any of these fields blank.
+export KEY_COUNTRY={{ countryName }}
+export KEY_PROVINCE={{ reginalName }} 
+export KEY_CITY={{ cityName }} 
+export KEY_ORG={{ organizationName }} 
+export KEY_EMAIL={{ emailAddress }} 
+export KEY_OU={{ organizationUnit }}
+
+# X509 Subject Field
+export KEY_NAME="EasyRSA"
+
+# PKCS11 Smart Card
+# export PKCS11_MODULE_PATH="/usr/lib/changeme.so"
+# export PKCS11_PIN=1234
+
+# If you'd like to sign all keys with the same Common Name, uncomment the KEY_CN export below
+# You will also need to make sure your OpenVPN server config has the duplicate-cn option set
+# export KEY_CN="CommonName"
-- 
GitLab