6 votes

Ansible : Exécuter une commande en tant qu'utilisateur différent mais sans utiliser sudo

Mon objectif global est de redémarrer pulseaudio pour un utilisateur spécifique via ansible (donc si vous avez une meilleure idée de comment faire cela, je suis ouvert à l'entendre :) )

Je veux exécuter la commande suivante en tant qu'utilisateur myuser, et selon pulseaudio cela ne devrait pas être fait en tant que sudo/root.

$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)

cela fonctionne bien si je le teste sur la machine elle-même. Cela arrête pulseaudio s'il fonctionne et le redémarre, et ne échoue pas si pulseaudio était déjà arrêté.

Essai 1 [Attente jusqu'au délai d'expiration pour le mot de passe]:

Ma tâche ansible (en tant que partie d'un rôle) ressemble à ceci:

- name: redémarrer pulse audio
  shell: '$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)'
  args:
    executable: /bin/bash
  become: true
  become_method: sudo
  become_flags: "su - {{ ansible_user }} -c"

Mais si je lance cela je reçois l'erreur ÉCHEC ! => {"msg": "Délai d'attente (12s) en attendant le prompt de l'élévation de privilège: "}

Si je me connecte à cette machine en tant que root et que j'entre sudo su - myuser je reçois un prompt en tant que myuser comme je m'y attends.

Alors comment puis-je spécifier un mot de passe pour myuser afin que ansible puisse l'utiliser?

Essai 2 [Mot de passe su incorrect]:

tâche ansible:

- name: redémarrer pulse audio
  shell: '$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)'
  args:
    executable: /bin/bash
  become: true
  become_method: su
  become_user: myuser

J'ai aussi essayé d'utiliser become_user à la place de become_flags mais sans succès. Ensuite j'ai reçu l'erreur: ÉCHEC ! => {"msg": "Mot de passe su incorrect"}

Essai 3 [La commande s'exécute en tant que sudo]:

Si j'ai essayé la première suggestion de Calum Halpin, pulseaudio démarre mais en tant que sudo, ce qui n'est pas ce que je veux, je veux que pulseaudio démarre en tant que myuser.

tâche ansible:

- name: redémarrer pulse audio
  shell: '$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)'
  args:
    executable: /bin/bash
  become: true
  become_method: sudo
  become_user: myuser

Je reçois la sortie suivante:

{"changed": true, 
"cmd": "$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)", 
"delta": "0:00:05.110839", "end": "2019-06-23 11:11:43.686776", "rc": 0, "start": "2019-06-23 11:11:38.575937", 
"stderr": "E: [pulseaudio] main.c: Échec de tuer le démon: Aucun fichier ou dossier de ce type\nW: [pulseaudio] main.c: Ce programme n'est pas censé être exécuté en tant que root (sauf si --système est spécifié).", 
"stderr_lines": ["E: [pulseaudio] main.c: Échec de tuer le démon: Aucun fichier ou dossier de ce type", "W: [pulseaudio] main.c: Ce programme n'est pas censé être exécuté en tant que root (sauf si --système est spécifié)."], 
"stdout": "", "stdout_lines": []}

Essai 2.1 & 3.1 [utilisation de remote_user: myuser]

J'ai essayé de définir le remote_user sur myuser dans le playbook, mais tous les résultats sont restés les mêmes.

Ma configuration / environnement:

Mes variables become sont configurées comme ceci:

ansible_connection: ssh
ansible_user: myuser
ansible_ssh_pass: 1234
ansible_become: yes
ansible_become_user: root
ansible_become_pass: 1234

Le playbook ressemble à ceci:

- hosts: myhost
  connection: local
  become: ansible_become
  become_user: ansible_become_user

  roles:
    - role: pulse-audio-config

3voto

ahorn42 Points 125

Solution :

Après plusieurs approches différentes, j'ai réussi à le faire fonctionner avec la configuration suivante :

Les variables dans l'inventaire :

ansible_connection: ssh
ansible_user: monutilisateur
ansible_ssh_pass: 1234
ansible_become: yes
ansible_become_user: root
ansible_become_pass: 1234

dans le playbook :

- hosts: monhote
  connection: local

  roles:
    - role: un-autre-role
    - { role: configuration-pulse-audio,
      ansible_become_user: nas }
    - role: un-autre-autre-role

dans le rôle :

- name: redémarrer pulse audio
  shell: '$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)'
  args:
    executable: /bin/bash
  become: true
  become_method: sudo
  become_flags: "su - {{ ansible_become_user }} -c"

0voto

Calum Halpin Points 816

Si votre utilisateur distant a des privilèges sudo complets :

- name: restart pulse audio
  shell: '$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)'
  args:
    executable: /bin/bash
  become: true
  become_method: sudo
  become_user: myuser

Assurez-vous que ansible_become_pass est défini sur le mot de passe de l'utilisateur distant.

Alternativement, définissez la méthode de connexion en tant que su et ansible_become_pass sur le mot de passe de myuser.

Ou si la structure de votre playbook le permet, vous pouvez définir remote_user sur myuser.

Assurez-vous de ne pas avoir défini l'utilisateur à devenir dans les variables de groupe ou d'hôte, car cela remplacera le paramètre de jeu/tâche : https://docs.ansible.com/ansible/latest/user_guide/become.html#directives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X