ansible
Ansible

Installer et configurer Ansible sur Rocky Linux 9

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *