Ansible: запустить команду от имени другого пользователя, но не с помощью sudo

Моя общая цель - перезапустить pulseaudio для конкретного пользователя через ansible (поэтому, если у вас есть лучшее представление, как это сделать, я готов это услышать :))

Я хочу запустить следующую команду от имени пользователя myuser, и, согласно pulseaudio, это не следует делать от имени sudo/root.

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

это хорошо работает, если я протестирую его на одной машине. Он убивает пульсаудио, если он запущен, а затем запускает его снова, и он не дает сбоя, если пульсаудио уже был остановлен.

Попытка 1 [Ожидание тайм-аута пароля]:

Моя независимая задача (как часть роли) выглядит так:

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

Но если я запускаю это, я получаю ошибку FAILED! => {"msg": "Timeout (12s) waiting for privilege escalation prompt: "}

Если я войду на эту машину как root и введу sudo su - myuser, я получу подсказку myuser, как я и ожидал.

Итак, как я могу указать пароль для myuser, чтобы его можно было использовать?

Попытка 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

Я также пытался использовать become_user вместо become_flags, но безуспешно. Затем я получил ошибку: FAILED! => {"msg": "Incorrect su password"}

Попытка 3 [команда get выполняется как sudo]:

Если бы я попробовал первое предложение Калума Халпина, пульсаудио запускается, но, поскольку sudo, это не то, что я хочу, мне нужно, чтобы пульсаудио запускалось 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

Я получаю следующий вывод:

{"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": []}

Попытка 2.1 и 3.1 [с использованием remote_user: myuser]

Я попытался установить remote_user в myuser в palybook, но все результаты остались прежними.

Моя конфигурация/окружение:

Мои переменные become настроены так:

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

Плейбук выглядит так:

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

  roles:
    - role: pulse-audio-config

person ahorn42    schedule 22.06.2019    source источник
comment
Вы говорите, что pulseaudio начинается как «sudo», я полагаю, вы имеете в виду пользователя root. Попробуйте удалить ansible_become_user: root` из вашей конфигурации; это может быть переопределение настроек задачи. docs.ansible.com/ansible/latest/user_guide/   -  person Calum Halpin    schedule 23.06.2019
comment
что ж, это определенно хороший намек, у меня сейчас работает команда, но поэтому другие терпят неудачу - но это может быть проще понять. Я сообщу, если я нашел решение, которое работает для всех требований. Но пока спасибо! По крайней мере, теперь я знаю, что это возможно ;)   -  person ahorn42    schedule 24.06.2019
comment
@CalumHalpin спасибо, что указали мне правильное направление :) - я думаю, что установка ansible_become_user для конкретной задачи в конце концов сработала.   -  person ahorn42    schedule 24.06.2019


Ответы (2)


Решение:

После нескольких разных подходов я заработал со следующей конфигурацией:

Переменные в инвентаре:

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

в игровой книге:

- hosts: myhost
  connection: local

  roles:
    - role: another-role
    - { role: pulse-audio-config,
      ansible_become_user: nas }
    - role: another-other-role

в роли:

- 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"
person ahorn42    schedule 24.06.2019

Если ваш удаленный пользователь имеет полные привилегии sudo:

- 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

Убедитесь, что ansible_become_pass установлен в качестве пароля удаленного пользователя.

В качестве альтернативы установите метод становления на su и ansible_become_pass на пароль myuser.

Или, если ваша структура playbook подходит для этого, вы можете установить remote_user в myuser.

Убедитесь, что вы не установили пользователя в группе или хосте, так как это переопределит настройку воспроизведения/задачи: https://docs.ansible.com/ansible/latest/user_guide/become.html#directives.

person Calum Halpin    schedule 22.06.2019
comment
Спасибо за ваш ответ, но, к сожалению, ни одно из ваших предложений не имело другого эффекта, чем мои предыдущие попытки. - person ahorn42; 23.06.2019