# Ansible

# AWX

# Démarrage - Première connexion

# 🚀 1. Première connexion

Accède à AWX via ton service :

<div class="relative w-full mt-4 mb-1" id="bkmrk-kubectl-get-svc--n-a"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-kubectl-get-svc--n-a-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">kubectl <span class="ͼs">get</span> svc <span class="ͼu">-n</span> awx</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>👉 URL = `http://<node-ip>:30080` (dans ton cas)

Login :

- user : `admin`
- password :

<div class="relative w-full mt-4 mb-1" id="bkmrk-kubectl-get-secret--"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-kubectl-get-secret---1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">kubectl <span class="ͼs">get</span> secret <span class="ͼu">-n</span> awx awx-admin-password <span class="ͼu">-o</span> <span class="ͼt">jsonpath</span><span class="ͼn">=</span><span class="ͼr">"{.data.password}"</span> | base64 <span class="ͼu">-d</span></div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

# ⚙️ 2. Configuration minimale (à faire tout de suite)

Dans l’UI AWX :

### 👉 Settings → System

- Time zone → `Europe/Paris`
- (optionnel) définir un base URL si tu exposes proprement

---

# 🔑 3. Créer une Credential SSH

C’est la base de tout.

### 👉 Resources → Credentials → Add

Type : **Machine**

Remplis :

- Name : `ssh-homelab`
- Username : ton user (`root` ou autre)
- Private key : ta clé SSH

👉 Exemple :

<div class="relative w-full mt-4 mb-1" id="bkmrk-cat-%7E%2F.ssh%2Fid_rsa"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-cat-%7E%2F.ssh%2Fid_rsa-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼs">cat</span> ~/.ssh/id_rsa</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>Colle la clé privée.

---

# 🖥️ 4. Créer un Inventory

### 👉 Resources → Inventories → Add

- Name : `homelab`

Puis :

### 👉 Hosts → Add

Exemple :

<div class="relative w-full mt-4 mb-1" id="bkmrk-name%3A-node1variables"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-name%3A-node1variables-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">name: node1  
variables:  
ansible_host: 10.151.151.10  
ansible_user: root</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>👉 Tu peux aussi ajouter un groupe :

- `k8s`
- `vm`
- `nas`

---

# 📦 5. Créer un Project (Git)

AWX bosse avec Git, pas avec des fichiers locaux.

### 👉 Resources → Projects → Add

- Name : `homelab-infra`
- Source Control Type : Git
- URL : ton repo (GitHub / Gitea / GitLab)

👉 Si privé :  
→ ajoute une credential Git (token ou clé SSH)

---

# ▶️ 6. Créer un Job Template

C’est là que tout s’exécute.

### 👉 Resources → Templates → Add → Job Template

Remplis :

- Name : `Ping test`
- Inventory : `homelab`
- Project : `homelab-infra`
- Playbook : `ping.yml`
- Credentials : `ssh-homelab`

---

# 🧪 7. Exemple de playbook

Dans ton repo Git :

<div class="relative w-full mt-4 mb-1" id="bkmrk-%23-ping.yml--hosts%3A-a"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-%23-ping.yml--hosts%3A-a-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span class="ͼl">\# ping.yml</span>  
- hosts: all  
gather_facts: false  
tasks:  
- name: Test ping  
ping:</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

# ▶️ 8. Lancer un job

Clique sur 🚀

👉 Si tout est bon :

- hosts OK
- SSH OK
- repo OK

➡️ tu vois les résultats en live

---

# 🔁 9. Bonus utiles (important en homelab)

### ✔️ Variables globales (Inventory → Variables)

<div class="relative w-full mt-4 mb-1" id="bkmrk-ansible_python_inter"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk-ansible_python_inter-1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">ansible_python_interpreter: /usr/bin/python3</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

### ✔️ Tester la connectivité

Ajoute un playbook :

<div class="relative w-full mt-4 mb-1" id="bkmrk---hosts%3A-alltasks%3A--"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="relative"><div class=""><div class="relative z-0 flex max-w-full"><div class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼk ͼy" dir="ltr" id="bkmrk---hosts%3A-alltasks%3A---1"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly">- hosts: all  
tasks:  
- command: hostname</div></div></div></div></div></div></div></div></div></div><div class=""><div class="">  
</div></div></div></div></div>---

### ✔️ Ajouter sudo

Dans Credential :

- Privilege escalation : ✔️
- Method : sudo

---

# 🔐 10. Bonnes pratiques dès le début

👉 Tu es déjà en GitOps avec ArgoCD, donc :

- ✔️ versionne : 
    - inventories (via SCM)
    - projets
    - playbooks
- ❌ évite : 
    - config manuelle non trackée

---

# 🧠 Ce que tu viens de construire

Avec ça tu as :

- AWX = orchestrateur
- Git = source de vérité
- SSH = accès machines
- Kubernetes = infra

👉 Tu peux maintenant :

- déployer des apps
- configurer tes nodes
- gérer ton cluster

# Création d'un Token API AWX et Commandes Utiles

L'API REST d'AWX permet d'automatiser et de piloter l'intégralité de votre infrastructure sans passer par l'interface web. Pour interagir avec cette API en toute sécurité, il est nécessaire de générer un **Personal Access Token (PAT)**.

---

## 1. Créer un Token d'Accès dans AWX

La génération du token se fait une seule fois depuis l'interface web d'AWX :

1. Connectez-vous à l'interface web d'AWX avec votre compte administrateur.
2. Dans le menu latéral de gauche, allez dans **Access** &gt; **Users**.
3. Cliquez sur votre nom d'utilisateur (ex: *admin*).
4. Allez dans l'onglet **Tokens** en haut de la page.
5. Cliquez sur le bouton **Add** (Ajouter).
6. Remplissez le formulaire : 
    - **Description :** Donnez un nom clair (ex: *Token Script Bash Homelab*).
    - **Scope (Portée) :** Sélectionnez **Write** (si vous avez besoin de lancer des jobs) ou **All**.
7. Cliquez sur **Save**.

> **⚠️ ATTENTION :** Le Token généré (une longue chaîne de caractères) ne s'affichera **qu'une seule fois**. Copiez-le immédiatement et conservez-le dans un endroit sûr (comme un gestionnaire de mots de passe ou Vaultwarden).

---

## 2. Comment utiliser le Token

Pour chaque requête API (souvent via `curl`), vous devez passer ce token dans les en-têtes (Headers) HTTP pour prouver votre identité.

```bash
# Structure de base de l'authentification
curl -H "Authorization: Bearer VOTRE_TOKEN_ICI" https://awx.domaine.lan/api/v2/...

```

---

## 3. Antisèche (Cheat Sheet) des requêtes API utiles

Voici quelques commandes Bash prêtes à l'emploi. Pensez à adapter `$AWX_HOST` et `$TOKEN` avec vos valeurs.

### A. Trouver l'ID d'un Job Template

Avant de lancer un playbook, vous avez besoin de connaître son ID. Cette commande liste tous les templates avec leur nom et leur ID.

```bash
curl -s -k -H "Authorization: Bearer $TOKEN" \
     -X GET "$AWX_HOST/api/v2/job_templates/" \
     | jq '.results[] | "ID: \(.id) - Nom: \(.name)"'

```

*Note : L'outil `jq` est utilisé ici pour formater la sortie JSON de manière lisible.*

### B. Lancer un Job Template immédiatement

Permet de déclencher un playbook à la demande (très utile pour l'intégrer dans d'autres scripts ou pipelines).

```bash
TEMPLATE_ID="42" # Remplacez par votre ID

curl -s -k -X POST "$AWX_HOST/api/v2/job_templates/$TEMPLATE_ID/launch/" \
     -H "Authorization: Bearer $TOKEN" \
     -H "Content-Type: application/json" \
     -d '{}'

```

### C. Lancer un Job Template avec une Limit spécifique

Idéal si vous voulez exécuter un playbook générique (comme "Setup SSH") sur une seule machine spécifique via l'API.

```bash
TEMPLATE_ID="42"
MACHINE_CIBLE="bookstack"

curl -s -k -X POST "$AWX_HOST/api/v2/job_templates/$TEMPLATE_ID/launch/" \
     -H "Authorization: Bearer $TOKEN" \
     -H "Content-Type: application/json" \
     -d '{
         "limit": "'"$MACHINE_CIBLE"'"
     }'

```

### D. Vérifier le statut du dernier Job exécuté

Permet de savoir si le job s'est bien passé (successful) ou s'il a échoué (failed).

```bash
TEMPLATE_ID="42"

curl -s -k -H "Authorization: Bearer $TOKEN" \
     -X GET "$AWX_HOST/api/v2/job_templates/$TEMPLATE_ID/jobs/?order_by=-id&page_size=1" \
     | jq '.results[0] | "Job ID: \(.id) - Statut: \(.status)"'

```

# Planifier un Job Template AWX via l'API

L'interface graphique d'AWX (Tower) peut parfois s'avérer capricieuse ou peu intuitive pour configurer des tâches planifiées complexes. Utiliser l'API REST via une simple commande `curl` permet de créer des planifications précises, rapides et reproductibles.

---

## 1. Le Script de Planification

Copiez ce code dans un terminal Linux (ou dans un script bash) pour créer la planification. **Attention à bien modifier les variables avant de l'exécuter.**

```bash
#!/bin/bash

# ==========================================
# Variables de configuration
# ==========================================
AWX_HOST="https://awx.numericare.fr"
TOKEN="ton_token_api_ici"
TEMPLATE_ID="42"

# ==========================================
# Appel API
# ==========================================
curl -X POST "$AWX_HOST/api/v2/job_templates/$TEMPLATE_ID/schedules/" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
        "name": "Conversion Media Quotidienne",
        "description": "Exécution automatique 2 fois par jour",
        "rrule": "DTSTART:20240101T030000Z RRULE:FREQ=DAILY;INTERVAL=1;BYHOUR=3,15;BYMINUTE=0",
        "extra_data": {},
        "inventory": null
    }'

```

---

## 2. Explication des Variables

Voici comment récupérer et adapter les valeurs nécessaires pour que la commande fonctionne avec votre environnement :

<table id="bkmrk-variable-description" style="width: 100%; border-collapse: collapse;"><thead><tr><th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Variable</th><th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Description &amp; Comment la trouver</th></tr></thead><tbody><tr><td style="border: 1px solid #ddd; padding: 8px;">`AWX_HOST`</td><td style="border: 1px solid #ddd; padding: 8px;">L'URL de base de votre serveur AWX. *Exemple : https://awx.mon-homelab.lan*</td></tr><tr><td style="border: 1px solid #ddd; padding: 8px;">`TOKEN`</td><td style="border: 1px solid #ddd; padding: 8px;">Votre jeton d'accès personnel. Pour le générer dans AWX : allez dans **Users** &gt; Cliquez sur votre utilisateur &gt; Onglet **Tokens** &gt; **Add** (Cochez "Write" ou "All").</td></tr><tr><td style="border: 1px solid #ddd; padding: 8px;">`TEMPLATE_ID`</td><td style="border: 1px solid #ddd; padding: 8px;">L'identifiant unique du playbook à lancer. Pour le trouver, ouvrez votre Job Template dans AWX et regardez l'URL : `/templates/job_template/<strong>42</strong>/details`. Ici, l'ID est 42.</td></tr></tbody></table>

---

## 3. Comprendre la syntaxe `rrule` (La Planification)

Le paramètre le plus complexe de la requête JSON est le `rrule` (Recurrence Rule). Il utilise le standard iCalendar. Voici comment le décoder et le modifier :

> **Syntaxe utilisée :** `DTSTART:20240101T030000Z RRULE:FREQ=DAILY;INTERVAL=1;BYHOUR=3,15;BYMINUTE=0`

- **DTSTART:** Définit la date et l'heure de début de validité de la règle (au format UTC, indiqué par le `Z`). Mettre une date dans le passé fonctionne très bien pour que la règle soit active immédiatement.
- **FREQ=DAILY :** La fréquence de base. Peut être remplacé par `HOURLY` (Toutes les heures), `WEEKLY` (Toutes les semaines), ou `MONTHLY` (Tous les mois).
- **INTERVAL=1 :** S'applique tous les *X* jours (car FREQ=DAILY). Si on met 2, le script tournera un jour sur deux.
- **BYHOUR=3,15 :** Exécute la tâche à 03h00 et à 15h00 **(Heure UTC)**. Attention au décalage horaire selon votre fuseau !
- **BYMINUTE=0 :** S'assure que l'exécution se fait à l'heure pile (00 minute).

### Autres exemples de `rrule` utiles :

<table id="bkmrk-toutes-les-4-heures-" style="width: 100%; border-collapse: collapse;"><tbody><tr><td style="border: 1px solid #ddd; padding: 8px;">**Toutes les 4 heures :**</td><td style="border: 1px solid #ddd; padding: 8px;">`... RRULE:FREQ=HOURLY;INTERVAL=4`</td></tr><tr><td style="border: 1px solid #ddd; padding: 8px;">**Tous les lundis à 2h du matin :**</td><td style="border: 1px solid #ddd; padding: 8px;">`... RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO;BYHOUR=2;BYMINUTE=0`</td></tr></tbody></table>

# 🚀 Création d'un Execution Environment (EE) personnalisé pour AWX

Cette documentation explique comment créer, builder et déployer un environnement d'exécution (EE) sur mesure pour AWX afin d'inclure des dépendances spécifiques (Proxmox, Docker Compose v2) non présentes dans l'image de base.

<div class="documentation-container" id="bkmrk-contexte-technique-%3A"><div style="background-color:#f8f9fa;border-left:5px solid #28a745;padding:15px;margin:20px 0;">**Contexte technique :**- **Base OS :** CentOS Stream 9 (Image officielle AWX-EE)
- **Registry :** Harbor (docker-registry.numericare.fr)
- **Outils :** Docker CLI, Ansible-Galaxy

</div></div>## 1. Pourquoi un EE personnalisé ?

L'image de base `awx-ee:latest` est minimaliste. Pour piloter l'infrastructure Numericare, nous avons besoin de :

<div class="documentation-container" id="bkmrk-proxmoxer-%3A-librairi">- **proxmoxer :** Librairie Python pour l'API Proxmox.
- **community.docker (v3.4.0+) :** Pour le support de `docker_compose_v2`.
- **community.proxmox :** Pour la gestion des LXC et VMs.

</div>## 2. Le Dockerfile de construction

Nous utilisons la méthode manuelle (Dockerfile) plutôt qu'Ansible-Builder pour éviter les conflits de dépendances lourdes (oVirt, etc.) et optimiser l'espace disque.

```
FROM quay.io/ansible/awx-ee:latest

# Passage en root pour l'installation système
USER root

# 1. Installation de PIP et des librairies Python requises
RUN dnf install -y python3-pip && \
    python3 -m pip install --no-cache-dir proxmoxer requests

# 2. Installation des collections Ansible dans le répertoire GLOBAL
# Note : le flag -p est crucial pour que l'utilisateur non-root d'AWX y accède
RUN ansible-galaxy collection install community.docker:'>=3.4.0' -p /usr/share/ansible/collections --upgrade && \
    ansible-galaxy collection install community.proxmox -p /usr/share/ansible/collections

# Repassage sur l'utilisateur AWX par défaut (UID 1000)
USER 1000
```

## 3. Build et Push vers Harbor

Commandes à exécuter depuis le nœud de build (ex: `squall`) :

```
# 1. Connexion à la registry
docker login docker-registry.numericare.fr

# 2. Construction de l'image
docker build -t docker-registry.numericare.fr/private/custom-awx-ee:v1.0 .

# 3. Envoi sur Harbor
docker push docker-registry.numericare.fr/private/custom-awx-ee:v1.0
```

## 4. Configuration dans AWX

Une fois l'image sur Harbor, il faut la déclarer dans l'interface AWX :

<div class="documentation-container" id="bkmrk-cr%C3%A9er-le-credential-">1. **Créer le Credential :**
    - Type : *Container Registry*
    - URL : `https://docker-registry.numericare.fr`
2. **Créer l'Execution Environment :**
    - Image : `docker-registry.numericare.fr/private/custom-awx-ee:v1.0`
    - Pull : `Always pull`
    - Registry Credential : Sélectionner celui créé à l'étape précédente.
3. **Assigner :** Modifier le *Job Template* pour utiliser ce nouvel EE.

</div>## ⚠️ Troubleshooting &amp; Pièges

#### 1. Espace disque saturé (No space left on device)

Le build d'images crée beaucoup de cache. Sur le nœud de build, lancer régulièrement :

<div class="documentation-container" id="bkmrk-docker-system-prune-"><div style="border:1px solid #ddd;padding:10px;">`docker system prune -af`</div></div>#### 2. ModuleNotFoundError (permissions)

Si Ansible ne trouve pas une collection alors qu'elle est installée, vérifier qu'elle a été installée avec `USER root` dans `/usr/share/ansible/collections` et non dans `/root/.ansible`.

#### 3. Erreur de syntaxe Dockerfile

Attention aux espaces après l'anti-slash (`\ `). Il est préférable de mettre les commandes `RUN` sur une seule ligne pour éviter les erreurs `command not found`.

# 🐍 Guide : Installer Ansible proprement via un VENV (Virtual Environment)

<div class="documentation-container" id="bkmrk-pourquoi-un-venv-glo"><div style="background-color:#fff3cd;border-left:5px solid #ffc107;padding:15px;margin:20px 0;">**Pourquoi un VENV global ?**</div></div>Les distributions modernes (Debian 12+, Ubuntu 24.04+) bloquent l'installation de paquets Python système avec `pip` (erreur *externally-managed-environment*). Installer Ansible via `apt` fournit souvent une version obsolète. La solution est un VENV placé dans `/opt/`, accessible à tous les utilisateurs via des liens symboliques.

## 1. Installation des prérequis système

En tant qu'utilisateur `root`, installez Python et le gestionnaire d'environnements :

```
apt update
apt install -y python3-pip python3-venv
```

## 2. Création de l'environnement virtuel

Nous allons créer le dossier de l'environnement dans `/opt/ansible-venv` :

```
python3 -m venv /opt/ansible-venv
```

## 3. Installation d'Ansible et des dépendances

On utilise le binaire `pip` contenu dans notre VENV pour installer Ansible ainsi que les librairies nécessaires à notre infrastructure (Proxmox, K8s, Docker) :

```
/opt/ansible-venv/bin/pip install --upgrade pip
/opt/ansible-venv/bin/pip install ansible ansible-core proxmoxer requests kubernetes docker
```

## 4. Création des liens symboliques (La Magie ✨)

Pour éviter de devoir "activer" le venv à chaque fois, on crée des liens symboliques dans `/usr/local/bin/`. Ainsi, n'importe quel utilisateur tapant `ansible` utilisera la version du VENV :

```
ln -s /opt/ansible-venv/bin/ansible /usr/local/bin/ansible
ln -s /opt/ansible-venv/bin/ansible-playbook /usr/local/bin/ansible-playbook
ln -s /opt/ansible-venv/bin/ansible-galaxy /usr/local/bin/ansible-galaxy
ln -s /opt/ansible-venv/bin/ansible-vault /usr/local/bin/ansible-vault
```

## 5. Utilisation et Vérification

Basculez sur votre utilisateur standard et vérifiez que le chemin pointe bien vers `/opt/` :

```
ansible --version
```

*Note : Pour mettre à jour Ansible plus tard, il suffira de relancer : `/opt/ansible-venv/bin/pip install --upgrade ansible`*

# Molecule – Guide complet (Ansible Testing Framework)

<div id="bkmrk-objectif-%3A-comprendr" style="border:1px solid #2d7ff9;padding:10px;background:#eef5ff;">**Objectif :** Comprendre et utiliser Molecule pour tester des rôles Ansible de manière automatisée, reproductible et fiable.</div>---

## 1. Qu’est-ce que Molecule ?

Molecule est un framework de test pour **rôles Ansible**. Il permet de vérifier automatiquement qu’un rôle fonctionne correctement dans un environnement simulé (Docker, Podman, LXC ou VM).

Il fait partie de l’écosystème Ansible et est utilisé pour :

- tester des rôles Ansible
- valider des infrastructures de manière reproductible
- automatiser les tests CI/CD
- éviter les régressions en production

---

## 2. Pourquoi utiliser Molecule ?

<div id="bkmrk-sans-molecule-%3A-test" style="border:1px solid #ffcc00;padding:10px;background:#fff8e1;">**Sans Molecule :**- Tests manuels des rôles
- Erreurs découvertes en production
- Aucune reproductibilité

</div><div id="bkmrk-avec-molecule-%3A-test" style="border:1px solid #2d7ff9;padding:10px;background:#eef5ff;">**Avec Molecule :**- Tests automatisés
- Environnements jetables
- Validation systématique des rôles

</div>---

## 3. Le cycle Molecule (IMPORTANT)

Molecule fonctionne selon un cycle standard :

```
create → converge → verify → destroy
```

<table id="bkmrk-%C3%89tape-r%C3%B4le-explicati"><tbody><tr><th>Étape</th><th>Rôle</th><th>Explication</th></tr><tr><td>Create</td><td>Créer l’environnement</td><td>Container ou VM vierge</td></tr><tr><td>Converge</td><td>Appliquer le rôle</td><td>Exécution Ansible</td></tr><tr><td>Verify</td><td>Tester</td><td>Validation du résultat</td></tr><tr><td>Destroy</td><td>Nettoyer</td><td>Suppression de l’environnement</td></tr></tbody></table>

<div id="bkmrk-commande-globale-%3A-m" style="border:1px solid #2d7ff9;padding:10px;background:#eef5ff;">**Commande globale :** `molecule test` exécute tout automatiquement.</div>---

## 4. Architecture d’un rôle avec Molecule

```
role/
 └── molecule/
      └── default/
           ├── molecule.yml
           ├── converge.yml
           ├── verify.yml
```

- `molecule.yml` → configuration du scénario
- `converge.yml` → exécution du rôle
- `verify.yml` → tests automatisés

---

## 5. Installation

```
pip install molecule molecule-docker
# ou
pip install molecule molecule-podman
```

---

## 6. Création d’un rôle + Molecule

```
ansible-galaxy init my_role
cd my_role
molecule init scenario default
```

---

## 7. Exemple molecule.yml

```
driver:
  name: docker

platforms:
  - name: instance
    image: geerlingguy/docker-ubuntu2204-ansible
    privileged: true

provisioner:
  name: ansible

verifier:
  name: ansible
```

---

## 8. Exemple converge.yml

```
- name: Converge
  hosts: all
  tasks:
    - name: Include role
      include_role:
        name: my_role
```

---

## 9. Exemple verify.yml

```
- name: Verify nginx installation
  hosts: all
  tasks:

    - name: Check nginx version
      command: nginx -v
      register: result
      changed_when: false

    - name: Assert nginx is installed
      assert:
        that:
          - result.rc == 0
```

---

## 10. Commandes essentielles

```
molecule create
molecule converge
molecule verify
molecule destroy
molecule test
```

---

## 11. Debug

```
molecule login
molecule destroy
molecule test --debug
```

---

## 12. Drivers disponibles

- Docker (standard)
- Podman (rootless)
- LXC (possible mais complexe)
- VM (Vagrant)

<div id="bkmrk-attention-%3A-docker-d" style="border:1px solid #ffcc00;padding:10px;background:#fff8e1;">**Attention :** Docker dans LXC nécessite nesting=1 côté Proxmox.</div>---

## 13. Bonnes pratiques

- 1 rôle = 1 scénario Molecule
- toujours ajouter verify.yml
- tester plusieurs distributions si possible
- intégrer CI/CD

---

## 14. Résumé

<div id="bkmrk-molecule-transforme-" style="border:1px solid #2d7ff9;padding:10px;background:#eef5ff;">Molecule transforme un rôle Ansible en système testable automatiquement.</div>- ✔ Moins d’erreurs en production
- ✔ Tests reproductibles
- ✔ Infra industrialisée