Credit : Illustration backtotheweb.fr
Ansible pour debutants : automatiser sa config serveur
Ansible pour debutants : automatiser sa config serveur
Suite à pas mal de questions reçues par mail, voici un guide complet.
Ansible est un outil d'automatisation agentless : il se connecte en SSH a vos serveurs et execute des taches. Pas de client a installer, juste Python sur les machines cibles.
Installation
# Sur votre machine locale (pas sur les serveurs)
sudo apt install pipx
pipx install ansible-core
# Verifier
ansible --version
L'inventaire
L'inventaire liste vos serveurs. Creez inventory.yml :
all:
children:
webservers:
hosts:
web1:
ansible_host: 203.0.113.10
ansible_user: deploy
web2:
ansible_host: 203.0.113.11
ansible_user: deploy
databases:
hosts:
db1:
ansible_host: 203.0.113.20
ansible_user: deploy
vars:
ansible_python_interpreter: /usr/bin/python3
Testez la connexion :
ansible all -i inventory.yml -m ping
Premier playbook
Un playbook decrit l'etat souhaite de vos serveurs. Creez setup.yml :
---
- name: Configuration de base des serveurs web
hosts: webservers
become: yes
vars:
packages:
- nginx
- php8.2-fpm
- php8.2-mysql
- php8.2-curl
- php8.2-xml
- certbot
- python3-certbot-nginx
tasks:
- name: Mettre a jour le cache APT
apt:
update_cache: yes
cache_valid_time: 3600
- name: Installer les paquets requis
apt:
name: "{{ packages }}"
state: present
- name: Demarrer et activer Nginx
systemd:
name: nginx
state: started
enabled: yes
- name: Demarrer et activer PHP-FPM
systemd:
name: php8.2-fpm
state: started
enabled: yes
- name: Copier la config Nginx
template:
src: templates/nginx-site.conf.j2
dest: /etc/nginx/sites-available/monsite.conf
notify: Recharger Nginx
- name: Activer le site
file:
src: /etc/nginx/sites-available/monsite.conf
dest: /etc/nginx/sites-enabled/monsite.conf
state: link
notify: Recharger Nginx
handlers:
- name: Recharger Nginx
systemd:
name: nginx
state: reloaded
Executez-le :
ansible-playbook -i inventory.yml setup.yml
Les templates Jinja2
Creez templates/nginx-site.conf.j2 :
server {
listen 80;
server_name {{ domain_name }};
root /var/www/{{ domain_name }}/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Organiser avec des roles
Les roles structurent votre code Ansible :
mkdir -p roles/nginx/{tasks,templates,handlers,defaults}
roles/nginx/defaults/main.yml :
nginx_worker_processes: auto
nginx_worker_connections: 1024
roles/nginx/tasks/main.yml :
- name: Installer Nginx
apt:
name: nginx
state: present
- name: Deployer la config principale
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Recharger Nginx
roles/nginx/handlers/main.yml :
- name: Recharger Nginx
systemd:
name: nginx
state: reloaded
Utilisez le role dans votre playbook :
- hosts: webservers
become: yes
roles:
- nginx
- php
- certbot
Modules utiles
# Gestion de fichiers
- copy: src=fichier dest=/chemin
- file: path=/chemin state=directory mode='0755'
- lineinfile: path=/etc/ssh/sshd_config regexp='^PermitRootLogin' line='PermitRootLogin no'
# Gestion des utilisateurs
- user: name=deploy shell=/bin/bash groups=sudo append=yes
- authorized_key: user=deploy key="{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
# Cron
- cron: name='Backup quotidien' hour='2' minute='0' job='/opt/scripts/backup.sh'
Deployer sur des serveurs IONOS
Les VPS IONOS sont parfaitement compatibles avec Ansible. Apres avoir provisionne vos serveurs IONOS, ajoutez-les a votre inventaire avec leur IP publique et configurez l'acces SSH par cle.
# Deployer sur tous les serveurs IONOS en une commande
ansible-playbook -i inventory.yml site.yml --diff
L'option --diff montre les changements effectues. Utilisez --check pour simuler sans appliquer.
Ansible est ideal pour garantir la coherence de vos serveurs et reproduire rapidement un environnement.