aho*_*n42 6 bash sudo pulseaudio ansible
我的总体目标是通过ansible为特定用户重新启动pulseaudio(所以如果您有更好的想法如何做到这一点,我很乐意听到它:))
我想以用户身份运行以下命令myuser
,根据pulseaudio,这不应该以 sudo/root 身份完成。
$([[ $(pulseaudio -k) -eq 0 ]] || exit 0; sleep 5; [[ $(pulseaudio -D --exit-idle-time=-1) -eq 0 ]] || exit 0)
Run Code Online (Sandbox Code Playgroud)
如果我自己在一台机器上测试它,效果会很好。如果pulseaudio正在运行,它会杀死它,然后再次启动它,如果pulseaudio已经停止,它不会失败。
我的 ansible 任务(作为角色的一部分)如下所示:
- 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_flags: "su - {{ ansible_user }} -c"
Run Code Online (Sandbox Code Playgroud)
但如果我运行它,我会收到错误FAILED! => {"msg": "Timeout (12s) waiting for privilege escalation prompt: "}
如果我以 root 身份登录到该计算机并输入,sudo su - myuser
我会收到一个提示,正如myuser
我所期望的那样。
那么我该如何指定密码以便myuser
ansible可以使用它呢?
可靠的任务:
- 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: su
become_user: myuser
Run Code Online (Sandbox Code Playgroud)
我也尝试使用become_user
代替become_flags
但没有成功。然后我得到了错误:FAILED! => {"msg": "Incorrect su password"}
如果我尝试了 Calum Halpin 的第一个建议,pulseaudio 会启动,但作为 sudo,这不是我想要的,我需要使用pulseaudio 启动myuser
。
可靠的任务:
- 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
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
{"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: Failed to kill daemon: No such file or directory\nW: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).",
"stderr_lines": ["E: [pulseaudio] main.c: Failed to kill daemon: No such file or directory", "W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified)."],
"stdout": "", "stdout_lines": []}
Run Code Online (Sandbox Code Playgroud)
remote_user: myuser
]我尝试在 palybook 中设置,但所有结果都remote_user
保持不变。myuser
我的become
变量配置如下:
ansible_connection: ssh
ansible_user: myuser
ansible_ssh_pass: 1234
ansible_become: yes
ansible_become_user: root
ansible_become_pass: 1234
Run Code Online (Sandbox Code Playgroud)
该剧本如下所示:
- hosts: myhost
connection: local
become: ansible_become
become_user: ansible_become_user
roles:
- role: pulse-audio-config
Run Code Online (Sandbox Code Playgroud)
经过几种不同的方法后,我让它使用以下配置:
库存中的变量:
ansible_connection: ssh
ansible_user: myuser
ansible_ssh_pass: 1234
ansible_become: yes
ansible_become_user: root
ansible_become_pass: 1234
Run Code Online (Sandbox Code Playgroud)
在剧本中:
- hosts: myhost
connection: local
roles:
- role: another-role
- { role: pulse-audio-config,
ansible_become_user: nas }
- role: another-other-role
Run Code Online (Sandbox Code Playgroud)
在角色中:
- 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_flags: "su - {{ ansible_become_user }} -c"
Run Code Online (Sandbox Code Playgroud)