From c750bc95a70a12da333550aad36b950f254946d5 Mon Sep 17 00:00:00 2001
From: Chris Hines <chris.hines@monash.edu>
Date: Thu, 20 Nov 2014 04:25:16 +0000
Subject: [PATCH] ldap and karaage roles

---
 roles/karaage2.7/files/get_ldap_url.py        |  28 ++
 roles/karaage2.7/handlers/main.yml            |   8 +
 roles/karaage2.7/meta/main.yml                |   3 +
 roles/karaage2.7/tasks/install_via_apt.yml    |  29 ++
 roles/karaage2.7/tasks/main.yml               | 308 ++++++++++++++++++
 .../tasks/set_mysql_root_password.yml         |  13 +
 roles/karaage2.7/templates/groups.j2          |   4 +
 roles/karaage2.7/templates/ldap_conf.j2       |   1 +
 roles/karaage2.7/templates/main_cf.j2         |  39 +++
 .../templates/set_root_passwd_sql.j2          |   3 +
 roles/karaage2.7/templates/vpac_list.j2       |   2 +
 roles/karaage2.7/vars/Debian_7.6_x86_64.yml   |  11 +
 roles/ldapserver/meta/main.yml                |   3 +
 roles/ldapserver/tasks/main.yml               | 197 +++++++++++
 roles/ldapserver/templates/accounts_ldif.j2   |   2 +
 roles/ldapserver/templates/acls_ldif.j2       |   6 +
 roles/ldapserver/templates/binddn_ldif.j2     |   5 +
 .../templates/default_ppolicy_ldif.j2         |   6 +
 roles/ldapserver/templates/groups_ldif.j2     |   2 +
 roles/ldapserver/templates/manager_ldif.j2    |  10 +
 .../templates/ppolicy_moduleload_ldif.j2      |   5 +
 .../templates/ppolicy_overlay_ldif.j2         |   7 +
 roles/ldapserver/templates/pwpolicies_ldif.j2 |   4 +
 roles/ldapserver/templates/root_ldif.j2       |   5 +
 roles/ldapserver/templates/ssl_ldif.j2        |   9 +
 roles/ldapserver/vars/CentOS_6.5_x86_64.yml   |   5 +
 roles/ldapserver/vars/main.yml                |   4 +
 scripts/make_passwords.py                     |  45 +++
 28 files changed, 764 insertions(+)
 create mode 100755 roles/karaage2.7/files/get_ldap_url.py
 create mode 100644 roles/karaage2.7/handlers/main.yml
 create mode 100644 roles/karaage2.7/meta/main.yml
 create mode 100644 roles/karaage2.7/tasks/install_via_apt.yml
 create mode 100644 roles/karaage2.7/tasks/main.yml
 create mode 100644 roles/karaage2.7/tasks/set_mysql_root_password.yml
 create mode 100644 roles/karaage2.7/templates/groups.j2
 create mode 100644 roles/karaage2.7/templates/ldap_conf.j2
 create mode 100644 roles/karaage2.7/templates/main_cf.j2
 create mode 100644 roles/karaage2.7/templates/set_root_passwd_sql.j2
 create mode 100644 roles/karaage2.7/templates/vpac_list.j2
 create mode 100644 roles/karaage2.7/vars/Debian_7.6_x86_64.yml
 create mode 100644 roles/ldapserver/meta/main.yml
 create mode 100644 roles/ldapserver/tasks/main.yml
 create mode 100644 roles/ldapserver/templates/accounts_ldif.j2
 create mode 100644 roles/ldapserver/templates/acls_ldif.j2
 create mode 100644 roles/ldapserver/templates/binddn_ldif.j2
 create mode 100644 roles/ldapserver/templates/default_ppolicy_ldif.j2
 create mode 100644 roles/ldapserver/templates/groups_ldif.j2
 create mode 100644 roles/ldapserver/templates/manager_ldif.j2
 create mode 100644 roles/ldapserver/templates/ppolicy_moduleload_ldif.j2
 create mode 100644 roles/ldapserver/templates/ppolicy_overlay_ldif.j2
 create mode 100644 roles/ldapserver/templates/pwpolicies_ldif.j2
 create mode 100644 roles/ldapserver/templates/root_ldif.j2
 create mode 100644 roles/ldapserver/templates/ssl_ldif.j2
 create mode 100644 roles/ldapserver/vars/CentOS_6.5_x86_64.yml
 create mode 100644 roles/ldapserver/vars/main.yml
 create mode 100644 scripts/make_passwords.py

diff --git a/roles/karaage2.7/files/get_ldap_url.py b/roles/karaage2.7/files/get_ldap_url.py
new file mode 100755
index 0000000..65ef984
--- /dev/null
+++ b/roles/karaage2.7/files/get_ldap_url.py
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+import sys
+import json
+filename = sys.argv[1]
+ansible_hostname = sys.argv[2]
+domain = sys.argv[3]
+f=open(filename,'r')
+s=f.read()
+d=json.loads(s)
+f.close()
+hosts={}
+for group in d['groups'].keys():
+    for h in d['groups'][group]:
+        if hosts.has_key(h):
+            pass
+        else:
+            hosts[h] = {}
+
+
+url=""
+try:
+    for host in d['groups']['ldap']:
+        fqdn="%s.%s"%(host,domain)
+        url=url+"ldaps://%s"%fqdn
+except:
+    url="ldaps:///"
+print url
+	
diff --git a/roles/karaage2.7/handlers/main.yml b/roles/karaage2.7/handlers/main.yml
new file mode 100644
index 0000000..ed584cc
--- /dev/null
+++ b/roles/karaage2.7/handlers/main.yml
@@ -0,0 +1,8 @@
+---
+- name: restart apache
+  service: name=apache2 state=restarted
+  sudo: true
+
+- name: restart postfix
+  service: name=postfix state=restarted
+  sudo: true
diff --git a/roles/karaage2.7/meta/main.yml b/roles/karaage2.7/meta/main.yml
new file mode 100644
index 0000000..fea9520
--- /dev/null
+++ b/roles/karaage2.7/meta/main.yml
@@ -0,0 +1,3 @@
+---
+dependencies:
+  - { role: easy-rsa-certificate, x509_csr_args="--server" }
diff --git a/roles/karaage2.7/tasks/install_via_apt.yml b/roles/karaage2.7/tasks/install_via_apt.yml
new file mode 100644
index 0000000..4e947e7
--- /dev/null
+++ b/roles/karaage2.7/tasks/install_via_apt.yml
@@ -0,0 +1,29 @@
+---
+- name: check repo config
+  shell: ls -l /etc/apt/sources.list.d/vpac.list
+  ignore_errors: true
+  register: repoConfigured
+
+- name: add repo key
+  shell: wget http://code.vpac.org/debian/vpac-debian-key.gpg -O - | apt-key add -
+  sudo: true
+  when: repoConfigured|failed
+
+- name: template vpac.list
+  template: src=vpac_list.j2 dest=/etc/apt/sources.list.d/vpac.list
+  sudo: true
+  when: repoConfigured|failed
+
+- name: update cache
+  apt: update_cache=true
+  sudo: true
+  when: repoConfigured|failed
+  
+
+- name: install karaage
+  apt: name={{ item }} state=installed
+  sudo: true
+  with_items:
+    - karaage-admin
+    - karaage-registration
+
diff --git a/roles/karaage2.7/tasks/main.yml b/roles/karaage2.7/tasks/main.yml
new file mode 100644
index 0000000..aa90c83
--- /dev/null
+++ b/roles/karaage2.7/tasks/main.yml
@@ -0,0 +1,308 @@
+---
+- include_vars: "{{ hostvars[ansible_hostname]['ansible_distribution'] }}_{{ hostvars[ansible_hostname]['ansible_distribution_version'] }}_{{ ansible_architecture }}.yml"
+- include_vars: passwords.yml
+
+
+
+- name: install system packages apt
+  apt: name={{ item }} state=installed update_cache=true
+  sudo: true
+  with_items: system_packages
+  when: ansible_os_family == 'Debian'
+
+- name: install system packages yum
+  yum: name={{ item }} state=installed
+  sudo: true
+  with_items: system_packages
+  when: ansible_os_family == 'RedHat'
+
+- include: set_mysql_root_password.yml
+
+- include: install_via_apt.yml
+  when: ansible_os_family == 'Debian'
+
+- name: check kg secret key
+  shell: cat /etc/karaage/global_settings.py | grep "SECRET_KEY = '.*'"
+  sudo: true
+  ignore_errors: true
+  register: kg_secret_key_set
+
+- name: set kg secret key
+  shell: kg_set_secret_key
+  sudo: true
+  when: kg_secret_key_set|failed
+
+- name: mysql db
+  mysql_db: name=karaage login_user=root login_password={{ sqlrootPasswd }}
+
+- name: mysql user
+  mysql_user: name='karaage' password={{ karaageSqlPassword }} priv=karaage.*:ALL state=present login_user=root login_password={{ sqlrootPasswd }}
+
+- name: allow public karaage registrations
+  lineinfile: 
+  args:
+    dest: /etc/karaage/registration_settings.py 
+    regexp: "#ALLOW_REGISTRATIONS" 
+    line: "ALLOW_REGISTRATIONS = True" 
+    backrefs: yes
+  sudo: true
+
+# Why not template the whole of global_settings.py? 
+# Because I don't know what kg_set_secret_key does so I can't easily template my own secret key
+
+- name: chmod global_settings.py
+  file: 
+  args: 
+    path: /etc/karaage/global_settings.py
+    owner: root
+    group: "{{ wwwgroup }}"
+    mode: 0640
+  sudo: true
+
+- name: karaage settings db type
+  lineinfile: 
+  args:
+    dest: /etc/karaage/global_settings.py 
+    regexp: "        'ENGINE': 'django.db.backends.'," 
+    line: "        'ENGINE': 'django.db.backends.mysql'," 
+    backrefs: yes
+  sudo: true
+
+- name: karaage settings db db
+  lineinfile: 
+  args:
+    dest: /etc/karaage/global_settings.py 
+    regexp: "       'NAME': ''," 
+    line: "        'NAME': 'karaage'," 
+    backrefs: yes
+  sudo: true
+
+- name: karaage settings db user
+  lineinfile: 
+  args:
+    dest: /etc/karaage/global_settings.py 
+    regexp: "       'USER': ''," 
+    line: "        'USER': 'karaage'," 
+    backrefs: yes
+  sudo: true
+
+- name: karaage settings db password
+  lineinfile: 
+  args:
+    dest: /etc/karaage/global_settings.py 
+    regexp: "       'PASSWORD': ''," 
+    line: "        'PASSWORD': '{{ karaageSqlPassword }}'," 
+    backrefs: yes
+  sudo: true
+
+- name: ldap url
+  lineinfile:
+  args:
+    dest: /etc/karaage/global_settings.py
+    regexp: "LDAP_URL ="
+    line: "LDAP_URL = '{{ ldapURL }}'"
+    backrefs: yes
+  sudo: true
+
+- include_vars: "roles/ldapserver/vars/main.yml"
+
+- name: ldap base
+  lineinfile:
+  args:
+    dest: /etc/karaage/global_settings.py
+    regexp: "LDAP_BASE ="
+    line: "LDAP_BASE = '{{ ldapDomain }}'"
+    backrefs: yes
+  sudo: true
+
+- name: ldap user base
+  lineinfile:
+  args:
+    dest: /etc/karaage/global_settings.py
+    regexp: "LDAP_USER_BASE="
+    line: "LDAP_USER_BASE = 'ou=Accounts,{{ ldapDomain }}'"
+    backrefs: yes
+  sudo: true
+
+- name: ldap group base
+  lineinfile:
+  args:
+    dest: /etc/karaage/global_settings.py
+    regexp: "LDAP_GROUP_BASE="
+    line: "LDAP_GROUP_BASE = 'ou=Groups,{{ ldapDomain }}'"
+    backrefs: yes
+  sudo: true
+
+- name: ldap admin user
+  lineinfile:
+  args:
+    dest: /etc/karaage/global_settings.py
+    regexp: "LDAP_ADMIN_USER ="
+    line: "LDAP_ADMIN_USER = 'cn=Manager,{{ ldapDomain }}'"
+    backrefs: yes
+  sudo: true
+  
+
+- name: ldap admin passwd
+  lineinfile:
+  args:
+    dest: /etc/karaage/global_settings.py
+    regexp: "LDAP_ADMIN_PASSWORD ="
+    line: "LDAP_ADMIN_PASSWORD = '{{ ldapManagerPassword }}'"
+    backrefs: yes
+  sudo: true
+
+- name: ldap use TLS CA
+  lineinfile:
+  args:
+    dest: /etc/karaage/global_settings.py
+    regexp: "LDAP_USE_TLS ="
+    line: "LDAP_USE_TLS = True"
+    backrefs: yes
+  sudo: true
+
+- name: ldap TLS CA
+  lineinfile:
+  args:
+    dest: /etc/karaage/global_settings.py
+    insertafter: "LDAP_USE_TLS ="
+    line: "LDAP_TLS_CA = '/etc/ssl/certs/ca.crt'"
+    state: present
+  sudo: true
+
+- name: check karaage tables exist
+  shell: echo 'describe auth_user' | mysql -u karaage --password={{ karaageSqlPassword }} karaage
+  ignore_errors: true
+  register: karaageTablesCreated
+  
+- name: template ldap.conf
+  template: src=ldap_conf.j2 dest=/etc/ldap/ldap.conf
+  sudo: true
+
+#- name: karaage sql db setup
+#  shell: kg-manage syncdb --noinput
+#  sudo: true
+#  when: karaageTablesCreated|failed
+#
+#- name: karaage sql db migrate
+#  shell: yes n | kg-manage migrate --all
+#  sudo: true
+#
+# I had to use syncdb --all --noinput migrate --fake then
+      #  sudo vi ./dist-packages/tldap/transaction.py
+      #  add import tldap.django which causes the connection to be setup. Continue from here trying to setup apache
+      #
+      #
+
+- name: karaage sql syncdb
+  shell: kg-manage syncdb --all --noinput
+  sudo: true
+  when: karaageTablesCreated|failed
+
+- name: karaage sql db migrate
+  shell: kg-manage migrate --fake
+  sudo: true
+  when: karaageTablesCreated|failed
+
+- name: fix up karaage transactions.py
+  lineinfile: 
+  args:
+    line: import tldap.django
+    insertafter: import tldap
+    state: present
+    dest: /usr/lib/python2.7/dist-packages/tldap/transaction.py
+  sudo: true
+
+- name: fix up karaage tldap/manager.py
+  lineinfile: 
+  args:
+    line: import tldap.django
+    insertafter: import tldap
+    state: present
+    dest: /usr/lib/python2.7/dist-packages/tldap/manager.py
+  sudo: true
+
+- name: enable ssl
+  shell: a2enmod ssl
+  sudo: true
+
+- name: enable wsgi
+  shell: a2enmod wsgi
+  sudo: true
+
+
+
+- name: enable karaage admin
+  command: ln -s /etc/karaage/kgadmin-apache.conf /etc/apache2/conf.d/karaage-admin.conf
+  args:
+    creates: /etc/apache2/conf.d/karaage-admin.conf
+  sudo: true
+  notify: restart apache
+
+- name: enable karaage registration
+  command: ln -s /etc/karaage/kgreg-apache.conf /etc/apache2/conf.d/karaage-registration.conf
+  args:
+    creates: /etc/apache2/conf.d/karaage-registration.conf
+  sudo: true
+  notify: restart apache
+
+- name: make ssl directory
+  file: name=/etc/apache2/ssl state=directory
+  sudo: true
+
+- name: copy ssl key
+  command: cp /etc/ssl/private/server.key /etc/apache2/ssl/server.key
+  args:
+    creates: /etc/apache2/ssl/server.key
+  sudo: true
+
+- name: chmod ssl key
+  file: path=/etc/apache2/ssl/server.key mode=600 owner={{ wwwuser }}
+  sudo: true
+
+- name: copy cert
+  command: cp /etc/ssl/certs/server.crt /etc/apache2/ssl/server.pem
+  sudo: true
+
+- name: enable ssl
+  command: ln -s /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/default-ssl
+  args:
+    creates: /etc/apache2/sites-enabled/default-ssl
+  sudo: true
+  notify: restart apache
+
+
+- name: configure postfix
+  template: src=main_cf.j2 dest=/etc/postfix/main.cf
+  sudo: true
+  notify: restart postfix
+
+- name: SSL Cert Chain
+  lineinfile:
+  args:
+    dest: /etc/apache2/sites-enabled/default-ssl
+    regexp: ".*#SSLCertificateChainFile.*"
+    line: "        SSLCertificateChainFile    /etc/ssl/certs/ca.crt"
+    backrefs: yes
+  sudo: true
+  notify: restart apache
+
+- name: SSL Cert
+  lineinfile:
+  args:
+    dest: /etc/apache2/sites-enabled/default-ssl
+    regexp: ".*SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem"
+    line: "        SSLCertificateFile    /etc/apache2/ssl/server.pem"
+    backrefs: yes
+  sudo: true
+  notify: restart apache
+
+- name: SSL Key
+  lineinfile:
+  args:
+    dest: /etc/apache2/sites-enabled/default-ssl
+    regexp: ".*SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key"
+    line: "        SSLCertificateKeyFile /etc/apache2/ssl/server.key"
+    backrefs: yes
+  sudo: true
+  notify: restart apache
diff --git a/roles/karaage2.7/tasks/set_mysql_root_password.yml b/roles/karaage2.7/tasks/set_mysql_root_password.yml
new file mode 100644
index 0000000..365a18d
--- /dev/null
+++ b/roles/karaage2.7/tasks/set_mysql_root_password.yml
@@ -0,0 +1,13 @@
+---
+
+- name: template secure script
+  template: src=set_root_passwd_sql.j2 dest=/tmp/set_root_passwd.sql mode=600 owner=root
+  sudo: true
+
+- name: run script
+  shell: cat /tmp/set_root_passwd.sql | mysql -u root
+  sudo: true
+  ignore_errors: true
+
+- name: test passwd set
+  shell: echo "show databases" | mysql -u root --password={{ sqlrootPasswd }}
diff --git a/roles/karaage2.7/templates/groups.j2 b/roles/karaage2.7/templates/groups.j2
new file mode 100644
index 0000000..dffc133
--- /dev/null
+++ b/roles/karaage2.7/templates/groups.j2
@@ -0,0 +1,4 @@
+{ 
+  "groups": {{ groups | to_nice_json }},
+  "hostvars": {{ hostvars | to_nice_json }}
+}
diff --git a/roles/karaage2.7/templates/ldap_conf.j2 b/roles/karaage2.7/templates/ldap_conf.j2
new file mode 100644
index 0000000..0964be7
--- /dev/null
+++ b/roles/karaage2.7/templates/ldap_conf.j2
@@ -0,0 +1 @@
+TLS_CACERT /etc/ssl/certs/cacert.pem
diff --git a/roles/karaage2.7/templates/main_cf.j2 b/roles/karaage2.7/templates/main_cf.j2
new file mode 100644
index 0000000..2823b28
--- /dev/null
+++ b/roles/karaage2.7/templates/main_cf.j2
@@ -0,0 +1,39 @@
+# See /usr/share/postfix/main.cf.dist for a commented, more complete version
+
+
+# Debian specific:  Specifying a file name will cause the first
+# line of that file to be used as the name.  The Debian default
+# is /etc/mailname.
+#myorigin = /etc/mailname
+
+smtpd_banner = $myhostname ESMTP $mail_name
+biff = no
+
+# appending .domain is the MUA's job.
+append_dot_mydomain = no
+
+# Uncomment the next line to generate "delayed mail" warnings
+#delay_warning_time = 4h
+
+readme_directory = no
+
+# TLS parameters
+smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
+smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
+smtpd_use_tls=yes
+smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
+smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
+
+# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
+# information on enabling SSL in the smtp client.
+
+myhostname = {{ ansible_fqdn }}
+alias_maps = hash:/etc/aliases
+alias_database = hash:/etc/aliases
+myorigin =  {{ ansible_fqdn }}
+mydestination = {{ ansible_fqdn }}, localhost.{{ ansible_domain }}, localhost
+relayhost =  {{ smtp_smarthost }}
+mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
+mailbox_size_limit = 0
+recipient_delimiter = +
+inet_interfaces = loopback-only
diff --git a/roles/karaage2.7/templates/set_root_passwd_sql.j2 b/roles/karaage2.7/templates/set_root_passwd_sql.j2
new file mode 100644
index 0000000..59fce05
--- /dev/null
+++ b/roles/karaage2.7/templates/set_root_passwd_sql.j2
@@ -0,0 +1,3 @@
+SET PASSWORD FOR 'root'@'localhost' = PASSWORD('{{ sqlrootPasswd }}');
+SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('{{ sqlrootPasswd }}');
+SET PASSWORD FOR 'root'@'{{ ansible_hostname }}' = PASSWORD('{{ sqlrootPasswd }}');
diff --git a/roles/karaage2.7/templates/vpac_list.j2 b/roles/karaage2.7/templates/vpac_list.j2
new file mode 100644
index 0000000..5fb9ef5
--- /dev/null
+++ b/roles/karaage2.7/templates/vpac_list.j2
@@ -0,0 +1,2 @@
+deb     http://code.vpac.org/debian  wheezy main
+deb-src http://code.vpac.org/debian  wheezy main
diff --git a/roles/karaage2.7/vars/Debian_7.6_x86_64.yml b/roles/karaage2.7/vars/Debian_7.6_x86_64.yml
new file mode 100644
index 0000000..cd01a2b
--- /dev/null
+++ b/roles/karaage2.7/vars/Debian_7.6_x86_64.yml
@@ -0,0 +1,11 @@
+---
+  system_packages:
+    - python-django
+    - mysql-server
+    - python-mysqldb
+    - ldap-utils
+    - apache2
+    - libapache2-mod-wsgi
+    - postfix
+  wwwuser: www-data
+  wwwgroup: www-data
diff --git a/roles/ldapserver/meta/main.yml b/roles/ldapserver/meta/main.yml
new file mode 100644
index 0000000..fea9520
--- /dev/null
+++ b/roles/ldapserver/meta/main.yml
@@ -0,0 +1,3 @@
+---
+dependencies:
+  - { role: easy-rsa-certificate, x509_csr_args="--server" }
diff --git a/roles/ldapserver/tasks/main.yml b/roles/ldapserver/tasks/main.yml
new file mode 100644
index 0000000..625ea2b
--- /dev/null
+++ b/roles/ldapserver/tasks/main.yml
@@ -0,0 +1,197 @@
+---
+
+- include_vars: "{{ hostvars[ansible_hostname]['ansible_distribution'] }}_{{ hostvars[ansible_hostname]['ansible_distribution_version'] }}_{{ ansible_architecture }}.yml"
+- include_vars: passwords.yml
+
+- name: install system packages apt
+  apt: name={{ item }} state=installed update_cache=true
+  sudo: true
+  with_items: system_packages
+  when: ansible_os_family == 'Debian'
+
+- name: install system packages yum
+  yum: name={{ item }} state=installed
+  sudo: true
+  with_items: system_packages
+  when: ansible_os_family == 'RedHat'
+
+- name: hash password
+  command: /usr/sbin/slappasswd -h {SSHA} -s {{ ldapManagerPassword }}
+  register: ldapManagerHash
+
+- name: hash binddn password
+  command: /usr/sbin/slappasswd -h {SSHA} -s {{ ldapBindDNPassword }}
+  register: ldapBindDNHash
+
+- name: template ssl.ldif
+  template: src=ssl_ldif.j2 dest=/tmp/ssl.ldif mode=600
+
+- name: template manager.ldif
+  template: src=manager_ldif.j2 dest=/tmp/manager.ldif mode=600
+  sudo: true
+
+- name: template binddn.ldif
+  template: src=binddn_ldif.j2 dest=/tmp/binddn.ldif mode=600
+  sudo: true
+
+- name: template root.ldif
+  template: src=root_ldif.j2 dest=/tmp/root.ldif
+
+- name: template accounts.ldif
+  template: src=accounts_ldif.j2 dest=/tmp/accounts.ldif
+
+- name: template groups.ldif
+  template: src=groups_ldif.j2 dest=/tmp/groups.ldif
+
+- name: template acls.ldif
+  template: src=acls_ldif.j2 dest=/tmp/acls.ldif
+
+- name: template ppolicy_moduleload.ldif
+  template: src=ppolicy_moduleload_ldif.j2 dest=/tmp/ppolicy_moduleload.ldif
+
+- name: template ppolicy_overlay.ldif
+  template: src=ppolicy_overlay_ldif.j2 dest=/tmp/ppolicy_overlay.ldif
+
+- name: template pwpolices.ldif
+  template: src=pwpolicies_ldif.j2 dest=/tmp/pwpolicies.ldif
+
+- name: template default_ppolicy.ldif
+  template: src=default_ppolicy_ldif.j2 dest=/tmp/default_ppolicy.ldif
+
+
+- name: copy cert
+  command: cp /etc/ssl/certs/server.crt /etc/openldap/certs/ldapcert.pem
+  sudo: true
+
+- name: copy cacert
+  command: cp /etc/ssl/certs/ca.crt /etc/openldap/certs/cacert.pem
+  sudo: true
+
+- name: copy key
+  command: cp /etc/ssl/private/server.key /etc/openldap/certs/ldapkey.pem
+  sudo: true
+
+- name: chmod key
+  file: path=/etc/openldap/certs/ldapkey.pem owner={{ ldapuser }} group={{ ldapgroup }} mode=600
+  sudo: true
+
+- name: enable ssl centos
+  lineinfile: regexp="SLAPD_LDAPS=no" state=present line="SLAPD_LDAPS=yes" dest=/etc/sysconfig/ldap
+  sudo: true
+  when: ansible_os_family == 'RedHat'
+
+- name: start ldap
+  service: name=slapd state=restarted
+  sudo: true
+
+- name: check TLS config
+  shell: "slapcat -b cn=config | grep 'olcTLSCertificateKeyFile: /etc/openldap/certs/ldapkey.pem'"
+  ignore_errors: true
+  sudo: true
+  register: tlsConfigured
+
+- name: check Manager config
+  shell: "slapcat -b cn=config | grep 'olcRootDN: cn=Manager,{{ ldapDomain }}'"
+  ignore_errors: true
+  sudo: true
+  register: managerConfigured
+
+- name: check ACL config
+  shell: "slapcat -b cn=config | grep 'olcAccess:' | grep 'cn=Manager'"
+  ignore_errors: true
+  sudo: true
+  register: aclConfigured
+
+
+- name: check DIT config
+  shell: "ldapsearch -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -b {{ ldapDomain }} objectClass=dcObject"
+  ignore_errors: true
+  register: ditConfigured
+
+- name: check Accounts config
+  shell: "ldapsearch -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -b ou=Accounts,{{ ldapDomain }} objectClass=*"
+  ignore_errors: true
+  register: accountsConfigured
+
+- name: check Groups config
+  shell: "ldapsearch -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -b ou=Groups,{{ ldapDomain }} objectClass=*"
+  ignore_errors: true
+  register: groupsConfigured
+
+- name: check binddn config
+  shell: "ldapsearch -D cn=binddn,ou=Accounts,{{ ldapDomain }} -w {{ ldapBindDNPassword }} -b {{ ldapDomain }} objectClass=dcObject"
+  ignore_errors: true
+  register: binddnConfigured
+
+
+- name: initialise server ssl
+  shell: ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/ssl.ldif -D cn=config 
+  sudo: true
+  when: tlsConfigured|failed
+
+- name: initialise server manager
+  shell:  ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/manager.ldif -D cn=config 
+  sudo: true
+  when: managerConfigured|failed
+
+- name: initialise server acls
+  shell:  ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/acls.ldif -D cn=config
+  sudo: true
+  when: aclConfigured|failed
+
+- name: add DIT root
+  shell: ldapadd -x -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -f /tmp/root.ldif
+  when: ditConfigured|failed
+
+- name: add Accounts OU
+  shell: ldapadd -x -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -f /tmp/accounts.ldif
+  when: accountsConfigured|failed
+
+- name: add Groups OU
+  shell: ldapadd -x -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -f /tmp/groups.ldif
+  when: groupsConfigured|failed
+
+- name: add binddn
+  shell: ldapadd -x -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -f /tmp/binddn.ldif
+  sudo: true
+  when: binddnConfigured|failed
+
+- name: check ppolicy module loaded
+  shell: slapcat -b cn=config | grep "olcModuleLoad. {.*}ppolicy"
+  sudo: true
+  ignore_errors: true
+  register: ppolicyModuleLoaded
+
+- name: load ppolicy module
+  shell: ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/ppolicy_moduleload.ldif -D cn=config 
+  sudo: true
+  when: ppolicyModuleLoaded|failed
+
+- name: check ppolicy overlay config
+  shell: "slapcat -b cn=config | grep 'dn: olcOverlay=ppolicy,olcDatabase={.*}bdb,cn=config'"
+  ignore_errors: true
+  sudo: true
+  register: ppolicyOverlayConfigured
+
+- name: add ppolicy overlay
+  shell: ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/ppolicy_overlay.ldif -D cn=config 
+  sudo: true
+  when: ppolicyOverlayConfigured|failed
+
+- name: check pwpolicies config
+  shell: ldapsearch -D cn=binddn,ou=Accounts,{{ ldapDomain }} -w {{ ldapBindDNPassword }} -b ou=pwpolicies,{{ ldapDomain }} objectClass=*
+  ignore_errors: true
+  register: pwpoliciesConfigured
+
+- name: add pwpolicies
+  shell: ldapadd -x -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -f /tmp/pwpolicies.ldif
+  when: pwpoliciesConfigured|failed
+
+- name: check defaultPwpolicy config
+  shell: ldapsearch -D cn=binddn,ou=Accounts,{{ ldapDomain }} -w {{ ldapBindDNPassword }} -b cn=default,ou=pwpolicies,{{ ldapDomain }} objectClass=*
+  ignore_errors: true
+  register: defaultPpolicyConfigured
+
+- name: add defaultPwpolicy
+  shell: ldapadd -x -D cn=Manager,{{ ldapDomain }} -w {{ ldapManagerPassword }} -f /tmp/default_ppolicy.ldif
+  when: defaultPpolicyConfigured|failed
diff --git a/roles/ldapserver/templates/accounts_ldif.j2 b/roles/ldapserver/templates/accounts_ldif.j2
new file mode 100644
index 0000000..93e5fd9
--- /dev/null
+++ b/roles/ldapserver/templates/accounts_ldif.j2
@@ -0,0 +1,2 @@
+dn: ou=Accounts,{{ ldapDomain }}
+objectClass: organizationalUnit
diff --git a/roles/ldapserver/templates/acls_ldif.j2 b/roles/ldapserver/templates/acls_ldif.j2
new file mode 100644
index 0000000..631f57e
--- /dev/null
+++ b/roles/ldapserver/templates/acls_ldif.j2
@@ -0,0 +1,6 @@
+dn: olcDatabase={2}bdb,cn=config
+changetype: modify
+add: olcAccess
+olcAccess: {0}to attrs=userPassword by dn="cn=Manager,{{ ldapDomain }}" write by self write by * auth
+olcAccess: {1}to attrs=shadowLastChange by dn="cn=Manager,{{ ldapDomain }}" write by self write by * read
+olcAccess: {2}to * by users read by anonymous auth
diff --git a/roles/ldapserver/templates/binddn_ldif.j2 b/roles/ldapserver/templates/binddn_ldif.j2
new file mode 100644
index 0000000..553885b
--- /dev/null
+++ b/roles/ldapserver/templates/binddn_ldif.j2
@@ -0,0 +1,5 @@
+dn: cn=binddn,ou=Accounts,{{ ldapDomain }}
+objectClass: inetOrgPerson
+cn: binddn
+sn: binddn
+userPassword: {{ ldapBindDNHash.stdout }}
diff --git a/roles/ldapserver/templates/default_ppolicy_ldif.j2 b/roles/ldapserver/templates/default_ppolicy_ldif.j2
new file mode 100644
index 0000000..5d1847d
--- /dev/null
+++ b/roles/ldapserver/templates/default_ppolicy_ldif.j2
@@ -0,0 +1,6 @@
+dn: cn=default,ou=pwpolicies,{{ ldapDomain }}
+objectClass: top
+objectClass: device
+objectClass: pwdPolicy
+pwdAttribute: 2.5.4.35
+cn: default
diff --git a/roles/ldapserver/templates/groups_ldif.j2 b/roles/ldapserver/templates/groups_ldif.j2
new file mode 100644
index 0000000..39890b0
--- /dev/null
+++ b/roles/ldapserver/templates/groups_ldif.j2
@@ -0,0 +1,2 @@
+dn: ou=Groups,{{ ldapDomain }}
+objectClass: organizationalUnit
diff --git a/roles/ldapserver/templates/manager_ldif.j2 b/roles/ldapserver/templates/manager_ldif.j2
new file mode 100644
index 0000000..1038470
--- /dev/null
+++ b/roles/ldapserver/templates/manager_ldif.j2
@@ -0,0 +1,10 @@
+dn: olcDatabase={2}bdb,cn=config
+changetype: modify
+replace: olcSuffix
+olcSuffix: {{ ldapDomain }}
+-
+replace: olcRootDN
+olcRootDN: cn=Manager,{{ ldapDomain }}
+-
+add: olcRootPW
+olcRootPW: {{ ldapManagerHash.stdout }}
diff --git a/roles/ldapserver/templates/ppolicy_moduleload_ldif.j2 b/roles/ldapserver/templates/ppolicy_moduleload_ldif.j2
new file mode 100644
index 0000000..084cc60
--- /dev/null
+++ b/roles/ldapserver/templates/ppolicy_moduleload_ldif.j2
@@ -0,0 +1,5 @@
+dn: cn=module,cn=config
+objectClass: olcModuleList
+cn: module
+olcModulePath: /usr/lib64/openldap/
+olcModuleLoad: ppolicy.la
diff --git a/roles/ldapserver/templates/ppolicy_overlay_ldif.j2 b/roles/ldapserver/templates/ppolicy_overlay_ldif.j2
new file mode 100644
index 0000000..942c69c
--- /dev/null
+++ b/roles/ldapserver/templates/ppolicy_overlay_ldif.j2
@@ -0,0 +1,7 @@
+dn: olcOverlay=ppolicy,olcDatabase={2}bdb,cn=config
+olcOverlay: ppolicy
+objectClass: olcOverlayConfig
+objectClass: olcPPolicyConfig
+olcPPolicyHashCleartext: TRUE
+olcPPolicyUseLockout: FALSE
+olcPPolicyDefault: cn=default,ou=pwpolicies,{{ ldapDomain }}
diff --git a/roles/ldapserver/templates/pwpolicies_ldif.j2 b/roles/ldapserver/templates/pwpolicies_ldif.j2
new file mode 100644
index 0000000..1f0b93c
--- /dev/null
+++ b/roles/ldapserver/templates/pwpolicies_ldif.j2
@@ -0,0 +1,4 @@
+dn: ou=pwpolicies,{{ ldapDomain }}
+objectClass: organizationalUnit
+objectClass: top
+ou: pwpolicies
diff --git a/roles/ldapserver/templates/root_ldif.j2 b/roles/ldapserver/templates/root_ldif.j2
new file mode 100644
index 0000000..c3a43f3
--- /dev/null
+++ b/roles/ldapserver/templates/root_ldif.j2
@@ -0,0 +1,5 @@
+dn: {{ ldapDomain }}
+objectClass: dcObject
+objectClass: organization
+o: {{ ansible_domain }}
+description: root
diff --git a/roles/ldapserver/templates/ssl_ldif.j2 b/roles/ldapserver/templates/ssl_ldif.j2
new file mode 100644
index 0000000..9d7d804
--- /dev/null
+++ b/roles/ldapserver/templates/ssl_ldif.j2
@@ -0,0 +1,9 @@
+dn: cn=config
+replace: olcTLSCACertificateFile
+olcTLSCACertificateFile: /etc/openldap/certs/cacert.pem
+-
+replace: olcTLSCertificateFile
+olcTLSCertificateFile: /etc/openldap/certs/ldapcert.pem
+-
+replace: olcTLSCertificateKeyFile
+olcTLSCertificateKeyFile: /etc/openldap/certs/ldapkey.pem
diff --git a/roles/ldapserver/vars/CentOS_6.5_x86_64.yml b/roles/ldapserver/vars/CentOS_6.5_x86_64.yml
new file mode 100644
index 0000000..f789871
--- /dev/null
+++ b/roles/ldapserver/vars/CentOS_6.5_x86_64.yml
@@ -0,0 +1,5 @@
+---
+ system_packages:
+  - openldap-servers
+  - openldap-clients
+  - openssl
diff --git a/roles/ldapserver/vars/main.yml b/roles/ldapserver/vars/main.yml
new file mode 100644
index 0000000..12de2dc
--- /dev/null
+++ b/roles/ldapserver/vars/main.yml
@@ -0,0 +1,4 @@
+---
+ ldapDomain: dc=imbl,dc=massive,dc=org,dc=au
+ ldapuser:  ldap
+ ldapgroup: ldap
diff --git a/scripts/make_passwords.py b/scripts/make_passwords.py
new file mode 100644
index 0000000..f9fd8a9
--- /dev/null
+++ b/scripts/make_passwords.py
@@ -0,0 +1,45 @@
+# This program writes a yaml varaible file where each varible is suitable as a password
+# If a variable is not defined it will pick a new random varaible for you
+# If a variable is already defined it will not change
+import random
+import sys
+import string
+import yaml
+
+def new_pass(length):
+    return ''.join(random.choice(string.ascii_uppercase + string.digits+string.ascii_lowercase) for _ in range(length))
+
+# required_passwords is a dictionay consisting of variable names and the length of random password you would like to associate with that variable
+required_passwords={}
+# Passwords for munge and slurm
+required_passwords['mungekey']=32
+# Passwords for karaage and ldap
+required_passwords['ldapManagerPassword']=8
+required_passwords['ldapBindDNPassword']=8
+required_passwords['karaageSqlPassword']=8
+required_passwords['sqlrootPasswd']=8
+
+changed=False
+pwpath='./passwords.yml'
+try:
+    f=open(pwpath,'r')
+    data=yaml.load(f.read())
+    f.close()
+except Exception as e:
+    pass
+if data==None:
+    data={}
+
+print data
+
+for pw in required_passwords.keys():
+    if data.has_key(pw):
+        pass
+    else:
+        data[pw]=new_pass(required_passwords[pw])
+        changed=True
+if changed:
+    f=open(pwpath,'w+')
+    f.write(yaml.dump(data,default_flow_style=False,explicit_start=True))
+    f.close()
+
-- 
GitLab