Рейтинг:1

Запустите PHP-скрипт NextCloud «occ» от имени пользователя веб-сервера при подключении Ansible.

флаг co

Как мне написать Задача Ansible для запуска скрипта PHP от имени третьего пользователя; не пользователь root и не подключающийся пользователь, а пользователь «веб-сервера»?

Программа администрирования NextCloud окк, согласно документации, должен быть запущен как пользователь веб-сервера:

sudo -u www-данные php occ

Чтобы стать другим пользователем для запуска команды, Ansible предоставляет стать особенность. Документация Ansible строго не рекомендует запускать команды от имени другого пользователя без полномочий root:

Все нормально, если файл модуля выполняется без использования стать, когда стать_пользователем является пользователем root или когда подключение к удаленному компьютеру осуществляется с правами root. В этих случаях Ansible создает файл модуля с разрешениями, которые разрешают чтение только пользователю и root или разрешают чтение только непривилегированному пользователю, на которого переключается.

Однако, когда и пользователь подключения, и стать_пользователем являются непривилегированными, файл модуля записывается как пользователь, которого подключает Ansible (т. удаленный_пользователь), но файл должен быть доступен для чтения пользователю, настроенному для Ansible.

С использованием стать_пользователем этому пользователю

Пользователь подключения имеет судо разрешение запускать команды от имени третьего пользователя:

$ sudo -u www-данные whoami
www-данные

Когда я использую стать_пользователем в задаче, чтобы запустить команду от имени этого пользователя:

- имя: «NextCloud: конфигурация экземпляра»
  стать_пользователем: "{{ web_process_user }}"
  команда:
    команда: >-
        php "{{ apache_nextcloud_dir }}/occ" обслуживание: установить
            --нет-взаимодействия
            ¦

ОБНОВИТЬ: гм, это работает. Я не знаю, что изменилось, но при попытке воспроизвести проблему она остановилась.

С использованием ракушка с явным судо вызов от имени этого пользователя

Когда я настраиваю задачу Ansible с ракушка команда:

оболочка: >-
    su '{{ web_process_user }}' --shell '/bin/bash' -c ' \
        php "{{ apache_nextcloud_dir }}/occ" …

Анзибл жалуется:

[ПРЕДУПРЕЖДЕНИЕ]: рассмотрите возможность использования «become», «become_method» и «become_user», а не запуска su

Я хотел бы сделать это. Ансибл стать было бы гораздо более изящным способом, чем этот оболочка: су взломать.

Но при использовании стать, возникают проблемы, описанные в документации Ansible: модуль задачи, отправленный по соединению для выполнения этой команды, не может получить привилегию для создания своих временных файлов.

Документация Ansible советует:

  • «использовать конвейерную обработку»: при этом теряются преимущества системы модулей задач по умолчанию.
  • «не становиться непривилегированным пользователем»: не вариант, потому что для запуска этой команды требуется непривилегированный пользователь веб-сервера правильно.

Как я должен сделать Ansible задачу который работает php "{{apache_nextcloud_dir}}/occ" как непривилегированный, третий пользователь {{ web_process_user }}?

ОБНОВИТЬ: стать функциональность теперь работает правильно.

solarchemist avatar
флаг in
Вы можете избежать всего этого беспорядка, убедившись, что setfacl установлен на цели (`apt install acl`). Тогда это просто работает. Может не работать на хостах, использующих файловые системы без поддержки ACL, но я никогда не сталкивался с такими системами. См. этот раздел в документах Ansible https://docs.ansible.com/ansible/latest/user_guide/become.html#risks-of-becoming-an-unprivated-user.
Рейтинг:0
флаг cz

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

Итак, вам нужно сделать две вещи:

  1. Установлен стать_пользователем непривилегированному пользователю (здесь, www-данные). Это приведет к тому, что ansible будет использовать sudo для этого пользователя вместо root.

  2. Настроить sudoers чтобы ваш удаленный_пользователь к судо к www-данные. Например, если ваш удаленный_пользователь является доступный:

    доступный ALL=(www-данные) NOPASSWD:ALL
    

    Обратите внимание, что это, вероятно, необязательно, потому что обычно уже настроен sudo, чтобы позволить доступному пользователю sudo для любого пользователя, что-то вроде:

    доступный ALL=(ALL) NOPASSWD:ALL
    

    или поместив его в группу, которая уже может это сделать.


Второй способ — подключить Ansible напрямую к удаленной системе от имени желаемого пользователя (здесь www-данные) и нет судо. Вы делаете это следующим образом:

  1. Добавьте открытый ключ Ansible ssh в ключ удаленного пользователя. .ssh/authorized_keys.

  2. Установлен remote_user=www-данные и стать=нет для задачи, блока, плейбука, роли и т. д., которые необходимо запустить от имени этого пользователя.

флаг co
«отпугнула документация» — как раз наоборот; документация напугала меня *до* попытки заставить это работать. Но теперь я обновил вопрос, указав, что не могу воспроизвести проблему; рекомендуемая функция «становиться» теперь работает корректно. Спасибо за подсказки.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.