Hello la communauté,

Je suis en train d'apprendre à utiliser Ansible, et je bloque depuis plusieurs jours (quelques heures) sur une tâche que j'essaye d'effectuer.

Problématique :
J'aimerais mettre à jour mes distributions via Ansible en utilisant le gestionnaire de paquets "apt". Je souhaite que cette action soit effectuée par un utilisateur créé pour l'occasion et n'ayant que ce droit là, et que je n'ai pas besoin de saisir de mot de passe. Pour résumer, je souhaite qu'en effectuant cette commande "ansible-playbook -i hosts playbook.yml", tous mes serveurs se mettent à jour.

Mon environnement :

  • Mon laptop sur lequel Ansible est installé et ses fichiers de configuration, et ma paire de clés privée/publique ;
  • Mon/mes serveurs sur lequel(s) je souhaite effectuer mes actions (apt update et upgrade), avec un l'utilisateur "ansible" dédié à cela, et la clé publique de mon laptop.

Mes fichiers de configuration côté laptop :

  • ansible.cfg : par défaut
  • hosts :
[Perso]
servername ansible_port=1234 ansible_host=xxx.xxx.xxx.xxx
  • playbook.yml :
 ---
- name: updating and upgrading servers
  hosts: Perso
  remote_user: ansible

  tasks:
    - name: Update the repository cache
      apt:
        update_cache: yes
      become: yes
      become_method: sudo

    - name: Update all packages to the latest version
      apt:
        upgrade: yes
      become: yes
      become_method: sudo
...

Mes fichiers de configuration côté serveur :

  • /etc/sudoers :
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification
Cmnd_Alias UPDATE = /usr/bin/apt-get

# User privilege specification
root    ALL=(ALL:ALL) ALL
ansible ALL=(ALL:ALL)  NOPASSWD: UPDATE

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

Erreurs :

  • Au lancement de la commande "ansible-playbook -i hosts playbook.yml " :
TASK [Update the repository cache] *******************************************************************************************************
fatal: [servername]: FAILED! => {"changed": false, "module_stderr": "Shared connection to xxx.xxx.xxx.xxx closed.\r\n", "module_stdout": "sudo: il est nécessaire de saisir un mot de passe\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
 [WARNING]: Could not create retry file '/etc/ansible/playbook.retry'.         [Errno 13] Permission denied: '/etc/ansible/playbook.retry'
  • Au lancement de la commande "ansible-playbook -i hosts playbook.yml --ask-become-pass" :
TASK [Update the repository cache] *******************************************************************************************************
fatal: [servername]: FAILED! => {"changed": false, "module_stderr": "Shared connection to xxx.xxx.xxx.xxx closed.\r\n", "module_stdout": "\r\nDésolé, l'utilisateur ansible n'est pas autorisé à exécuter « /bin/sh -c echo BECOME-SUCCESS-mdlxqckvembmlhudhiotrcsgxjmzrjbp; /usr/bin/python /home/ansible/.ansible/tmp/ansible-tmp-1554483977.834275-7354327597348/AnsiballZ_apt.py » en tant que root sur servername.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
 [WARNING]: Could not create retry file '/etc/ansible/playbook.retry'.         [Errno 13] Permission denied: '/etc/ansible/playbook.retry'

Merci d'avance pour votre temps et pour votre retour 🙂
P.

Bonsoir,

il te faut ajouter à ta commande un extra vars :

ansible-playbook playbook.yml -i hosts --user=username --extra-vars "ansible_sudo_pass=yourPassword"

A plus

    triptixx
    Merci pour ta réponse !!!

    J'ai oublié de préciser, mais j'ai également testé la commande "ansible-playbook -i hosts playbook.yml --ask-become-pass" avec mon utilisateur principal, qui a des privilèges moins restreints et je n'ai pas ces erreurs.
    Du coup, je pense que c'est lié aux restrictions de mon utilisateur "ansible", fixée dans le fichier "sudoers", qui n'a droit qu'à "/usr/bin/apt-get".

    De plus, ce que j'aimerais pouvoir faire, c'est éviter de saisir mon mot de passe à chaque fois que je saisis ma commande.

    Des idées ?

    Merci pour votre aide
    😀

      Piccolux Je ne suis pas sur que le module apt utilise apt-get. Il est possible qu'il utilise apt ou aptitude (moins sur quand même ^^).

      Pour tester, rajoute apt et aptitude dans le fichier sudoers, et si cela ne fonctionne toujours pas, essaie avec ALL, pour écarter ou non un problème de sudoers.

        xataz
        Bonsoir Xataz,

        Merci pour ta réponse !

        Ansible utilise aptitude et, s'il ne trouve pas, va utiliser apt-get : https://docs.ansible.com/ansible/latest/modules/apt_module.html

        Lorsque je suis connecté au serveur, j'arrive bien à effectuer :

        hostname$: sudo apt-get update

        et pas besoin de saisir le mot de passe, comme prévu avec l'instruction NOPASSWD.

        De retour sur mon laptop, lorsque je fais l'opération d'update avec un utilisateur en ALL, dans le fichier sudoers, cela fonctionne correctement, et je peux mettre à jour mes serveurs.
        Mais, je suis tout de même obligé de passer par "--ask-become-pass" !!

        Mon but final est de ne pas avoir à saisir de mot de passe lors de la commande "ansible-playbook -i hosts playbook.yml", et je ne veux pas que l'utilisateur créé pour cette tâche, ait les droits sur ALL.

        Merci à vous
        🙂

          Piccolux Tu as ajouté aptitude à ton sudoers ?

          Je me demande même si ce n'est pas python-apt qu'il exécute.

          Essai ceci :

          Cmnd_Alias UPDATE = /usr/bin/apt-get, /usr/bin/aptitude, /usr/bin/apt

          Hello Xataz,

          Je viens d'essayer ce que tu m'as demandé, et j'ai toujours l'erreur :

          TASK [Update the repository cache]**********************************************************************
          fatal: [servername]: FAILED! => {"changed": false, "module_stderr": "Shared connection toxxx.xxx.xxx.xxx closed.\r\n", "module_stdout": "\r\nDésolé, l'utilisateur ansible n'est pas autorisé à exécuter « /bin/sh -c echo BECOME-SUCCESS-wbkxpzpeyflcegzfpqigwlxmvekzimds; /usr/bin/python /home/ansible/.ansible/tmp/ansible-tmp-1554987642.5979946-143055016447495/AnsiballZ_apt.py » en tant que root sur servername.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
           [WARNING]: Could not create retry file '/etc/ansible/playbook.retry'.         [Errno 13] Permission denied: '/etc/ansible/playbook.retry'

          Lorsque vous utilisez Ansible, vous utilisez un utilisateur avec tous les droits ?

          Merci à vous !
          P.

            Piccolux Perso ansible que pour initialiser un serveur, donc c'est en root, car c'est bien souvent le seul que j'ai.

            En fait j'ai l'impression que ansible n'utilise pas les commandes systèmes, mais plutôt python.

            Apparemment il faudrait ceci :

            Cmnd_Alias ANSIBLE = /usr/bin/python /home/ansible/.ansible/tmp/*, echo, /usr/bin/python -tt /home/ansible/.ansible/tmp/*

            Je ne suis pas du tout sur de moi par contre

            Merci pour tes réponses Xataz !

            J'avoue que je privilégie sudo à root directement... J'essayerai ta commande dès que j'aurai l'occasion, et te ferai un retour 🙂

            P.

              bonjour,

              Si le compte root est bloqué, comme conseiller sur votre tuto de sécu normalement il ne devrait pas fonctionner si ?

              Piccolux J'ai fait quelques tests, si jamais tu as besoin, je t'explique comment j'ai fais.

              Activation des logs sur sudo

              $ sudo visudo
              Defaults  log_host, log_year, logfile="/var/log/sudo.log"

              Lancement de la commande de test

              $ ansible all -s -i "192.168.1.200," -u ansible -m apt -a "name=vim update_cache=yes" -k --ask-sudo-pass
              192.168.1.200 | FAILED! => {
                  "changed": false,
                  "module_stderr": "Shared connection to 192.168.1.200 closed.\r\n",
                  "module_stdout": "\r\nSorry, user ansible is not allowed to execute '/bin/sh -c echo BECOME-SUCCESS-zrlgudqhxnpmbgypspfmmutsbxeyyfmt; /usr/bin/python /home/ansible/.ansible/tmp/ansible-tmp-1555443790.46-164057830847804/AnsiballZ_apt.py' as root on ironman.\r\n",
                  "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
                  "rc": 1
              }

              Donc en erreur, check dans les logs sudo

              $ sudo cat /var/log/sudo.log
              Apr 16 21:41:45 2019 : ansible : HOST=ironman : command not allowed ; TTY=pts/1
                  ; PWD=/home/ansible ; USER=root ; COMMAND=/bin/sh -c echo
                  BECOME-SUCCESS-pscyrowikoxhspknvaayoptdvgvlskye; /usr/bin/python
                  /home/ansible/.ansible/tmp/ansible-tmp-1555443704.78-281402812879021/AnsiballZ_apt.py

              Ajout de la commande dans le sudoers

              ansible ALL=(ALL) NOPASSWD: /bin/sh -c echo BECOME-SUCCESS*; /usr/bin/python /home/ansible/.ansible/tmp/*.py

              Restest sans ask-sudo-pass

              $ ansible all -s -i "192.168.1.200," -u ansible -m apt -a "name=vim update_cache=yes" -k
              192.168.1.200 | SUCCESS => {
                  "cache_update_time": 1555443494,
                  "cache_updated": false,
                  "changed": false
              }

              Y'a surement possibilité de peaufiner la commande, car là je suis pas sur que ce soit super secure

              6 mois plus tard
              Répondre…