Ansible:以不同用户身份运行命令,但不使用 sudo

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已经停止,它不会失败。

尝试 1 [等待密码超时]:

我的 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我所期望的那样。

那么我该如何指定密码以便myuseransible可以使用它呢?

尝试2【su密码错误】:

可靠的任务:

- 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"}

尝试 3 [命令 get 作为 sudo 执行]:

如果我尝试了 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)

尝试 2.1 和 3.1 [使用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)

aho*_*n42 3

解决方案:

经过几种不同的方法后,我让它使用以下配置:

库存中的变量:

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)