add tracearr lxc and docker install

This commit is contained in:
2026-07-17 14:01:20 +00:00
parent 87e30e9acf
commit 33d55744cc
3 changed files with 244 additions and 20 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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