Ansible - Une erreur bête qui peut faire perdre du temps

, par  Genma , popularité : 3%

Dans le présent billet, je voudrais raconter comment j’ai perdu 3h à cause d’un changement de droits sur un script déployé via Ansible (je divulgache / spoile dès la première phrase). Mais si ce retour d’expérience peut être utile... Je précise que cela a été fait un vendredi après-midi (oui je sais on ne mets pas en production un vendredi), avec la double fatigue de la semaine et des nuits au sommeil hachuré (pour nourrir Mononoke). Je sais cela n’excuse rien, cela peut sembler bête comme problème. Oui, une fois qu’on le sait, c’est évident.

Le besoin

J’ai crée un fichier script que j’ai déployé sur une machine de recette. Ce script doit ensuite être déployé sur un parc de machines identiques. Ce sera via Ansible.

Le problème

En local, le script marche bien. Je le pousse via SCP sur la machine de recette. Ca marche sans soucis. Je le pousse via Ansible (via un playbook) sur le parc de machines, ça ne marche pas.

La démarche pour analyser le problème

Comme le script génère des logs, je rajoute des lignes du type "je suis ici", "je suis là" pour voir si le script est exécuté, si ce n’est pas un problème dans la condition (il y a un if) et si on rentre bien dans la boucle et détecter à quelle étape du script il s’arrête.
Je pousse le script via SSH sur la machine de recette, le script tourne bien sur la machine de recette avec les logs de debugs.

Le même script poussé via Ansible sur une autre machine, je surveille les logs, aucune ligne dans les logs.

Depuis une session en SSH, je supprime le script, le recrée et fait un gros copier coller dedans. Ca marche.

Je repousse en SCP, ça marche...

Je ne vais quand même pas pousser sur toutes les machines via SCP, je perds l’intérêt d’Ansible et le problème vient donc de mon usage d’Ansible. Mais qu’est ce qui cloche ?

Je recompare avec une autre machine, le contenu des fichiers sont identiques...

La solution ? Un problème de droits...

Et là, j’ai une idée... Je regarde le détail des droits et permissions entre la machine pour laquelle ça marche et celle pour laquelle ça ne marche pas. Le propriétaire est le même. Mais au niveau des droits j’ai

-rwxr-xr-x  1 root root  script_qui_marche

versus

-rw-r--r--  1 root root  script_qui_marche_pas  

Et là je regarde dans le playbook...

    copy:
      src: script_qui_marche
      dest: /destination_du_script
      owner: root
      group: root
      mode: '0644'

Cette ligne mode... Passée en "755", le playbook relancé, l’ensemble des machines exécute bien le script...

Ce que j’ai appris de cette expérience

La mise en recette et mis en production n’étais pas identique : scp versus déploiement via un playbook. J’aurai déployé sur la recette via le même playbook, j’aurai pu voir le problème plus tôt. Ansible reposant sur SSH, je lançais bêtement une copie du script via SSH/SCP sans tenir compte des ajouts plus spécifiques dans le playbook Ansible... et ne pas avoir à me prendre la tête pour juste une machine à taper une commande Ansible.

Les permissions, il faut y penser et faire attention.

Pourquoi ça marchait via le SCP et via la suppression / création manuelle du fichier : par défaut, le fichier héritait des droits du répertoire parent dans lequel il se trouvait et avait donc les bons droits. Droits qui étaient réécrits via Ansible...