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

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

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

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

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

Попытка 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, чтобы ansible мог его использовать?

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

Если я попробовал первое предложение Калума Халпина, 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

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

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

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Решение:

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

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

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"
0 голосов
/ 22 июня 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.

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

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

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

...