Modifier les dépendances d'un paquet debian avec Ansible

L'installation de logiciel est facilitée sur Debian et Ubuntu grâce au paquet .deb. Mais parfois les dépendances du paquet ne peuvent être résolues et empêchent l'installation. Il est possible de corriger le problème mais les commandes sont un peu longues, je vous présente donc comme le faire avec un rôle Ansible.

J'ai pris le paquet .deb de Slack comme exemple avec Debian 11 (Bullseye); j'ai également eu le problème avec Insomnia.

Voici ce que renvoie dpkg quand on essaye d'installer Slack

root@orion:/root# dpkg -i slack-desktop-4.22.0-amd64.deb
Sélection du paquet slack-desktop précédemment désélectionné.
(Lecture de la base de données... 122646 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de slack-desktop-4.22.0-amd64.deb ...
Dépaquetage de slack-desktop (4.22.0) ...
dpkg: des problèmes de dépendances empêchent la configuration de slack-desktop :
 slack-desktop dépend de libappindicator3-1 ; cependant :
  Le paquet libappindicator3-1 n'est pas installé.

Le problème c'est que le paquet libappindicator3-1 n'existe pas sur Debian 11 sous ce nom là. Il existe sous le nom libayatana-appindicator3-1. Il faut donc modifier le paquet de Slack pour renommer la dépendance.

La première étape consiste à télécharger le fichier .deb, j'ai choisi le dossier /opt comme répertoire de travail.

- name: download slack
  get_url:
    url: https://downloads.slack-edge.com/releases/linux/4.22.0/prod/x64/slack-desktop-4.22.0-amd64.deb
    dest: /opt/slack-desktop.deb
    owner: root
    mode: 0644

Ensuite nous allons décomposer le paquet Debian dans le dossier unpack et vérifier son intégrité grâce à l'outil dpkb-deb.

- name: unpack slack deb
  command: "dpkg-deb -x slack-desktop.deb unpack"
  args:
    chdir: /opt

- name: control slack deb
  command: "dpkg-deb --control slack-desktop.deb"
  args:
    chdir: /opt

Avec la décomposition du paquet on obtient un dossier DEBIAN/ et un dossier unpack/. Pour recréer le paquet nous avons besoin de déplacer le dossier DEBIAN/ dans le dossier unpack/

- name: rename unpack deb
  command: "mv DEBIAN unpack"
  args:
    chdir: /opt

Il faut ensuite éditer le fichier control pour mettre à jour le nom du paquet. Le module replace d'Ansible est parfait pour ça.

- name: replace dependency
  replace:
    path: /opt/unpack/DEBIAN/control
    regexp: 'libappindicator3-1'
    replace: 'libayatana-appindicator3-1'

Il ne reste plus qu'a reconstruire le paquet.

- name: repack deb
  command: "dpkg -b unpack/ slack-fixed.deb"
  args:
    chdir: /opt

Et voilà, on a maintenant un paquet qui contient les bonnes dépendances par rapport à notre système, il est possible de l'installer et ne pas oublier de nettoyer le travail.

- name: install slack
  apt:
    deb: /opt/slack-fixed.deb

- name: clean slack
  command: "rm -Rf /opt/slack-fixed.deb /opt/unpack /opt/slack-desktop.deb"

J'ai volontairement gardé l'exemple simple sans ajouter de variable pour le rendre lisible.

Il y a 2 commentaires.

Ecrit par fulax le 18 oct. 2022

Salut, Je ne sais pas sur quelle distribution tu es, mais sur une Debian 11, ça devrait fonctionner sans avoir à modifier le paquet. libappindicator3-1 est un paquet virtuel, et l'installer manuellement provoque l'installation de libayatana-appindicator3-1, donc la dépendance semble correcte. (On peut le vérifier avec le « Provides: libappindicator3-1 » dans la sortie de « apt-cache show libayatana-appindicator3-1 ». Est-ce qu'un « apt install ./slack-desktop-4.22.0-amd64.deb » échoue également ? dpkg -i est connu pour ne pas résoudre les dépendances, et donc rater si le paquet dont il dépend n'est pas installé préalablement.

Réponse de Ulrich le 25 oct. 2022

Oui je suis sur Debian 11. L'installation avait échoué que ce soit avec dpkg ou apt quand Debian 11 venait de sortir. Je suppose que le paquet slack n'était pas non plus à jour de son coté et j'avais dû recourir à cette astuce. J'ai eu un soucis similaire avec Insomnia plus récemment, d'où l'idée de cet article.

Ajouter un commentaire