#ansible #sudo
Есть работающий от рута плейбук для ansible. (знаю, что от рута плохо, но на то есть
причины), который, от рута же, делает свои дела на неком скопе серверов.
Есть PHP-шная админка, работающая от имени wwwrun
Хочется запускать плейбук по кнопочке в админке. То есть юзер wwwrun запускает плейбук,
который исполняется от рута.
Так вот вопрос. Можно ли сделать такое настройками ролей в ansible(или по другому
как?), не выдавая пользователю wwwrun возможность повышения своих привилегий?
PS Документацию и интернеты читал, ответа на вопрос не нашел. Может плохо читал конечно,
но тогда киньте ссылкой, где про это написано.
Ответы
Ответ 1
Создаёте скриптик
#!/bin/sh
ansible-playbook ...
В sudoers добавляете разрешение пользователю wwwrun запускать именно этот созданный
скрипт:
wwwrun ALL=(ALL) NOPASSWD: /full/path/to/script
Технически, это повышение привилегий пользователем, но только для одной определённой
команды, что при условии отсутствия прав на редактирование этого скрипта (и плейбука!)
вполне допустимо.
Другой вариант - очередь полноценная с сервером очередей (избыточно, если только
для этой задачи и нужно) или её подобие. Самое простое на файлике:
Веб-морда создаёт где-нибудь файлик с определённым именем, отмечающий, что нужно
запустить плейбук.
по крону запускается шелл-скритп, проверяющий, существует ли такой файлик. Если есть
- запускает плейбук и после удаляет файлик
соответственно на веб-морде проверка - если файл ещё есть, значит плейбук ещё не
выполнился.
В бонусе - одновременно выполняется только один плейбук. Минус - крон запускается
самое частое раз в минуту.
Вопросов, почему плейбук выполняется от рута и зачем для этого веб-морда, пожалуй,
касаться не буду.
Ответ 2
Если вас действительно интересует именно ansible way.
Скрипт ansible который запускается на некотором сервере server-ansible-01 из-под
пользователя user01 и выполняет работу на другом сервере server-web-01 действительно
может работать из-под пользователя ansible сервера server-web-01. (При чём server-ansible-01
и server-web-01 могут оказаться одним и тем же сервером -- и это как раз ваш случай)
Это совершенно штатная фича ansible. Задаётся она на уровне плейбука, а не роли --
хотя если будет желание, то для отдельных шагов роли, подключаемой в плейбуке можно
будет указать и другие credentials.
Просто укажите в своём плейбуке remote_user:
- name: asdf
hosts: '{{ target }}'
remote_user: root
roles:
- myrole01
Также если вы подключились к удалённому server-ansible-01 как ansible, то вы можете
и некоторые шаги выполнить как пользователь apache или root. Читаем про become - Become
(Privilege Escalation)
Это работает в современных версиях ансибл (кажется, с 1.9, у меня в 2.1 точно уже
давно есть), раньше были другие команды, sudo_user и sudo, можете поискать в документации,
я уже давно свои плейбуки отрефакторил.
Вопросы, которые касаются возможности подключения к другому серверу -- они всегда
сводятся к корректной настройке ssh-ключей (рекомендую почитать в этом моём вопросе:
Ansible: форвард ssh-агента и sudo ) и частично будет затронут вопрос passwordless sudo:
- name: nopasswd sudo for ansible user
lineinfile: "dest=/etc/sudoers state=present regexp='^{{ ansible_user.login }}'
line='{{ ansible_user.login }} ALL=(ALL) NOPASSWD: ALL'"
Я очень сильно не приветствую то, что вы хотите выполять скрипты ansible из-под аккаунта
root (у меня все скрипты спокойно работают и без этого, более того -- со включенным
SELinux), этот костыль если вы не хотите убирать -- это уже ваше собственное решение.
В целом же ничего не мешает запустить плейбук от имени пользователя wwwrun версебрвера
и начать выполнение скриптов на "удалённом" веб-сервере (с тем же самым IP) но уже
как root этого веб-сервера.
Всё вышенаписанное касается именно выполнения плейбука от другого пользователя. Но.
Вы в свой вопрос уместили совершенно другой вопрос: "как мне запустить sh-скрипт
из админки сайта, но не от пользователя веб-сервера".
Этот вопрос уже никоим образом не относится к ансибл, ответ на него вам дали выше
-- если вам важнее именно эта часть вопроса, то рекомендую принять именно ответ @Мелкий
-- там ничего нет про ансибл, это просто разрешение wwwrun на sudoers одной определённой
команды.
Более того, если хотите конкретизировать вопрос и поставить задачу "запускать не
просто абы какой скрипт, а именно плейбук ansible", то у вас могут возникнуть сложности
именно в связи с тем, что пользователь wwwrun из соображений безопасности имеет урезанные
права - вам нужно будет ему в /usr/apache создавать собственный ssh ключ и много чего
ещё исправлять. Проходил, знаю. Не то, чтобы эти проблемы нерешаемы, просто я в последнее
время как-то больше внимания стал уделять тому, чтобы при создании решений не проделывать
дыры в безопасности, а дыр этих тут у вас хватает.