From 33d55744cc2ff41dbbb8914d8da9496cfb9877fd Mon Sep 17 00:00:00 2001 From: Thomas MALGOUYRES Date: Fri, 17 Jul 2026 14:01:20 +0000 Subject: [PATCH] add tracearr lxc and docker install --- inventory/hosts.ini | 4 + playbooks/create-docker-lxc.yml | 163 ++++++++++++++++++++++++++++---- playbooks/install_docker.yml | 97 +++++++++++++++++++ 3 files changed, 244 insertions(+), 20 deletions(-) create mode 100644 playbooks/install_docker.yml diff --git a/inventory/hosts.ini b/inventory/hosts.ini index 95f9f56..15970ba 100644 --- a/inventory/hosts.ini +++ b/inventory/hosts.ini @@ -10,3 +10,7 @@ pve02 ansible_host=10.100.5.251 ansible_user=root ansible_python_interpreter=/us [docker_test] docker-test ansible_host=10.100.5.90 ansible_user=ansible ansible_python_interpreter=/usr/bin/python3 +# BEGIN ANSIBLE MANAGED tracearr +[tracearr_servers] +tracearr ansible_host=10.100.5.102 ansible_user=ansible ansible_python_interpreter=/usr/bin/python3 +# END ANSIBLE MANAGED tracearr diff --git a/playbooks/create-docker-lxc.yml b/playbooks/create-docker-lxc.yml index 24a66f1..78b9b9d 100644 --- a/playbooks/create-docker-lxc.yml +++ b/playbooks/create-docker-lxc.yml @@ -1,35 +1,94 @@ -- name: Create Docker ready LXC +--- +# Playbook: create-docker-lxc.yml +# +# But: +# - Creer un conteneur LXC Proxmox pret pour Docker +# - Activer les options necessaires pour Docker dans LXC +# - Installer les paquets de base +# - Creer un utilisateur ansible +# - Ajouter la cle SSH de ansible-srv +# - Ajouter automatiquement le nouveau LXC dans inventory/hosts.ini +# +# Exemple: +# ansible-playbook -i inventory/hosts.ini playbooks/create-docker-lxc.yml \ +# -e target_node=pve02 \ +# -e lxc_ctid=102 \ +# -e lxc_hostname=tracearr \ +# -e lxc_ip=10.100.5.102/24 \ +# -e lxc_gateway=10.100.5.1 \ +# -e lxc_memory=2048 \ +# -e lxc_swap=1024 \ +# -e lxc_disk=20 \ +# -e lxc_inventory_group=tracearr_servers + +- name: Creer un LXC pret pour Docker hosts: "{{ target_node }}" become: false gather_facts: false vars: + # Identite du conteneur LXC lxc_ctid: 900 lxc_hostname: docker-test + + # Configuration reseau du conteneur lxc_ip: 10.100.5.90/24 lxc_gateway: 10.100.5.1 lxc_bridge: vmbr0 + + # Stockages Proxmox + # lxc_storage: stockage ou sera cree le disque du conteneur + # lxc_template_storage: stockage ou se trouve le template LXC lxc_storage: proxmox-data-nfs lxc_template_storage: proxmox-data-nfs + + # Template Debian utilise pour creer le conteneur lxc_template: debian-13-standard_13.1-2_amd64.tar.zst + + # Ressources du conteneur lxc_cores: 1 lxc_memory: 512 lxc_swap: 512 lxc_disk: 8 + # IP du serveur Ansible + # Cette IP sera utilisee dans authorized_keys pour limiter la cle SSH + ansible_controller_ip: 10.100.5.100 + + # Fichier inventaire a mettre a jour automatiquement + lxc_inventory_file: "{{ playbook_dir }}/../inventory/hosts.ini" + + # Groupe Ansible ajoute dans inventory/hosts.ini + # Exemple: + # lxc_hostname=tracearr -> tracearr_servers + lxc_inventory_group: "{{ lxc_hostname | replace('-', '_') }}_servers" + + # Parametres Ansible du futur conteneur + lxc_ansible_user: ansible + lxc_ansible_python_interpreter: /usr/bin/python3 + + # IP sans le /24 + # Exemple: 10.100.5.102/24 -> 10.100.5.102 + lxc_ip_address: "{{ lxc_ip.split('/')[0] }}" + tasks: - - name: Check if CT already exists + # On verifie que le CTID n'existe pas deja. + # Le playbook s'arrete si le conteneur existe deja pour eviter + # d'ecraser un service existant. + - name: Verifier si le CT existe deja command: pct status {{ lxc_ctid }} register: ct_status changed_when: false failed_when: false - - name: Stop if CT already exists + - name: Arreter si le CT existe deja fail: msg: "CT {{ lxc_ctid }} already exists on this node. Stop to avoid overwrite." when: ct_status.rc == 0 - - name: Copy ansible public key to Proxmox node + # On copie la cle publique de ansible-srv sur le noeud Proxmox. + # Elle sera injectee dans le compte root du LXC au moment du pct create. + - name: Copier la cle publique Ansible sur le noeud Proxmox copy: content: "{{ lookup('file', '/root/.ssh/id_ed25519.pub') }}" dest: /tmp/ansible-srv.pub @@ -37,7 +96,20 @@ group: root mode: "0600" - - name: Create LXC container + # Creation du conteneur LXC. + # + # --unprivileged 1: + # conteneur non privilegie, plus securise + # + # --features nesting=1,keyctl=1: + # options necessaires pour faire tourner Docker dans un LXC + # + # --ssh-public-keys: + # ajoute la cle SSH dans le LXC lors de la creation + # + # --start 1: + # demarre le conteneur directement apres creation + - name: Creer le conteneur LXC command: > pct create {{ lxc_ctid }} {{ lxc_template_storage }}:vztmpl/{{ lxc_template }} @@ -54,43 +126,63 @@ --start 1 register: create_result - - name: Show create result + - name: Afficher le resultat de creation debug: var: create_result.stdout_lines - - name: Wait a few seconds after first boot + # Petite pause pour laisser le conteneur terminer son premier demarrage. + - name: Attendre le premier demarrage pause: seconds: 10 - - name: Update package cache inside CT + # Mise a jour du cache APT dans le conteneur. + - name: Mettre a jour le cache APT dans le CT command: pct exec {{ lxc_ctid }} -- apt update changed_when: false - - name: Install base packages inside CT + # Installation des paquets minimums. + # + # openssh-server: acces SSH + # sudo: elevation de privileges pour Ansible + # python3: obligatoire pour les modules Ansible + # curl/gnupg/ca-certificates: utiles pour installer Docker ensuite + # nano: edition manuelle si besoin + - name: Installer les paquets de base dans le CT command: > pct exec {{ lxc_ctid }} -- apt install -y openssh-server sudo python3 curl ca-certificates gnupg nano changed_when: true - - name: Enable SSH inside CT + - name: Activer SSH dans le CT command: pct exec {{ lxc_ctid }} -- systemctl enable --now ssh changed_when: true - - name: Create ansible user inside CT + # Creation de l'utilisateur ansible. + # Cet utilisateur sera utilise pour piloter le LXC via SSH. + - name: Creer l utilisateur ansible dans le CT command: pct exec {{ lxc_ctid }} -- bash -c "id ansible || useradd -m -s /bin/bash ansible" changed_when: true - - name: Create ansible ssh directory inside CT + - name: Creer le dossier SSH de l utilisateur ansible command: pct exec {{ lxc_ctid }} -- mkdir -p /home/ansible/.ssh changed_when: true - - name: Add ansible public key inside CT + # Ajout de la cle publique Ansible dans authorized_keys. + # + # from="10.100.5.100": + # la cle SSH ne peut etre utilisee que depuis ansible-srv + # + # no-agent-forwarding / no-X11-forwarding / no-port-forwarding: + # limite les usages possibles de cette cle + - name: Ajouter la cle publique Ansible dans le CT command: > pct exec {{ lxc_ctid }} -- bash -c - 'echo "from=\"10.100.5.100\",no-agent-forwarding,no-X11-forwarding,no-port-forwarding {{ lookup("file", "/root/.ssh/id_ed25519.pub") }}" > /home/ansible/.ssh/authorized_keys' + 'echo "from=\"{{ ansible_controller_ip }}\",no-agent-forwarding,no-X11-forwarding,no-port-forwarding {{ lookup("file", "/root/.ssh/id_ed25519.pub") }}" > /home/ansible/.ssh/authorized_keys' changed_when: true - - name: Fix ssh permissions inside CT + # Permissions SSH strictes. + # Sans ces permissions, SSH peut refuser la cle. + - name: Corriger les permissions SSH dans le CT command: > pct exec {{ lxc_ctid }} -- bash -c "chown -R ansible:ansible /home/ansible/.ssh && @@ -98,22 +190,53 @@ chmod 600 /home/ansible/.ssh/authorized_keys" changed_when: true - - name: Configure sudo for ansible user inside CT + # Sudo sans mot de passe pour Ansible. + # Necessaire pour que les playbooks puissent installer Docker, + # copier des fichiers dans /opt/stacks et gerer les services. + # + # Plus tard, on pourra reduire ces droits. + - name: Configurer sudo pour l utilisateur ansible command: > pct exec {{ lxc_ctid }} -- bash -c "echo 'ansible ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/ansible && chmod 440 /etc/sudoers.d/ansible" changed_when: true - - name: Check sudoers file inside CT + # Verification de la syntaxe sudoers. + # Important: une erreur sudoers peut casser sudo. + - name: Verifier le fichier sudoers dans le CT command: pct exec {{ lxc_ctid }} -- visudo -cf /etc/sudoers.d/ansible changed_when: false - - name: Show final CT status + # On attend que le port SSH du nouveau LXC soit accessible + # depuis ansible-srv. + - name: Attendre SSH depuis ansible-srv + wait_for: + host: "{{ lxc_ip_address }}" + port: 22 + timeout: 120 + delegate_to: localhost + become: false + + # Ajout automatique du nouveau LXC dans inventory/hosts.ini. + # + # blockinfile evite les doublons: + # si le bloc existe deja, il est mis a jour. + - name: Ajouter le nouveau LXC dans l inventaire Ansible + blockinfile: + path: "{{ lxc_inventory_file }}" + marker: "# {mark} ANSIBLE MANAGED {{ lxc_hostname }}" + block: | + [{{ lxc_inventory_group }}] + {{ lxc_hostname }} ansible_host={{ lxc_ip_address }} ansible_user={{ lxc_ansible_user }} ansible_python_interpreter={{ lxc_ansible_python_interpreter }} + delegate_to: localhost + become: false + + - name: Verifier le statut final du CT command: pct status {{ lxc_ctid }} register: final_status changed_when: false - - name: Show final status + - name: Afficher le statut final du CT debug: - var: final_status.stdout + var: final_status.stdout \ No newline at end of file diff --git a/playbooks/install_docker.yml b/playbooks/install_docker.yml new file mode 100644 index 0000000..687b309 --- /dev/null +++ b/playbooks/install_docker.yml @@ -0,0 +1,97 @@ +--- +# Playbook: install-docker.yml +# +# But: +# - Installer Docker Engine dans un LXC Debian +# - Installer le plugin Docker Compose +# - Activer le service Docker +# - Ajouter l utilisateur ansible au groupe docker + +- name: Installer Docker Engine + hosts: "{{ target_group | default('docker_hosts') }}" + become: true + gather_facts: true + + tasks: + - name: Supprimer les paquets Docker conflictuels + apt: + name: + - docker.io + - docker-compose + - docker-doc + - podman-docker + state: absent + failed_when: false + + - name: Installer les paquets requis + apt: + name: + - ca-certificates + - curl + - gnupg + state: present + update_cache: true + + - name: Creer le dossier apt keyrings + file: + path: /etc/apt/keyrings + state: directory + mode: "0755" + + - name: Telecharger la cle GPG Docker + get_url: + url: https://download.docker.com/linux/debian/gpg + dest: /etc/apt/keyrings/docker.asc + mode: "0644" + + - name: Ajouter le depot apt Docker + copy: + dest: /etc/apt/sources.list.d/docker.sources + mode: "0644" + content: | + Types: deb + URIs: https://download.docker.com/linux/debian + Suites: {{ ansible_distribution_release }} + Components: stable + Signed-By: /etc/apt/keyrings/docker.asc + + - name: Installer les paquets Docker + apt: + name: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + state: present + update_cache: true + + - name: Activer et demarrer Docker + service: + name: docker + enabled: true + state: started + + - name: Ajouter ansible au groupe docker + user: + name: ansible + groups: docker + append: true + + - name: Verifier la version Docker + command: docker --version + register: docker_version + changed_when: false + + - name: Afficher la version Docker + debug: + var: docker_version.stdout + + - name: Verifier la version Docker Compose + command: docker compose version + register: compose_version + changed_when: false + + - name: Afficher la version Docker Compose + debug: + var: compose_version.stdout