Ansible systemctl --user для другого пользователя - PullRequest
1 голос
/ 10 июля 2019

Я захожу на другой компьютер как непривилегированный пользователь ansible, и я бы хотел, чтобы ansible включил службу systemd user для пользователя bob.

Без ответа решение будет ssh bob@machine, за которым следует systemctl --user enable service

Однако с ansible есть две проблемы:

  1. Более новые версии ansible откажутся стать бобом непривилегированного пользователя, если уже вошли в систему как другой непривилегированный пользователь (ansible).
  2. Даже если бы это работало, dbus не запустился бы, и systemctl не смог бы общаться с systemd (если я правильно понял).

Чрезвычайно ужасный обходной путь - выполнить команду оболочки, включить в себя удаленный хост ssh как bob и запустить там команду systemctl raw.

Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 12 июля 2019

Возможны оба варианта.

1) remote_user: bob

- hosts: test_01
  become: no
  remote_user: admin
  tasks:
    - command: whoami
      register: result
    - debug:
        var: result.stdout
    - command: whoami
      remote_user: bob
      register: result
    - debug:
        var: result.stdout

дает:

"result.stdout": "admin"
"result.stdout": "bob"

2) pipelining = true цитата из Стать непривилегированным пользователем

Использовать конвейеризацию.Когда конвейеризация включена, Ansible не сохраняет модуль во временный файл на клиенте.Вместо этого он передает модуль в стандартный интерфейс удаленного интерпретатора Python.Конвейерная обработка не работает для модулей Python, связанных с передачей файлов (например, копирование, извлечение, шаблон), или для модулей не-Python.

- hosts: test_01
  become: no
  remote_user: admin
  tasks:
    - command: whoami
      register: result
    - debug:
        var: result.stdout
    - command: whoami
      become_user: bob
      become_method: sudo
      become: yes
      register: result
    - debug:
        var: result.stdout

дает

"result.stdout": "admin"
"result.stdout": "bob"

с

$ grep pipe ansible.cfg 
pipelining = true
...