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