Ansible est un outil IaC ( Infrastructure as a Code) open-source qui permet l’automatisation de l’infrastructure et le déploiement d’applications.
Ansible utilise les playbooks pour créer des modules qui définissent l’état souhaité du système et les transmettent aux machines lister sur le fichier inventaire.
Dans cet article nous allons voir comment installer et configurer Ansible sur Rocky Linux 9 ( Alternative de l’OS obsolète CentOS ).
Prérequis :
- Deux serveurs ou plus fonctionnant sous Rocky Linux 9.
- Python installé sur tous les serveurs.
- Pip installés sur le nœud de contrôle.
Dans mon cas j’ai 3 serveur avec Rocky Linux 9 :
- Master : 192.168.139.189/24 ( où Ansible va être installé ).
- node 1: 192.168.139.145/24
- node 2: 192.168.139.131/24
Utiliser un client SSH pour que vous puissiez gérer vos serveurs facilement. Personnelement j’utilise MobaXterm :
Etape 1: installer Ansible
Pour installer Ansible sur le serveur Master, il faut s’assurer que le dépôt EPEL est bien présent :
[root@Ansible ~]# dnf install -y epel-release
Une fois EPEL est installé, installez Ansible en utilisant la commande dnf :
# dnf install -y ansible
Vous pouvez vérifier la version d’Ansible installé avec la commande :
[root@Ansible ~]# ansible --version ansible [core 2.14.14] config file = /etc/ansible/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.9/site-packages/ansible ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections executable location = /bin/ansible python version = 3.9.18 (main, Jan 24 2024, 00:00:00) [GCC 11.4.1 20231218 (Red Hat 11.4.1-3)] (/usr/bin/python3) jinja version = 3.1.2 libyaml = True
Maintenant nous avons tous ce qui est nécessaire pour gérer nos serveurs avec Ansible.
Etape 2: Configurer les Hosts
Les serveurs que vous souhaitez administrer sont identifié par Ansible via un fichier appelé fichier inventaire dont le chemin est /etc/ansible/ :
[root@Ansible ~]# ls /etc/ansible/hosts /etc/ansible/hosts
Ainsi les serveurs que nous souhaitons administer nous devons les citer au niveau de ce fichier.
Editer le fichier /etc/ansible/hosts :
# vi /etc/ansible/hosts
Comme vous pouvez le remarquer le fichier contient de nombreux exemples de configuration commentés qui expliquer les différents méthodes pour identifier vos serveurs :
Je vais me contenter d’évoquer 2 méthode.
Vider ce fichier avec la commande ci-dessous :
# echo > /etc/ansible/hosts
La première méthode est d’ identifier les deux serveurs individuellement :
[root@Ansible ~]# vi /etc/ansible/hosts [root@Ansible ~]# cat /etc/ansible/hosts 192.168.139.145 192.168.139.131
Je préfère identifier les serveurs au nivreau de ce fichier par leurs nom, et vu que je n’ai pas de serveurs DNS je vais utiliser le fichier /etc/hosts :
[root@Ansible ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.139.189 master 192.168.139.145 node1 192.168.139.131 node2
Voici mon fichier hosts avec les noms :
[root@Ansible ~]# cat /etc/ansible/hosts node1 node2
La deuxème méthode et d’assembler les deux serveurs dans un seul groupe. Cela vous permettra d’appliquer les modifications sur les deux serveurs en même temps :
[web_server] node1 node2
Pour tester l’accès aux deux serveurs avec ansible utiliser la commande suivant :
[root@Ansible ~]# ansible -m ping node1 The authenticity of host 'node1 (192.168.139.145)' can't be established. ED25519 key fingerprint is SHA256:Dyffx2i9mcc3GFF9D524hJ/z7WdrWwGB8KNBHpChVDM. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? node1 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Host key verification failed.", "unreachable": true }
Comme vous pouvez le constater j’ai eu l’erreur :
Failed to connect to the host via ssh: Host key verification
Par défaut Ansible suppose que vous utilisez des clés SSH, alors qu’ ici ce n’est pas le cas. Pour forcer Ansible à utiliser l’authentification avec mot de passe ajouter l’option –ask-pass :
[root@Ansible ~]# ansible -m ping node1 --ask-pass SSH password: node1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong"
Comme vous voyez une fois le mot de passe est saisie, on voie bien qu’Anisble arrive bien à accéder au serveur. Même chose pour le deuxième serveur :
[root@Ansible ~]# ansible -m ping node2 --ask-pass SSH password: node2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
Si vous souhaitez tester les deux serveur en même temps, spécifier all au lieu du nom du serveur :
[root@Ansible ~]# ansible -m ping all --ask-pass SSH password: node1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } node2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
Ou bien de spécifier le nom du groupe :
Puisque l’authentification avec les clé SSH est recommandés, il est préférable de l’utiliser au lieu de l’authentification avec mot de passe. Pour cela jeter un coup d’oel ici pour le faire.
Pour la suite de ce tuto je supposerai que vous aviez configuré l’authentification avec les clé SSH.
Quelques commandes Ansible basiques
Maintenant que toutes les configurations ont été faites. allons découvrir quelques commandes basiques en utilisant ce qu’on appèle les modules.
–Ping :
Comme on a fait précemment, On utilisae le module ping pour tester la connectivité avec les serveurs listé sur le fichier hosts :
[root@Ansible ~]# ansible -m ping all node2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } node1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
Comme vous avez pu le remarqué je n’ai pas utilisé l’ioption –ask-pass et Ansible a bien pu joindre mes deux serveurs car j’ai configurer les accès avec les clés SSH, donc si vous n’avez pas configuré les clé SSH vous aurez comme l’erreur ci-dessous :
[root@Ansible ~]# ansible -m ping all node1 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: root@node1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true } node2 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: root@node2: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true }
-Command
Ce module permet d’exécuter une commande à distance :
[root@Ansible ~]# ansible -m command -a "date" all node2 | CHANGED | rc=0 >> Mon Sep 2 09:19:59 AM EDT 2024 node1 | CHANGED | rc=0 >> Mon Sep 2 09:19:59 AM EDT 2024
Ici j’ai demandé d’exécuter la commande « date » sur les deux serveurs.
-dnf
Ce module permet de gérer les packages Linux, par example pour installer le package httpd, utiliser la commande ci-dessous :
[root@Ansible ~]# ansible all -m dnf -a "name=httpd state=present"
node2 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Installed: httpd-core-2.4.57-11.el9_4.1.x86_64",
"Installed: apr-util-openssl-1.6.1-23.el9.x86_64",
"Installed: apr-util-bdb-1.6.1-23.el9.x86_64",
"Installed: apr-util-1.6.1-23.el9.x86_64",
"Installed: mailcap-2.1.49-5.el9.noarch",
"Installed: mod_lua-2.4.57-11.el9_4.1.x86_64",
"Installed: httpd-tools-2.4.57-11.el9_4.1.x86_64",
"Installed: httpd-2.4.57-11.el9_4.1.x86_64",
"Installed: mod_http2-2.0.26-2.el9_4.x86_64",
"Installed: httpd-filesystem-2.4.57-11.el9_4.1.noarch",
"Installed: rocky-logos-httpd-90.15-2.el9.noarch",
"Installed: apr-1.7.0-12.el9_3.x86_64"
]
}
node1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Installed: httpd-core-2.4.57-11.el9_4.1.x86_64",
"Installed: apr-util-openssl-1.6.1-23.el9.x86_64",
"Installed: apr-util-bdb-1.6.1-23.el9.x86_64",
"Installed: apr-util-1.6.1-23.el9.x86_64",
"Installed: mailcap-2.1.49-5.el9.noarch",
"Installed: mod_lua-2.4.57-11.el9_4.1.x86_64",
"Installed: httpd-tools-2.4.57-11.el9_4.1.x86_64",
"Installed: httpd-2.4.57-11.el9_4.1.x86_64",
"Installed: mod_http2-2.0.26-2.el9_4.x86_64",
"Installed: httpd-filesystem-2.4.57-11.el9_4.1.noarch",
"Installed: rocky-logos-httpd-90.15-2.el9.noarch",
"Installed: apr-1.7.0-12.el9_3.x86_64"
]
}
Vérifiez si le package a été bien installé sur les deux serveurs :
[root@node1 ~]# dnf list installed httpd
Installed Packages
httpd.x86_64 2.4.57-11.el9_4.1 @appstream
[root@node2 ~]# dnf list installed httpd
Installed Packages
httpd.x86_64 2.4.57-11.el9_4.1 @appstream
-service
Ce module permet de gérer les service ( start, restart, stop)
Par example je souhaite arrêter le service httpd uniquement sur le premier serveur ( node1) :
# ansible node1 -m service -a "name=httpd state=stopped"
Le service a bien été arrêté le node1 :
[root@node1 ~]# systemctl status httpd ○ httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled) Active: inactive (dead) Docs: man:httpd.service(8) Sep 02 10:29:55 node1 systemd[1]: Stopping The Apache HTTP Server... Sep 02 10:29:56 node1 systemd[1]: httpd.service: Deactivated successfully. Sep 02 10:29:56 node1 systemd[1]: Stopped The Apache HTTP Server. Sep 02 10:30:37 node1 systemd[1]: Starting The Apache HTTP Server... Sep 02 10:31:07 node1 httpd[13497]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fee0:245f%ens33. Set the 'ServerName' directive globally to supp> Sep 02 10:31:31 node1 httpd[13497]: Server configured, listening on: port 80 Sep 02 10:31:31 node1 systemd[1]: Started The Apache HTTP Server. Sep 02 10:32:56 node1 systemd[1]: Stopping The Apache HTTP Server... Sep 02 10:32:57 node1 systemd[1]: httpd.service: Deactivated successfully. Sep 02 10:32:57 node1 systemd[1]: Stopped The Apache HTTP Server.
Le montage sous linux
Comment Installer LAMP sur Rocky Linux 9.
Empêcher les utilisateurs sudoers d’exécuter des cmds sudo
7zip: 9 Commandes utiles de les plus utilisés
Fail2Ban : How to protect Linux services