groupe-meditation/ansible/roles/app/tasks/main.yml

208 lines
6.8 KiB
YAML
Raw Normal View History

---
- name: Installer les paquets requis par l'application
ansible.builtin.apt:
name:
- build-essential
- libcairo2
- libffi-dev
- libgdk-pixbuf-2.0-0
- libpango-1.0-0
- libpangocairo-1.0-0
- python3
- python3-pip
- python3-venv
state: present
- name: Creer les repertoires applicatifs
ansible.builtin.file:
path: "{{ item.path }}"
state: directory
owner: "{{ item.owner | default(groupe_meditation_service_user) }}"
group: "{{ item.group | default(groupe_meditation_service_group) }}"
mode: "{{ item.mode | default('0755') }}"
loop:
- path: "{{ groupe_meditation_app_dir }}"
owner: root
group: root
- path: "{{ groupe_meditation_upload_dir }}"
mode: "0755"
- path: "{{ groupe_meditation_data_dir }}/import"
- path: "{{ groupe_meditation_web_root }}"
- name: Synchroniser le backend
ansible.posix.synchronize:
src: "{{ playbook_dir }}/../backend/"
dest: "{{ groupe_meditation_backend_dir }}/"
delete: true
rsync_opts:
- "--exclude=venv/"
- "--exclude=.env"
- "--exclude=__pycache__/"
- "--exclude=*.pyc"
notify: Redemarrer groupe-meditation
- name: Synchroniser les fichiers de deploiement
ansible.posix.synchronize:
src: "{{ playbook_dir }}/../deploy/"
dest: "{{ groupe_meditation_deploy_dir }}/"
delete: true
notify: Redemarrer groupe-meditation
- name: Synchroniser les donnees d'import
ansible.posix.synchronize:
src: "{{ playbook_dir }}/../data/"
dest: "{{ groupe_meditation_data_dir }}/"
delete: true
notify: Redemarrer groupe-meditation
- name: Synchroniser le frontend
ansible.posix.synchronize:
src: "{{ playbook_dir }}/../frontend/"
dest: "{{ groupe_meditation_frontend_dir }}/"
delete: true
rsync_opts:
- "--exclude=node_modules/"
- "--exclude=dist/"
- name: Creer l'environnement virtuel Python
ansible.builtin.command:
cmd: python3 -m venv "{{ groupe_meditation_backend_dir }}/venv"
creates: "{{ groupe_meditation_backend_dir }}/venv/bin/python"
- name: Installer les dependances Python
ansible.builtin.pip:
requirements: "{{ groupe_meditation_backend_dir }}/requirements.txt"
virtualenv: "{{ groupe_meditation_backend_dir }}/venv"
notify: Redemarrer groupe-meditation
- name: Deployer le fichier d'environnement backend
ansible.builtin.template:
src: env.j2
dest: "{{ groupe_meditation_backend_dir }}/.env"
owner: "{{ groupe_meditation_service_user }}"
group: "{{ groupe_meditation_service_group }}"
mode: "0640"
no_log: true
notify: Redemarrer groupe-meditation
- name: Installer les dependances frontend sur le poste de controle avec npm ci
ansible.builtin.command:
cmd: npm ci
chdir: "{{ playbook_dir }}/../frontend"
delegate_to: localhost
become: false
run_once: true
when: lookup('ansible.builtin.fileglob', playbook_dir + '/../frontend/package-lock.json') | length > 0
changed_when: true
- name: Installer les dependances frontend sur le poste de controle avec npm install
ansible.builtin.command:
cmd: npm install
chdir: "{{ playbook_dir }}/../frontend"
delegate_to: localhost
become: false
run_once: true
when: lookup('ansible.builtin.fileglob', playbook_dir + '/../frontend/package-lock.json') | length == 0
changed_when: true
- name: Construire le frontend sur le poste de controle
ansible.builtin.command:
cmd: npm run build
chdir: "{{ playbook_dir }}/../frontend"
delegate_to: localhost
become: false
run_once: true
changed_when: true
- name: Deployer les fichiers statiques frontend
ansible.posix.synchronize:
src: "{{ playbook_dir }}/../frontend/dist/"
dest: "{{ groupe_meditation_web_root }}/"
delete: true
- name: Ajuster les permissions applicatives
ansible.builtin.file:
path: "{{ item }}"
owner: "{{ groupe_meditation_service_user }}"
group: "{{ groupe_meditation_service_group }}"
recurse: true
loop:
- "{{ groupe_meditation_app_dir }}"
- "{{ groupe_meditation_web_root }}"
- name: Installer l'unite systemd
ansible.builtin.template:
src: groupe-meditation.service.j2
dest: "/etc/systemd/system/{{ groupe_meditation_service_name }}.service"
owner: root
group: root
mode: "0644"
notify:
- Recharger systemd
- Redemarrer groupe-meditation
- name: Appliquer les handlers avant le seed
ansible.builtin.meta: flush_handlers
- name: Compter les groupes existants
community.postgresql.postgresql_query:
db: "{{ groupe_meditation_db_name }}"
login_user: "{{ groupe_meditation_db_user }}"
login_password: "{{ groupe_meditation_db_password }}"
login_host: "{{ groupe_meditation_db_host }}"
port: "{{ groupe_meditation_db_port }}"
query: "SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'groupes';"
register: groupes_table
no_log: true
- name: Compter les donnees applicatives existantes
community.postgresql.postgresql_query:
db: "{{ groupe_meditation_db_name }}"
login_user: "{{ groupe_meditation_db_user }}"
login_password: "{{ groupe_meditation_db_password }}"
login_host: "{{ groupe_meditation_db_host }}"
port: "{{ groupe_meditation_db_port }}"
query: "SELECT COUNT(*) AS count FROM groupes;"
register: groupes_count
when: groupes_table.query_result[0].count | int > 0
no_log: true
- name: Initialiser la base avec le seed existant
ansible.builtin.shell:
cmd: |
set -euo pipefail
{
printf '%s\n%s\n%s\n%s\n%s\n' \
{{ groupe_meditation_first_member.prenom | quote }} \
{{ groupe_meditation_first_member.nom | default("") | quote }} \
{{ groupe_meditation_first_member.courriel | quote }} \
{{ groupe_meditation_first_member.telephone | quote }} \
{{ groupe_meditation_first_member.pin | quote }}
{% if groupe_meditation_first_member.courriel | lower != "sysadmin" %}
printf '%s\n' {{ groupe_meditation_first_member.poste_numero | default("1") | quote }}
{% endif %}
} | {{ groupe_meditation_backend_dir }}/venv/bin/python ../deploy/seed.py
executable: /bin/bash
chdir: "{{ groupe_meditation_backend_dir }}"
when:
- groupe_meditation_run_seed | bool
- groupes_table.query_result[0].count | int == 0 or (groupes_count.query_result[0].count | default(0) | int == 0)
no_log: true
notify: Redemarrer groupe-meditation
- name: Activer et demarrer le service applicatif
ansible.builtin.service:
name: "{{ groupe_meditation_service_name }}"
state: started
enabled: true
- name: Verifier la sante locale de l'API
ansible.builtin.uri:
url: "http://{{ groupe_meditation_api_host }}:{{ groupe_meditation_api_port }}/api/health"
return_content: true
status_code: 200
register: api_health
retries: 6
delay: 5
until: api_health.status == 200