Ansible - Les principaux modules pour gérer les packages
Publié le : 22 avril 2021 | Mis à jour le : 22 janvier 2023Après avoir documenté comment écrire des playbooks Ansible et des roles Ansible, je vous propose une série de billets sur les principaux modules Ansible. Commençons par la gestion des packages Linux APT et YUM/DNF.
Gérer les repositories
Les repository APT
Ajouter un repository APT
Deux modules permettant de gérer les repository APT : ansible.builtin.apt_key
et
ansible.builtin.apt_repository
.
- name: import the elasticsearch apt key
apt_key:
url: https://artifacts.elastic.co/GPG-KEY-elasticsearch
state: present
- name: install elasticsearch 7.x deb repository
apt_repository:
repo: deb https://artifacts.elastic.co/packages/7.x/apt stable main
state: present
update_cache: yes
Enlever un repository APT
Il suffit comme pour les packages de passer l’option state à absent
:
- name: remove elasticsearch 6.x deb repository
apt_repository:
repo: deb https://artifacts.elastic.co/packages/7.x/apt stable main
state: absent
update_cache: yes
Les repository YUM
Ajouter un repository YUM
On peut installer un repository yum avec sa clé en une seule opération.
- name: install elasticsearch 7.x rpm repository
yum_repository:
name: elasticsearch-7.x
description: Elasticsearch repository for 7.x packages
baseurl: https://artifacts.elastic.co/packages/7.x/yum
gpgcheck: true
gpgkey: https://artifacts.elastic.co/GPG-KEY-elasticsearch
Enlever un repository YUM
Pour nettoyer un repository Yum avec ansible il suffit comme pour les packages
de passer l’option state à absent
. Il faut pas oublier de nettoyer les caches
yum, et pour cela rien de mieux qu’un handler.
tasks:
- name: remove elasticsearch 7.x repository
yum_repository:
name: elasticsearch-7.x
state: absent
notify: yum-clean-metadata
handlers:
- name: yum-clean-metadata
command: yum clean metadata
args:
warn: no
Les autres gestionnaires de repository
Gérer simplement des packages
Depuis la version 2.0, Ansible propose un module pour gérer l’ensemble des gestionnaires de packages. Le
module ansible.builtin.package
se charge de détecter la distribution (la collecte des facts doit être active) et
lancer le bon module de gestion de package. Donc fini pour vous de tester la distribution en cours.
Ce module est assez simple à utiliser puisqu’il ne prend que deux paramètres:
- name: qui est une liste de packages
- state: qui prend la valeur
present
ouabsent
. present installe un package et absente l’inverse.
- name: Installation de package
ansible.builtin.package:
name:
- httpd
- mariadb-server
state: present
Attention avec le paramètre state, faites attention à n’utiliser que
present
ou absent
. En effet, latest
ne fonctionnera que si le module de
package sous-jacent le prends en charge!
Mais si vous voulez gérer plus finement vos installations,ce que je vous
conseille, il faudra faire appel aux autres modules. La principale raison est
que le même paquet peut avoir des noms différents sur différentes distributions.
Par exemple: le paquet serveur de la populaire base de données en mémoire Redis
est appelé redis-server
sur les distributions basées sur Debian et sur les
distributions basées redis
sur Red Hat. C’est vrai nous pourrions le gérer via
des variables.
APT
On retrouve le même fonctionnement, mais avec beaucoup plus de paramètres :
- update_cache: met à jour le gestionnaire de package.
- autoclean : nettoie le cache apt.
- autoremove : désinstalle tous les dépendances qui ne sont plus nécessaires
- purge : désinstalle aussi les fichiers de configurations si state =
absent
. - deb : le chemin vers d’un package à installer localement.
- force : force l’installation des packages qui ne sont pas signés.
- install_recommends :
yes
etno
installe ou pas les packages recommandés. - upgrade :
dist
,full
etsafe
- tous les autres sur la documentation officielle
Par exemple pour installer un package apt :
- name: install wget
apt:
name:
- wget
state: present
update_cache: true
Pour installer une version spécifique la syntaxe du nom est la suivante: {{ package_name }}-{{ package_version }}
- name: install specific wget version
apt:
name: wget=1.14-18
state: present
update_cache: true
DNF, YUM
Les paramètres sont ici différents de ceux d’apt et je vous liste que les plus utiles :
- update_cache: met à jour le gestionnaire de package.
- autoremove : désinstalle tous les dépendances qui ne sont plus nécessaires.
- allow_downgrade : oups à utiliser avec soins !
- disable_gpg_check : autorise l’installation de package non signés.
- enablerepo et disablerepo : active ou desactive un repo lors d’une installation.
- download_only avec download_dir: télécharge simplement le package sans l’installer.
- security : installe les packages que si ils sont flaggés
security related
- skip_broken : n’installe pas les packages avec des dépendances cassées.
- update_only : mets à jours les packages installés
- tous les autres sur la documentation officielle
Il est possible d’installer un groupe de package en indiquant un nom sous la forme : "@development"
- name: install wget
dnf:
name:
- wget
state: present
update_cache: true
Pour installer une version spécifique il faut indiquer un name reprenant cette
syntaxe: {{ package_name }}-{{ package_version }}-{{ package_release }}
- name: install wget
dnf:
name:
- wget-1.14-18.el8
state: present
update_cache: true
Les autres gestionnaires
Je vais pas tous les documentés mais voici les liens vers les documentations des plus courants :
Faire appel au bon modules de packages
Pour cela il suffit d’utiliser une condition sur la variable ansible_os_family
. La collecte des facts doivent donc être active!
- name: install redis on RHEL based distros
yum:
name:
- redis
state: present
update_cache: true
when: ansible_os_family == 'RedHat'
- name: install redis on Debian based distros
apt:
name:
- redis-server
state: present
update_cache: true
when: ansible_os_family == 'Debian'
Obtenir de l’information sur les packages
Ansible met à disposition un module ansible.builtin.package_facts
qui va
récolter des informations sur les packages installés. Attention, ne
fonctionne que sur les distributions utilisant les gestionnaires de package
suivant 'pacman', 'apt', 'rpm', 'portage', 'pkg'
- name: Gather the package facts
ansible.builtin.package_facts:
manager: auto
- name: Print the package facts
ansible.builtin.debug:
var: ansible_facts.packages
Pour les distribuitions redhat, il est possible d’utiliser l’option list des modules yum
et dnf
:
- name: list installed and available versions of ruby
yum:
list: ruby
become: true
when: ansible_os_family == 'RedHat'
register: yum_output
- name: print available ruby versions
debug:
msg: "{{ item.version }}-{{ item.release }}"
loop: "{{ yum_output.results | selectattr('yumstate', 'equalto', 'available') | list }}"
Voila pour aujourd’hui. Si vous voulez plus d’exemples d’utilisation d'Ansible je vous renvoie à mon introduction Ansible où la liste complète de tous les billets sur Ansible s’y trouve.