Aller au contenu principal

Les modules Ansible pour gérer les packages

· 6 minutes de lecture
Stéphane ROBERT

logo

Aprè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 Ansible 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 ou absent. 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 et no installe ou pas les packages recommandés.
  • upgrade : dist, full et safe
  • 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.