first commit

This commit is contained in:
Nuxgrid
2026-07-22 21:01:19 +02:00
commit 8bb06f3737
57 changed files with 3529 additions and 0 deletions
+127
View File
@@ -0,0 +1,127 @@
---
- name: Génération du certificat SSL Let's Encrypt
hosts: infra
become: true
gather_facts: false
tasks:
- name: Installer certbot et le plugin nginx
ansible.builtin.apt:
name:
- certbot
- python3-certbot-nginx
- nginx
state: present
update_cache: yes
- name: Déployer la config Nginx HTTP simple (ACME challenge)
ansible.builtin.copy:
dest: /etc/nginx/sites-available/certbot
content: |
server {
listen 80;
listen [::]:80;
server_name {{ domain_name }} {{ subdomains | join(' ') }};
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
return 200 'ok';
add_header Content-Type text/plain;
}
}
- name: Activer le site certbot
ansible.builtin.file:
src: /etc/nginx/sites-available/certbot
dest: /etc/nginx/sites-enabled/certbot
state: link
force: yes
- name: Désactiver le site par défaut
ansible.builtin.file:
path: /etc/nginx/sites-enabled/default
state: absent
- name: Tester la configuration Nginx
ansible.builtin.command: nginx -t
changed_when: false
- name: Redémarrer Nginx
ansible.builtin.systemd:
name: nginx
state: restarted
enabled: yes
- name: Ouvrir les ports dans UFW
ansible.builtin.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- "22"
- "80"
- "443"
- name: Vérifier si le certificat existe déjà
ansible.builtin.stat:
path: "/etc/letsencrypt/live/{{ domain_name }}/fullchain.pem"
register: cert_file
tags: [gen]
- name: Générer le certificat avec Certbot (domaine + sous-domaines)
ansible.builtin.command: >
certbot certonly --nginx
-d {{ domain_name }}
{{ subdomains | map('regex_replace', '^(.*)$', '-d \1') | join(' ') }}
--non-interactive
--agree-tos
--email admin@{{ domain_name }}
when: not cert_file.stat.exists
tags: [gen]
- name: Vérifier que le certificat a bien été généré
ansible.builtin.stat:
path: "/etc/letsencrypt/live/{{ domain_name }}/fullchain.pem"
register: cert_check
- name: Afficher le résultat
ansible.builtin.debug:
msg: "{{ 'Certificat généré : /etc/letsencrypt/live/' + domain_name + '/fullchain.pem' if cert_check.stat.exists else 'ERREUR : certificat non trouvé' }}"
- name: Vérifier le renouvellement automatique
ansible.builtin.command: certbot renew --dry-run
changed_when: false
failed_when: false
when: cert_check.stat.exists
- name: Créer le dossier docker/certs
ansible.builtin.file:
path: "{{ docker_dir }}/nginx/certs"
state: directory
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0750"
tags: [create]
- name: Copier fullchain.pem dans docker/certs
ansible.builtin.copy:
src: "/etc/letsencrypt/live/{{ domain_name }}/fullchain.pem"
dest: "{{ docker_dir }}/nginx/certs/fullchain.pem"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0644"
remote_src: yes
tags: [create]
- name: Copier privkey.pem dans docker/certs
ansible.builtin.copy:
src: "/etc/letsencrypt/live/{{ domain_name }}/privkey.pem"
dest: "{{ docker_dir }}/nginx/certs/privkey.pem"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0640"
remote_src: yes
tags: [create]
+106
View File
@@ -0,0 +1,106 @@
---
- name: Installation et configuration du clamAV
hosts: infra
become: true
gather_facts: true
tasks:
- name: Vérifier si ClamAV existe dans les dépôts
ansible.builtin.command: apt-cache search ^clamav$
register: clamav_search
changed_when: false
- name: Afficher résultat
ansible.builtin.debug:
var: clamav_search.stdout
- name: Installer ClamAV si disponible
ansible.builtin.apt:
name:
- clamav
- clamav-daemon
state: present
update_cache: true
when: clamav_search.stdout != ""
- name: Démarrer ClamAV
ansible.builtin.service:
name: clamav-daemon
state: started
enabled: true
when: clamav_search.stdout != ""
- name: Arrêter clamav-freshclam avant la mise à jour
ansible.builtin.service:
name: clamav-freshclam
state: stopped
when: clamav_search.stdout != ""
- name: Mettre à jour la base de données virale (freshclam)
ansible.builtin.command: freshclam
register: freshclam_result
changed_when: "'Database updated' in freshclam_result.stdout"
failed_when: freshclam_result.rc != 0
when: clamav_search.stdout != ""
- name: Redémarrer clamav-freshclam après la mise à jour
ansible.builtin.service:
name: clamav-freshclam
state: started
enabled: true
when: clamav_search.stdout != ""
- name: Configurer ClamAV - activer la détection PUA
ansible.builtin.lineinfile:
path: /etc/clamav/clamd.conf
regexp: "^#?DetectPUA"
line: "DetectPUA yes"
backup: true
when: clamav_search.stdout != ""
notify: Redémarrer clamav-daemon
- name: Configurer ClamAV - activer les logs
ansible.builtin.lineinfile:
path: /etc/clamav/clamd.conf
regexp: "^#?LogFile "
line: "LogFile /var/log/clamav/clamav.log"
backup: true
when: clamav_search.stdout != ""
notify: Redémarrer clamav-daemon
- name: Configurer ClamAV - taille max des fichiers scannés
ansible.builtin.lineinfile:
path: /etc/clamav/clamd.conf
regexp: "^#?MaxFileSize"
line: "MaxFileSize 100M"
backup: true
when: clamav_search.stdout != ""
notify: Redémarrer clamav-daemon
- name: Planifier un scan quotidien via cron
ansible.builtin.cron:
name: "ClamAV daily scan"
minute: "30"
hour: "2"
job: >
ionice -c 3 nice -n 19
docker exec gestion-clamav
clamscan -r /home /tmp /app/uploads
--log=/var/log/clamav/daily_scan.log --quiet
user: root
when: clamav_search.stdout != ""
- name: Afficher résultat final
ansible.builtin.debug:
msg: "ClamAV installé et configuré avec succès"
when: clamav_search.stdout != ""
- name: Afficher message si ClamAV non disponible
ansible.builtin.debug:
msg: "ClamAV n'est pas disponible dans les dépôts"
when: clamav_search.stdout == ""
handlers:
- name: Redémarrer clamav-daemon
ansible.builtin.service:
name: clamav-daemon
state: restarted
+332
View File
@@ -0,0 +1,332 @@
---
- name: Installation et configuration du Gitea Act Runner
hosts: infra
become: false
gather_facts: true
vars:
act_runner_version: "0.2.11"
act_runner_binary: /usr/local/bin/act_runner
act_runner_workdir: /opt/gitea-runner
act_runner_config: /opt/gitea-runner/.runner
gitea_instance_url: "https://gitea.uber-stup.club"
runner_name: "{{ inventory_hostname }}-runner"
runner_labels: "ubuntu-latest:docker://catthehacker/ubuntu:act-22.04,ubuntu-22.04:docker://catthehacker/ubuntu:act-22.04"
# ── Utilisateur CI/CD ────────────────────────────────
ci_cd_user: "ci-cd"
ci_cd_user_shell: "/bin/bash"
ci_cd_user_groups:
- docker
ci_cd_ssh_pubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICJ4COozE+71IvOhzK7ijeQY5lmoDxYTA0+B0lEAO0tG xor_fakers@AsusXor" # ex: "ssh-ed25519 AAAAC3Nza... ci-cd@gitea"
tasks:
# ── Verrou dpkg (unattended-upgrades / cloud-init au boot) ──
- name: Attendre la libération du verrou dpkg/apt
become: true
shell: |
while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 \
|| fuser /var/lib/dpkg/lock >/dev/null 2>&1 \
|| fuser /var/lib/apt/lists/lock >/dev/null 2>&1 \
|| fuser /var/cache/apt/archives/lock >/dev/null 2>&1; do
sleep 5
done
changed_when: false
args:
executable: /bin/bash
tags: always
# ── Prérequis ──────────────────────────────────────────
- name: Installer les paquets requis
become: true
apt:
name:
- curl
- ca-certificates
state: present
update_cache: yes
register: apt_prereqs_result
until: apt_prereqs_result is succeeded
retries: 10
delay: 15
# ── Docker (requis pour exécuter les jobs) ─────────────
- name: Vérifier si Docker est installé
become: true
command: docker --version
register: docker_check
changed_when: false
failed_when: false
- name: Installer Docker si absent
become: true
block:
- name: Ajouter la clé GPG Docker
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
keyring: /etc/apt/keyrings/docker.gpg
state: present
- name: Ajouter le dépôt Docker
apt_repository:
repo: "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
filename: docker
- name: Installer Docker
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
state: present
update_cache: yes
register: apt_docker_result
until: apt_docker_result is succeeded
retries: 10
delay: 15
- name: Démarrer et activer Docker
systemd:
name: docker
state: started
enabled: yes
when: docker_check.rc != 0
# ── Utilisateur dédié CI/CD ─────────────────────────────
- name: Vérifier que ci_cd_ssh_pubkey est fourni
fail:
msg: "La variable 'ci_cd_ssh_pubkey' est requise. Relancez avec : -e ci_cd_ssh_pubkey='ssh-ed25519 AAAA...'"
when: ci_cd_ssh_pubkey is not defined or ci_cd_ssh_pubkey == ""
tags: ["ci-cd-user"]
- name: Créer l'utilisateur CI/CD
become: true
user:
name: "{{ ci_cd_user }}"
shell: "{{ ci_cd_user_shell }}"
groups: "{{ ci_cd_user_groups }}"
append: true
create_home: true
state: present
tags: ["ci-cd-user"]
- name: Créer le répertoire .ssh de l'utilisateur CI/CD
become: true
file:
path: "/home/{{ ci_cd_user }}/.ssh"
state: directory
owner: "{{ ci_cd_user }}"
group: "{{ ci_cd_user }}"
mode: "0700"
tags: ["ci-cd-user"]
- name: Déployer la clé publique SSH de l'utilisateur CI/CD
become: true
authorized_key:
user: "{{ ci_cd_user }}"
key: "{{ ci_cd_ssh_pubkey }}"
state: present
exclusive: false
tags: ["ci-cd-user"]
- name: Autoriser l'utilisateur CI/CD à utiliser Docker sans mot de passe (sudo ciblé, optionnel)
become: true
copy:
dest: "/etc/sudoers.d/{{ ci_cd_user }}-docker"
content: "{{ ci_cd_user }} ALL=(ALL) NOPASSWD: /usr/bin/docker\n"
mode: "0440"
validate: "visudo -cf %s"
tags: ["ci-cd-user"]
# ── Téléchargement act_runner ──────────────────────────
- name: Vérifier si act_runner est déjà installé
become: true
stat:
path: "{{ act_runner_binary }}"
register: runner_bin
tags: ["runner", "register-runner"]
- name: Récupérer la version installée
become: true
command: "{{ act_runner_binary }} --version"
register: installed_version
changed_when: false
failed_when: false
when: runner_bin.stat.exists
tags: ["runner", "register-runner"]
- name: Télécharger act_runner v{{ act_runner_version }}
become: true
get_url:
url: "https://dl.gitea.com/act_runner/{{ act_runner_version }}/act_runner-{{ act_runner_version }}-linux-amd64"
dest: "{{ act_runner_binary }}"
mode: "0755"
force: yes
tags: ["runner", "register-runner"]
when: >
not (runner_bin.stat.exists | default(false)) or
(installed_version.stdout is defined and act_runner_version not in installed_version.stdout)
# ── Répertoire de travail ──────────────────────────────
- name: Créer le répertoire de travail
become: true
file:
path: "{{ act_runner_workdir }}"
state: directory
mode: "0750"
tags: ["register-runner"]
# ── Enregistrement du runner ───────────────────────────
- name: Vérifier que gitea_runner_token est fourni
become: true
fail:
msg: "La variable 'gitea_runner_token' est requise. Relancez avec : -e gitea_runner_token=<token>"
when: gitea_runner_token is not defined or gitea_runner_token == ""
tags: ["register-runner"]
- name: Vérifier si le runner est déjà enregistré
become: true
stat:
path: "{{ act_runner_config }}"
register: runner_config
tags: ["register-runner"]
- name: Arrêter le service avant re-enregistrement
become: true
systemd:
name: gitea-runner
state: stopped
failed_when: false
when: gitea_runner_token is defined and runner_config.stat.exists
tags: ["register-runner"]
- name: Supprimer l'ancienne configuration du runner
become: true
file:
path: "{{ act_runner_config }}"
state: absent
when: gitea_runner_token is defined and runner_config.stat.exists
tags: ["register-runner"]
- name: Enregistrer le runner auprès de Gitea
become: true
command: >
{{ act_runner_binary }} register
--instance {{ gitea_instance_url }}
--token {{ gitea_runner_token }}
--name {{ runner_name }}
--labels {{ runner_labels }}
--no-interactive
args:
chdir: "{{ act_runner_workdir }}"
no_log: true
tags: ["register-runner"]
# ── Service systemd ────────────────────────────────────
- name: Créer le service systemd gitea-runner
become: true
copy:
dest: /etc/systemd/system/gitea-runner.service
mode: "0644"
content: |
[Unit]
Description=Gitea Act Runner
After=network.target docker.service
Requires=docker.service
[Service]
ExecStart={{ act_runner_binary }} daemon
WorkingDirectory={{ act_runner_workdir }}
Restart=always
RestartSec=5
User=root
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
notify: Recharger systemd
tags: ["register-runner"]
- name: Activer et démarrer le service gitea-runner
become: true
systemd:
name: gitea-runner
state: started
enabled: yes
daemon_reload: yes
tags: ["register-runner"]
# ── Vérification ───────────────────────────────────────
- name: Vérifier le statut du runner
become: true
command: systemctl status gitea-runner
register: runner_status
changed_when: false
failed_when: false
tags: ["register-runner"]
- name: Afficher le statut
become: true
debug:
msg: "{{ runner_status.stdout_lines }}"
tags: ["register-runner"]
- name: Check if swap is already active
become: true
ansible.builtin.command: swapon --show
register: swap_status
changed_when: false
tags: ["register-runner"]
- name: Create swapfile
become: true
ansible.builtin.command: "fallocate -l {{ swap_size }} {{ swap_file }}"
args:
creates: "{{ swap_file }}"
tags: ["register-runner"]
when: swap_status.stdout == ""
- name: Set swapfile permissions
become: true
ansible.builtin.file:
path: "{{ swap_file }}"
mode: "0600"
owner: root
group: root
tags: ["register-runner"]
- name: Format swap
become: true
ansible.builtin.command: mkswap {{ swap_file }}
tags: ["register-runner"]
when: swap_status.stdout == ""
- name: Enable swap
become: true
ansible.builtin.command: swapon {{ swap_file }}
tags: ["register-runner"]
when: swap_status.stdout == ""
- name: Ensure swap in fstab
become: true
ansible.builtin.lineinfile:
path: /etc/fstab
line: "{{ swap_file }} none swap sw 0 0"
state: present
tags: ["register-runner"]
- name: Set swappiness
become: true
ansible.builtin.sysctl:
name: vm.swappiness
value: "{{ swap_swappiness }}"
state: present
reload: yes
tags: ["register-runner"]
handlers:
- name: Recharger systemd
become: true
systemd:
daemon_reload: yes
+146
View File
@@ -0,0 +1,146 @@
---
- name: S3 backup pour la db de prod
hosts: infra
become: true
gather_facts: true
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install required packages
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- acl
state: present
tags: docker
- name: Create directory for Docker GPG key
file:
path: /etc/apt/keyrings
state: directory
mode: "0755"
tags: docker
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
keyring: /etc/apt/keyrings/docker.gpg
state: present
tags: docker
- name: Get system architecture
command: dpkg --print-architecture
register: system_arch
changed_when: false
- name: Get Ubuntu codename
command: lsb_release -cs
register: ubuntu_codename
changed_when: false
- name: Add Docker repository
apt_repository:
repo: "deb [arch={{ system_arch.stdout }} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu {{ ubuntu_codename.stdout }} stable"
state: present
filename: docker
tags: docker
- name: Update apt cache after adding repo
apt:
update_cache: yes
tags: docker
- name: Install Docker packages
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-buildx-plugin
- docker-compose-plugin
state: present
tags: docker
- name: Ensure Docker service is started and enabled
systemd:
name: docker
state: started
enabled: yes
tags: docker
- name: Create docker group
group:
name: "{{ docker_group }}"
state: present
tags: docker
- name: Create docker user
user:
name: "{{ docker_user }}"
group: "{{ docker_group }}"
groups: docker
append: yes
shell: /bin/bash
create_home: yes
state: present
tags: docker
- name: Add ansible user to docker group
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
when: ansible_user is defined
tags: docker
- name: Verify Docker installation
command: docker --version
register: docker_version
changed_when: false
tags: docker
- name: Verify Docker Compose installation
command: docker compose version
register: compose_version
changed_when: false
tags: docker
- name: Display versions
debug:
msg:
- "{{ docker_version.stdout }}"
- "{{ compose_version.stdout }}"
tags: docker
- name: Copy S3 project
ansible.builtin.copy:
src: ../monitoring/s3-backup/
dest: "{{ docker_dir }}/"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0755"
tags: project
- name: Ensure parent directory has correct permissions
ansible.builtin.file:
path: "{{ docker_dir }}"
state: directory
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0755"
tags: project
- name: Set correct permissions for Docker files
ansible.builtin.file:
path: "{{ docker_dir }}"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
recurse: yes
tags: project
+146
View File
@@ -0,0 +1,146 @@
---
- name: Déploiement OTA & S3 pour les build
hosts: infra
become: true
gather_facts: true
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install required packages
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- acl
state: present
tags: docker
- name: Create directory for Docker GPG key
file:
path: /etc/apt/keyrings
state: directory
mode: "0755"
tags: docker
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
keyring: /etc/apt/keyrings/docker.gpg
state: present
tags: docker
- name: Get system architecture
command: dpkg --print-architecture
register: system_arch
changed_when: false
- name: Get Ubuntu codename
command: lsb_release -cs
register: ubuntu_codename
changed_when: false
- name: Add Docker repository
apt_repository:
repo: "deb [arch={{ system_arch.stdout }} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu {{ ubuntu_codename.stdout }} stable"
state: present
filename: docker
tags: docker
- name: Update apt cache after adding repo
apt:
update_cache: yes
tags: docker
- name: Install Docker packages
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-buildx-plugin
- docker-compose-plugin
state: present
tags: docker
- name: Ensure Docker service is started and enabled
systemd:
name: docker
state: started
enabled: yes
tags: docker
- name: Create docker group
group:
name: "{{ docker_group }}"
state: present
tags: docker
- name: Create docker user
user:
name: "{{ docker_user }}"
group: "{{ docker_group }}"
groups: docker
append: yes
shell: /bin/bash
create_home: yes
state: present
tags: docker
- name: Add ansible user to docker group
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
when: ansible_user is defined
tags: docker
- name: Verify Docker installation
command: docker --version
register: docker_version
changed_when: false
tags: docker
- name: Verify Docker Compose installation
command: docker compose version
register: compose_version
changed_when: false
tags: docker
- name: Display versions
debug:
msg:
- "{{ docker_version.stdout }}"
- "{{ compose_version.stdout }}"
tags: docker
- name: Copy S3 project
ansible.builtin.copy:
src: ../monitoring/s3/
dest: "{{ docker_dir }}/"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0755"
tags: project
- name: Ensure parent directory has correct permissions
ansible.builtin.file:
path: "{{ docker_dir }}"
state: directory
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0755"
tags: project
- name: Set correct permissions for Docker files
ansible.builtin.file:
path: "{{ docker_dir }}"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
recurse: yes
tags: project
+155
View File
@@ -0,0 +1,155 @@
---
- name: Déploiement des solution de monitoring et de sécurité
hosts: infra
become: true
gather_facts: true
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install required packages
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- acl
state: present
tags: docker
- name: Create directory for Docker GPG key
file:
path: /etc/apt/keyrings
state: directory
mode: "0755"
tags: docker
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
keyring: /etc/apt/keyrings/docker.gpg
state: present
tags: docker
- name: Get system architecture
command: dpkg --print-architecture
register: system_arch
changed_when: false
- name: Get Ubuntu codename
command: lsb_release -cs
register: ubuntu_codename
changed_when: false
- name: Add Docker repository
apt_repository:
repo: "deb [arch={{ system_arch.stdout }} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu {{ ubuntu_codename.stdout }} stable"
state: present
filename: docker
tags: docker
- name: Update apt cache after adding repo
apt:
update_cache: yes
tags: docker
- name: Install Docker packages
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-buildx-plugin
- docker-compose-plugin
state: present
tags: docker
- name: Ensure Docker service is started and enabled
systemd:
name: docker
state: started
enabled: yes
tags: docker
- name: Create docker group
group:
name: "{{ docker_group }}"
state: present
tags: docker
- name: Create docker user
user:
name: "{{ docker_user }}"
group: "{{ docker_group }}"
groups: docker
append: yes
shell: /bin/bash
create_home: yes
state: present
tags: docker
- name: Add ansible user to docker group
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
when: ansible_user is defined
tags: docker
- name: Verify Docker installation
command: docker --version
register: docker_version
changed_when: false
tags: docker
- name: Verify Docker Compose installation
command: docker compose version
register: compose_version
changed_when: false
tags: docker
- name: Display versions
debug:
msg:
- "{{ docker_version.stdout }}"
- "{{ compose_version.stdout }}"
tags: docker
- name: Copy Docker project
ansible.builtin.copy:
src: ../monitoring/security/
dest: "{{ docker_dir }}/"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0755"
tags: project
- name: Ensure parent directory has correct permissions
ansible.builtin.file:
path: "{{ docker_dir }}"
state: directory
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0755"
tags: project
- name: Set correct permissions for Docker files
ansible.builtin.file:
path: "{{ docker_dir }}"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
recurse: yes
tags: project
- name: Set permissions for .env file
ansible.builtin.file:
path: "{{ docker_dir }}/.env"
owner: "{{ docker_user }}"
group: "{{ docker_group }}"
mode: "0640"
tags: project
ignore_errors: yes
+77
View File
@@ -0,0 +1,77 @@
---
- name: Mises à jour de sécurité automatiques (unattended-upgrades)
hosts: load-balancer
become: true
tasks:
- name: Installer unattended-upgrades et jq (notification Discord)
ansible.builtin.apt:
name:
- unattended-upgrades
- jq
state: present
update_cache: true
- name: Déployer la config des origines/exclusions (50unattended-upgrades)
ansible.builtin.template:
src: ../templates/unattended-upgrades-50.j2
dest: /etc/apt/apt.conf.d/50unattended-upgrades
owner: root
group: root
mode: "0644"
- name: Déployer la config d'activation périodique (20auto-upgrades)
ansible.builtin.template:
src: ../templates/unattended-upgrades-20.j2
dest: /etc/apt/apt.conf.d/20auto-upgrades
owner: root
group: root
mode: "0644"
- name: Déployer le script de notification Discord
ansible.builtin.template:
src: ../templates/unattended-upgrades-notify.sh.j2
dest: /usr/local/bin/unattended-upgrades-notify.sh
owner: root
group: root
mode: "0750"
- name: Déployer le service systemd de notification
ansible.builtin.template:
src: ../templates/unattended-upgrades-notify.service.j2
dest: /etc/systemd/system/unattended-upgrades-notify.service
owner: root
group: root
mode: "0644"
notify: Recharger systemd
- name: Déployer le timer systemd de notification
ansible.builtin.template:
src: ../templates/unattended-upgrades-notify.timer.j2
dest: /etc/systemd/system/unattended-upgrades-notify.timer
owner: root
group: root
mode: "0644"
notify: Recharger systemd
- name: Activer et démarrer le timer de notification
ansible.builtin.systemd:
name: unattended-upgrades-notify.timer
enabled: true
state: started
daemon_reload: true
- name: Vérifier la config avec un dry-run
ansible.builtin.command: unattended-upgrade --dry-run --debug
register: dry_run_result
changed_when: false
failed_when: false
- name: Afficher le résultat du dry-run
ansible.builtin.debug:
var: dry_run_result.stdout_lines
handlers:
- name: Recharger systemd
ansible.builtin.systemd:
daemon_reload: true
+132
View File
@@ -0,0 +1,132 @@
---
- name: Configure WireGuard VPN Client
hosts: load-balancer
become: true
vars:
vpn_ip: "10.0.0.12"
vpn_private_key: "+E1pcelkLIr0x6FcOofnAWAFr6g5qHu8QHpG1sY6mG4="
vpn_server_pubkey: "VQa6g1foaXhJgYWbwyJ9R/EAmmXg0nOnhPhbIIPLlmg="
vpn_server_ip: "131.123.42.158"
vpn_server_port: "51820"
vpn_network: "10.0.0.0/24"
vpn_private_ip: "10.0.0.1"
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install WireGuard and tools
apt:
name:
- wireguard
- wireguard-tools
state: present
- name: Create WireGuard config directory
file:
path: /etc/wireguard
state: directory
mode: '0700'
- name: Create WireGuard config
copy:
content: |
[Interface]
Address = {{ vpn_ip }}/32
ListenPort = 51821
PrivateKey = {{ vpn_private_key }}
[Peer]
PublicKey = {{ vpn_server_pubkey }}
Endpoint = {{ vpn_server_ip }}:{{ vpn_server_port }}
AllowedIPs = {{ vpn_network }}
PersistentKeepalive = 25
dest: /etc/wireguard/wg0.conf
mode: '0600'
register: wg_config
- name: Enable WireGuard service
systemd:
name: wg-quick@wg0
enabled: yes
state: started
- name: Redémarrer WireGuard si la config a changé (state:started ne recharge pas seul)
systemd:
name: wg-quick@wg0
state: restarted
when: wg_config.changed
- name: Enregistrer le pair load-balancer sur le serveur VPN
hosts: vpn-uber
become: true
vars:
vpn_ip: "10.0.0.12"
vpn_private_key: "+E1pcelkLIr0x6FcOofnAWAFr6g5qHu8QHpG1sY6mG4="
tasks:
- name: Calculer la clé publique du client à partir de sa clé privée
command: wg pubkey
args:
stdin: "{{ vpn_private_key }}"
delegate_to: localhost
become: false
register: client_pubkey
changed_when: false
no_log: true
tags: [vpn]
- name: Ajouter le pair dans wg0.conf
ansible.builtin.blockinfile:
path: /etc/wireguard/wg0.conf
marker: "# {mark} PEER load-balancer"
insertafter: EOF
block: |
[Peer]
PublicKey = {{ client_pubkey.stdout }}
AllowedIPs = {{ vpn_ip }}/32
register: peer_added
tags: [vpn]
- name: Appliquer la config sans couper les autres pairs
ansible.builtin.shell: wg syncconf wg0 <(wg-quick strip wg0)
args:
executable: /bin/bash
when: peer_added.changed
tags: [vpn]
- name: Vérifier la connectivité VPN du load-balancer
hosts: load-balancer
become: true
vars:
vpn_ip: "10.0.0.12"
vpn_private_ip: "10.0.0.1"
tasks:
- name: Wait for VPN connection to establish
pause:
seconds: 3
- name: Check VPN connection
command: ip addr show wg0
register: wg_status
changed_when: false
- name: Test VPN connectivity
command: ping -c 1 "{{ vpn_private_ip }}"
register: ping_result
ignore_errors: yes
- name: Display VPN status
debug:
msg: |
VPN Configuration Complete!
IP Address: {{ vpn_ip }}
WireGuard Status:
{{ wg_status.stdout }}
Ping result ({{ 'SUCCESS' if ping_result.rc == 0 else 'FAILED' }}):
{{ ping_result.stdout | default('Connection test deferred') }}