Loading search data...

Les modules Ansible pour gérer les packages Linux

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 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.


Alimenter un blog comme celui-ci est aussi passionnant que chronophage. En passant votre prochaine commande (n'importe quel autre article) via ce lien, je receverai une petite commission sans que cela ne vous coûte plus cher. Cela ne me permet pas de gagner ma vie, mais de couvrir les frais inhérents au fonctionnement du site. Merci donc à vous!

Mots clés :

devops, ansible, tutorials, vagrant,

Autres Articles