====== Ansible ======
===== Installation =====
==== Client et Serveur (A faire sur tous) ====
Cette partie est a reproduire sur tous les client et le serveur ansible
Vérifier la connexion réseau
ip -c a
=== Sous Debian ===
Editer la config réseau (si besoin)
nano /etc/network/interfaces
Redémarrer le réseau et activer la carte si **DOWN**
systemctl restart networking.service ; sudo ifup ens33
Commenter la ligne cd-rom suite a l'installation
nano /etc/apt/sources.list
----
=== Sous Oracle Linux ===
Si carte **DOWN**
nmcli device connect ens160
Configurer le réseau
nmtui
----
=== Sous (Debian et Oracle Linux) ===
Changer le nom de la machine (si besoin)
nano /etc/hosts
hostnamectl set-hostname srv-ansible
Création des utilisateurs sur le system
adduser ansible
Changer le password des utilisateurs sur le system
passwd ansible
----
==== Client (Uniquement) ====
Cette partie est a réaliser uniquement sur les clients (ICI une Debian il faudra donc adapter pour un autre OS)
=== Configuration des droits ===
Mettre a jour le cache et installer sudo
apt update
apt install sudo
Editer le fichier **/etc/sudoers**
visudo
Ajout de la ligne :
ansible ALL=(ALL:ALL) NOPASSWD: ALL
----
=== Limiter les connexion SSH de l'utilisateur ansible ===
Editer le fichier **ssh_config**
sudo nano /etc/ssh/ssh_config
Ajouter cela ici 10.102.200.111 est IP du **serveur ANSIBLE**
Match User ansible
AllowUsers ansible@10.102.200.111
PasswordAuthentication no
Redémarrer le serveur SSH
sudo systemctl restart ssh
----
==== Serveur (Uniquement) ====
Cette partie est a réaliser uniquement sur le serveur ansible
Cas spécial transforme https en http
sed -i 's/https/http/g' /etc/yum.repos.d/*
Installation
dnf install epel-release-el8 -y
dnf install ansible -y
Cas spécial re-transformer https en http
sed -i 's/https/http/g' /etc/yum.repos.d/*
ssh-keygen -o -a 100 -t ed25519 -C "ansible@srv-ansible"
ssh-copy-id ansible@10.102.200.153
ssh-copy-id ansible@10.102.200.80
ssh-copy-id ansible@10.102.200.153
----
===== Utilisation =====
Création d'un espace dépôt des fichier de config
cd /srv/ansible/projet1
Création du fichier d'inventaire
touch inventaire.yml
Modification du fichier d'inventaire
nano inventaire.yml
all:
vars:
ansible_python_interpreter: /bin/python3
children:
deb_master:
hosts:
10.102.200.153:
deb_slave:
hosts:
10.102.200.80:
ansible-inventory all -i inventaire.yml --graph
Test d'un envoi de PING sur tous les inventaire du fichier "**inventaire.yml**"
ansible all -i inventaire.yml -m ping
----
==== Création d'un Playbook (regroupant plusieurs actions) ====
- Mise a jour de APT avec un "apt update"
- Installation d'un paquet
- Démarré et activé le service
=== Création d'un Playbook ===
nano Playbook_[Action]_[Paquet].yml
---
- hosts: all
become: yes # Permet de s'assurer que les tâches sont exécutées avec les privilèges sudo
tasks:
- name: Update the APT package list
apt:
update_cache: yes
- name: [Nom de la tache 2]
apt:
name: [Nom du paquet a installer]
state: present
- name: [Nom de la tache 3]
systemd:
name: [Nom du paquet a démarrer et activer au démarrage]
state: started
enabled: yes
ansible [Nom-Groupe] -i [Nom-Fichier-Inventaire].yml -m [Commande (Ex : ping)]
ansible all -i [Fichier-Inventaire].yml -m apt -a "name=[Paquet] state=[Indique_Status_dans_lequel_le-paquet_doit_etre]" -b
ansible-playbook -i [Nom-Fichier-Inventaire].yml [Nom-Fichier-Playbook].yml -l [Nom-Groupe]
----
==== Vérification SYNTAX et Test du Playbook ====
Vérifier la syntax du Playbook
ansible-playbook -i [Nom-Fichier-Inventaire].yml [Nom-Fichier-Playbook].yml --syntax-check
Vérifier ce que la commande donnerait pour **TOUS** ou le **groupe [Nom-Groupe** (Ex: deb_master) **] seulement**
ansible-playbook -i [Nom-Fichier-Inventaire].yml [Nom-Fichier-Playbook].yml -C -l all
ou
ansible-playbook -i [Nom-Fichier-Inventaire].yml [Nom-Fichier-Playbook].yml -C -l [Nom-Groupe]
----
===== Exemple =====
==== Simple ====
Ping du Groupe **deb_master** ce trouvant dans le fichier inventaire inventaire.yml
ansible deb_master -i inventaire.yml -m ping
Suppression du paquet **nano** sur toute les machines du fichier inventaire **inventaire.yml**
ansible all -i inventaire.yml -m apt -a "name=nano state=absent" -b
Installation du paquet **vim** sur toute les machines du fichier inventaire **inventaire.yml**
ansible all -i inventaire.yml -m apt -a "name=vim state=present" -b
----
==== Plus complexe (Multi-Actions) ====
=== Création d'un Playbook (regroupe plusieurs actions en une ligne de commande simple et dynamique) ===
Création d'un Playbook
nano Playbook_Install_Apache2.yml
- Mise a jour de APT avec un "apt update"
- Installation de Apache2
- Apache est demarré et activé
---
- hosts: all
become: yes # Permet de s'assurer que les tâches sont exécutées avec les privilèges sudo
tasks:
- name: Update the APT package list
apt:
update_cache: yes
- name: Install Apache
apt:
name: apache2
state: present
- name: Ensure Apache is started and enabled
systemd:
name: apache2
state: started
enabled: yes
Exécution des actions du Playbook **Playbook_Install_Apache2.yml** qui va effectuer l'installation et l'activation du paquet **Apache2** sur le groupe **deb_master** uniquement du fichier inventaire **inventaire.yml**
ansible-playbook -i inventaire.yml Playbook_Install_Apache2.yml -l deb_master
----
=== Exécution de plusieurs taches en plusieurs lignes de commande (Sans Playbook) ===
ansible deb_master -m apt -a "update_cache=yes" -b
ansible deb_master -m apt -a "name=apache2 state=present" -b
ansible deb_master -m service -a "name=apache2 state=started enabled=yes" -b
----
=== Création d'un Playbook (regroupe plusieurs actions avec un handlers) ===
---
- name: Playbook pour sécuriser SSH et installer BIND
hosts: all
become: yes
tasks:
- name: Assurer que le service SSH est installé
apt:
name: openssh-server
state: present
update_cache: yes
- name: Ajouter un bloc de configuration SSH dans /etc/ssh/sshd_config
ansible.builtin.blockinfile:
path: /etc/ssh/sshd_config
backup: true
insertafter: EOF
block: |
# Configuration personnalisée SSH
Match User ansible
AllowUsers ansible@10.102.200.111
PasswordAuthentication no
marker: "# {mark} Configuration SSH"
#owner: root
#group: root
#mode: '0600'
notify:
- Restart SSH
- name: Installer le service BIND
apt:
name: bind9
state: present
update_cache: yes
- name: Neutraliser la connexion via un accès console de l’utilisateur ansible
user:
name: ansible
password: "!"
handlers:
- name: Restart SSH
service:
name: ssh
state: restarted
ou alors la meme chose avec un playbook plus simpliste \\
---
- name: Playbook pour sécuriser SSH et installer BIND v2
hosts: all
become: true
tasks:
# Secure SSH :
- name: sec ssh
blockinfile:
path: /etc/ssh/sshd_config
state: present
backup: yes
insertafter: "EOF"
block: |
Match User ansible
AllowUsers ansible@10.102.200.111
PasswordAuthentication no
- name: restart ssh
service:
name: sshd
state: restarted
# Disable login with password :
- name: disable login password
user:
name: ansible
password: "!"
# Install Bind sur les deux serveur :
- name: Install Bind
apt:
update_cache: yes
name: bind9
state: present
Vérifier la syntax du Playbook
ansible-playbook -i inventaire.yml Playbook_Multi_SSH-Config.yml --syntax-check
Vérifier ce que la commande donnerait pour **TOUS** ou le **groupe deb_master seulement**
ansible-playbook -i inventaire.yml Playbook_Multi_SSH-Config.yml -C -l all
ou
ansible-playbook -i inventaire.yml Playbook_Multi_SSH-Config.yml -C -l deb_master
Lance l'exécution de la commande
ansible-playbook -i inventaire.yml Playbook_Multi_SSH-Config.yml -l all
===== Lexique =====
* NODE MANAGER = Le serveur ansible
* PLAYBOOK = fichier YAML des séquences de tâches ou rôles
* INVENTORY =
* Inventaire statique : constitué d’un fichier décrivant la hiérarchie des serveurs.
* Inventaire dynamique : cette inventaire est fourni a ansible par un système centralisé recensant tous les nodes de l’infrastructure (exemple : NoCMDB ).
* MODULE = Les tâches et les rôles font appel à des modules accessible ici : [[https://docs.ansible.com/ansible/latest/collections/index_module.html]]
* TEMPLATE =
* NOTIFIER = Le notifier indique que si une tâche change d’état (et uniquement si la tâche a engendré un changement), notify fait appel au handler associé et exécute une autre tâche. (exemple apache2 est restart)
* HANDLER = Tâche qui n’est appelée que si un notifier est invoqué.
* TAG = Nom défini sur une ou plusieurs tâches qui peut être utilisé plus tard pour exécuter uniquement ce ou ces tâches Ansible
* ROLE = Les rôles permettent d’éviter de réécrire les mêmes playbooks. Les rôles apportent la possibilité de regrouper des fonctionnalités spécifiques. Ils seront intégrés aux playbooks.
----
===== Sources : =====
[[https://docs.ansible.com/]] \\
[[https://blog.stephane-robert.info/post/ansible-gendoc-role-collection/]] \\