====== 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/]] \\