--- - 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 app - name: Synchroniser les fichiers de deploiement ansible.posix.synchronize: src: "{{ playbook_dir }}/../deploy/" dest: "{{ groupe_meditation_deploy_dir }}/" delete: true notify: Redemarrer app - name: Synchroniser les donnees d'import ansible.posix.synchronize: src: "{{ playbook_dir }}/../data/" dest: "{{ groupe_meditation_data_dir }}/" delete: true notify: Redemarrer app - 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 app - 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 app - 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: Arreter l'ancien service applicatif si present ansible.builtin.service: name: groupe-meditation state: stopped enabled: false failed_when: false when: groupe_meditation_service_name != "groupe-meditation" - name: Retirer l'ancienne unite systemd ansible.builtin.file: path: /etc/systemd/system/groupe-meditation.service state: absent when: groupe_meditation_service_name != "groupe-meditation" notify: Recharger systemd - name: Installer l'unite systemd ansible.builtin.template: src: app.service.j2 dest: "/etc/systemd/system/{{ groupe_meditation_service_name }}.service" owner: root group: root mode: "0644" notify: - Recharger systemd - Redemarrer app - 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 app - name: Appliquer les handlers apres le seed ansible.builtin.meta: flush_handlers - 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