Aller au contenu

Installer Terraform et Ansible sur Debian 13 (Trixie)

Monter un poste de contrôle Terraform et Ansible sur Debian 13 ne prend pas dix minutes par hasard : les deux outils ne viennent pas de la même source, et Debian 13 a durci l’installation de paquets Python. Voici la procédure telle que je l’applique, avec les deux ou trois endroits où ça coince réellement.

Debian 13 fournit Ansible dans ses dépôts officiels, mais pas Terraform. On utilise donc deux sources :

  • Ansible : dépôt Debian trixie/main (paquets ansible ou ansible-core)
  • Terraform : dépôt APT officiel HashiCorp apt.releases.hashicorp.com

Les deux s’installent via APT, ce qui garde la mise à jour intégrée au cycle apt upgrade.

Fenêtre de terminal
sudo apt update
sudo apt install -y curl gpg ca-certificates lsb-release

Vérifier la version du système :

Fenêtre de terminal
cat /etc/os-release | grep -E 'VERSION_CODENAME|PRETTY_NAME'

Résultat attendu : PRETTY_NAME="Debian GNU/Linux 13 (trixie)" et VERSION_CODENAME=trixie.

Fenêtre de terminal
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://apt.releases.hashicorp.com/gpg \
| sudo gpg --batch --yes --dearmor -o /etc/apt/keyrings/hashicorp-archive-keyring.gpg
sudo chmod a+r /etc/apt/keyrings/hashicorp-archive-keyring.gpg

Contrôler l’empreinte de la clé :

Fenêtre de terminal
gpg --no-default-keyring --keyring /etc/apt/keyrings/hashicorp-archive-keyring.gpg --fingerprint
Fenêtre de terminal
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com trixie main" \
| sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
Fenêtre de terminal
sudo apt install -y terraform
terraform version

Sortie de test :

Terraform v1.16.1
on linux_amd64

Utile pour aligner un poste sur la version d’une équipe ou d’un pipeline CI.

Fenêtre de terminal
apt-cache policy terraform # lister les versions disponibles
sudo apt install -y terraform=1.13.5-1
sudo apt-mark hold terraform # bloquer les mises à jour

Pour lever le blocage : sudo apt-mark unhold terraform.

Fenêtre de terminal
terraform -install-autocomplete
exec $SHELL

Deux paquets, deux périmètres :

Paquet Contenu Cas d’usage
ansible-core moteur seul, collections ansible.builtin environnements maîtrisés, collections gérées via requirements.yml
ansible moteur + ~100 collections communautaires poste d’admin, formation, prise en main rapide
Fenêtre de terminal
sudo apt install -y ansible
ansible --version

Sortie de test :

ansible [core 2.19.4]
python version = 3.13.x
Fenêtre de terminal
dpkg -l ansible | tail -1
# ii ansible 12.0.0+dfsg-0+deb13u1 all

Debian 13 applique la PEP 668 : pip install ansible en dehors d’un venv est refusé (externally-managed-environment). La bonne méthode est pipx, qui isole Ansible dans son propre environnement virtuel.

Fenêtre de terminal
sudo apt install -y pipx
pipx ensurepath
pipx install --include-deps ansible
exec $SHELL
ansible --version

Résultat au moment du test : ansible [core 2.21.3], installé dans ~/.local/pipx/venvs/ansible, binaires exposés dans ~/.local/bin.

Fenêtre de terminal
# gestion de dépôts Git dans les playbooks
sudo apt install -y git
# modules Windows / WinRM
sudo apt install -y python3-winrm
# vérification de qualité des playbooks
pipx install ansible-lint
Fenêtre de terminal
mkdir -p ~/lab-tf && cd ~/lab-tf
cat > main.tf <<'EOF'
terraform {
required_version = ">= 1.5"
required_providers {
local = {
source = "hashicorp/local"
version = "~> 2.5"
}
}
}
resource "local_file" "hello" {
filename = "${path.module}/hello.txt"
content = "Terraform OK sur Debian 13\n"
}
EOF
terraform init
terraform fmt -check
terraform plan
terraform apply -auto-approve
cat hello.txt

Sortie attendue :

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Terraform OK sur Debian 13

Nettoyage : terraform destroy -auto-approve.

Fenêtre de terminal
mkdir -p ~/lab-ansible && cd ~/lab-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory.ini
host_key_checking = False
interpreter_python = auto_silent
stdout_callback = yaml
EOF
cat > inventory.ini <<'EOF'
[local]
localhost ansible_connection=local
EOF
cat > ping.yml <<'EOF'
- name: Verification de base
hosts: local
gather_facts: true
tasks:
- name: Ping
ansible.builtin.ping:
- name: Afficher la distribution
ansible.builtin.debug:
msg: "{{ ansible_distribution }} {{ ansible_distribution_version }}"
EOF
ansible local -m ping
ansible-playbook ping.yml

Sortie attendue :

TASK [Afficher la distribution] ****
ok: [localhost] =>
msg: Debian 13.6
PLAY RECAP ****
localhost : ok=3 changed=0 unreachable=0 failed=0
Fenêtre de terminal
ssh-keygen -t ed25519 -C "ansible-controller"
ssh-copy-id admin@192.0.2.10
ansible all -i '192.0.2.10,' -u admin -m ping

Avec élévation de privilèges : ajouter --become --ask-become-pass, ou become: true dans le playbook.

Fenêtre de terminal
sudo apt update && sudo apt upgrade # Terraform et Ansible suivent le cycle APT
apt-mark showhold # lister les paquets épinglés
pipx upgrade-all # si Ansible installé via pipx

Pour les collections Ansible gérées hors distribution :

Fenêtre de terminal
ansible-galaxy collection install -r requirements.yml --upgrade