From d7660e833396bd799b6c9898c1cba70305101543 Mon Sep 17 00:00:00 2001
From: pa <pa@crans.org>
Date: Sun, 7 Feb 2021 18:16:43 +0100
Subject: [PATCH] [cas] CRANSIBLEISED bro

---
 group_vars/django_cas.yml                     | 23 +++++++++++++++++++
 hosts                                         |  3 +++
 plays/cas.yml                                 |  9 ++++----
 roles/django-cas/README.md                    | 20 +++++++++++++++-
 roles/django-cas/tasks/main.yml               |  7 +++---
 .../templates/cas/settings_local.py.j2        | 14 +++++------
 roles/django-cas/templates/cron.d/cas.j2      |  6 ++---
 .../templates/nginx/sites-available/cas.j2    |  9 ++++----
 .../templates/update-motd.d/05-service.j2     |  2 +-
 .../templates/uwsgi/apps-available/cas.ini.j2 |  4 ++--
 10 files changed, 71 insertions(+), 26 deletions(-)
 create mode 100644 group_vars/django_cas.yml

diff --git a/group_vars/django_cas.yml b/group_vars/django_cas.yml
new file mode 100644
index 00000000..859efff6
--- /dev/null
+++ b/group_vars/django_cas.yml
@@ -0,0 +1,23 @@
+---
+glob_django_cas:
+  repo: 'http://gitlab.adm.crans.org/nounous/django-cas.git'
+  path: '/var/local/django-cas'
+  url:
+    - cas.crans.org
+    - cas.adm.crans.org
+    - login.crans.org
+    - login.adm.crans.org
+    - auth.crans.org
+    - auth.adm.crans.org
+  ldap:
+    dn: 'cn=Utilisateurs,dc=crans,dc=org'
+    password: "{{ vault_cas_ldap_password }}"
+    user: 'cn=cas,ou=service-users,dc=crans,dc=org'
+    server: 172.16.10.157
+  db:
+    host: tealc.adm.crans.org
+    password: "{{ vault_cas_database_password }}"
+  secret_key: "{{ vault_cas_secret_key }}"
+  reverse_proxy:
+    - '10.231.136.0/24'
+    - '2a0c:700:0:2::/64'
diff --git a/hosts b/hosts
index 068bb8d6..53dac242 100644
--- a/hosts
+++ b/hosts
@@ -22,6 +22,9 @@ reverseproxy
 [dhcp:children]
 routeurs_vm
 
+[django_cas]
+cas.adm.crans.org
+
 [dns_auth_master]
 silice.adm.crans.org
 
diff --git a/plays/cas.yml b/plays/cas.yml
index f9006c6c..a55a8ab1 100755
--- a/plays/cas.yml
+++ b/plays/cas.yml
@@ -2,9 +2,8 @@
 ---
 # Django CAS server
 
-- hosts: cas.adm.crans.org
+- hosts: django_cas
   vars:
-    cas_secret_key: "{{ vault_cas_secret_key }}"
-    cas_ldap_password: "{{ vault_cas_ldap_password }}"
-    cas_database_password: "{{ vault_cas_database_password }}"
-  roles: ["django-cas"]
+    django_cas: "{{ glob_django_cas | default({}) | combine(loc_django_cas | default({})) }}"
+  roles:
+    - django-cas
diff --git a/roles/django-cas/README.md b/roles/django-cas/README.md
index 6b9b47c5..e7ca8006 100644
--- a/roles/django-cas/README.md
+++ b/roles/django-cas/README.md
@@ -1,3 +1,21 @@
 # Django CAS
 
-Une fois le rôle appliqué il faut aller dans `/var/local/django-cas` et faire un `./manage.py collectstatic`.
+Une fois le rôle appliqué il faut aller dans django_cas.path et faire un `./manage.py collectstatic`.
+
+## Variables
+
+On rassemble dans le dictionnaire django_cas toutes les variables liées au déploiement du cas. Voici une liste exhaustive des paramètres à définir :
+
+  - repo : Endroit d'où cloner les sources. Par défaut au crans, on utilise le dépôt : https://gitlab.crans.org/nounous/django-cas.git
+  - path : Là où on va installer le logiciel.
+  - url : Une liste d'url qui vont servir le cas
+  - ldap : dictionnaire qui configure la discussion avec le ldap
+    - dn : nom derrière lequel sont stockés les utilisateurs dans le ldap
+    - password : mot de passe de connection au ldap
+    - user : utilisateur avec lequel on se connecte
+    - server : serveur sur lequel le ldap est situé
+  - db : dictionnaire qui configure la discussion avec la base de données
+    - host : l'hôte sur lequel la base de données se trouve
+    - password : mot de passe d'accès
+  - secret_key : le secret de django_cas
+  - reverse_proxy : liste optionnelle permettant de faire tourner le cas derrière un reverse proxy tout en gardant les informations de connection originales de l'utilisateur. Il doit contenir la liste d'ip du reverse-proxy avec lequel il se connectera au CAS.
diff --git a/roles/django-cas/tasks/main.yml b/roles/django-cas/tasks/main.yml
index 1d3b919a..3b40472c 100644
--- a/roles/django-cas/tasks/main.yml
+++ b/roles/django-cas/tasks/main.yml
@@ -16,15 +16,16 @@
 
 - name: Clone Django CAS project repository
   git:
-    repo: http://gitlab.adm.crans.org/nounous/django-cas.git
-    dest: /var/local/django-cas
+    repo: '{{ django_cas.repo }}'
+    dest: '{{ django_cas.path }}'
+    force: yes
     version: master
     umask: '002'
 
 - name: Configure Django CAS
   template:
     src: cas/settings_local.py.j2
-    dest: /var/local/django-cas/cas/settings_local.py
+    dest: '{{ django_cas.path }}/cas/settings_local.py'
     mode: 0600
     owner: www-data
   notify: Restart uwsgi
diff --git a/roles/django-cas/templates/cas/settings_local.py.j2 b/roles/django-cas/templates/cas/settings_local.py.j2
index 5ae99cf1..484276d8 100644
--- a/roles/django-cas/templates/cas/settings_local.py.j2
+++ b/roles/django-cas/templates/cas/settings_local.py.j2
@@ -1,20 +1,20 @@
 {{ ansible_header | comment }}
 
-SECRET_KEY = '{{ cas_secret_key }}'
+SECRET_KEY = '{{ django_cas.secret_key }}'
 
 # Settings for the CAS server
-CAS_LDAP_SERVER = "172.16.10.90"
-CAS_LDAP_USER = "cn=cas,ou=service-users,dc=crans,dc=org"
-CAS_LDAP_PASSWORD = "{{ cas_ldap_password }}"
-CAS_LDAP_BASE_DN = "cn=Utilisateurs,dc=crans,dc=org"
+CAS_LDAP_SERVER = "{{ django_cas.ldap.server }}"
+CAS_LDAP_USER = "{{ django_cas.ldap.user }}"
+CAS_LDAP_PASSWORD = "{{ django_cas.ldap.password }}"
+CAS_LDAP_BASE_DN = "{{ django_cas.ldap.dn }}"
 
 # Database
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.postgresql_psycopg2',
         'NAME': 'cas',
-        'HOST': 'pgsql.adm.crans.org',
+        'HOST': '{{ django_cas.db.host }}',
         'USER': 'cas',
-        'PASSWORD': '{{ cas_database_password }}',
+        'PASSWORD': '{{ django_cas.db.password }}',
     }
 }
diff --git a/roles/django-cas/templates/cron.d/cas.j2 b/roles/django-cas/templates/cron.d/cas.j2
index 0fd4795d..b0b6292d 100644
--- a/roles/django-cas/templates/cron.d/cas.j2
+++ b/roles/django-cas/templates/cron.d/cas.j2
@@ -1,4 +1,4 @@
 {{ ansible_header | comment }}
-0   0  * * * www-data /var/local/django-cas/manage.py clearsessions
-*/5 *  * * * www-data /var/local/django-cas/manage.py cas_clean_tickets
-5   0  * * * www-data /var/local/django-cas/manage.py cas_clean_sessions
+0   0  * * * www-data {{ django_cas.path }}/manage.py clearsessions
+*/5 *  * * * www-data {{ django_cas.path }}/manage.py cas_clean_tickets
+5   0  * * * www-data {{ django_cas.path }}/manage.py cas_clean_sessions
diff --git a/roles/django-cas/templates/nginx/sites-available/cas.j2 b/roles/django-cas/templates/nginx/sites-available/cas.j2
index c243822e..2372ae92 100644
--- a/roles/django-cas/templates/nginx/sites-available/cas.j2
+++ b/roles/django-cas/templates/nginx/sites-available/cas.j2
@@ -1,7 +1,7 @@
 {{ ansible_header | comment }}
 
 server {
-     server_name cas.crans.org cas.adm.crans.org login.crans.org login.adm.crans.org auth.crans.org auth.adm.crans.org;
+     server_name {{ django_cas.url | join(' ') }};
      listen 80;
      listen [::]:80;
 
@@ -11,11 +11,12 @@ server {
      }
 
      location /static {
-         alias /var/local/django-cas/cas/local_static;
+         alias {{ django_cas.path }}/cas/local_static;
      }
 
-     set_real_ip_from 10.231.136.0/24;
-     set_real_ip_from 2a0c:700:0:2::/64;
+{% for ip in django_cas.reverse_proxy | default([]) %}
+     set_real_ip_from {{ ip }};
+{% endfor %}
      real_ip_header P-Real-Ip;
 
      location / {
diff --git a/roles/django-cas/templates/update-motd.d/05-service.j2 b/roles/django-cas/templates/update-motd.d/05-service.j2
index 242bc2ca..8a0f3b38 100755
--- a/roles/django-cas/templates/update-motd.d/05-service.j2
+++ b/roles/django-cas/templates/update-motd.d/05-service.j2
@@ -1,3 +1,3 @@
 #!/usr/bin/tail +14
 {{ ansible_header | comment }}
-> django-cas-server a été déployé sur cette machine. Voir /var/local/django-cas/.
+> django-cas-server a été déployé sur cette machine. Voir {{ django_cas.path }}.
diff --git a/roles/django-cas/templates/uwsgi/apps-available/cas.ini.j2 b/roles/django-cas/templates/uwsgi/apps-available/cas.ini.j2
index 7ec92804..3055665b 100644
--- a/roles/django-cas/templates/uwsgi/apps-available/cas.ini.j2
+++ b/roles/django-cas/templates/uwsgi/apps-available/cas.ini.j2
@@ -2,8 +2,8 @@
 
 [uwsgi]
 plugin = python3
-chdir = /var/local/django-cas/
-wsgi-file = /var/local/django-cas/cas/wsgi.py
+chdir = {{ django_cas.path }}/
+wsgi-file = {{ django_cas.path }}/cas/wsgi.py
 max-request=50
 cheaper = 1
 cheaper-initial = 1
-- 
GitLab