Назад | Перейти на главную страницу

Запуск команд sudo в сценарии cloud-init

Я разрабатываю автоматический загрузчик для некоторых серверов, поскольку мы используем Amazon EC2 для нашей инфраструктуры.

Что я делаю: запускаю сценарий Fabric, который подключается к EC2 и инициализирует новый экземпляр, помещая в пользовательские данные сценарий облачной инициализации. Этот сценарий проверяет проект Mercurial, который содержит задачи Fabric, а затем, после проверки, сценарий обнаружит, на каком типе сервера он работает, и выполнит конкретную локальную задачу Fabric.

Моя проблема в том, что для некоторых задач необходимо запускать команды sudo, поскольку сценарий был инициализирован из cloud-init, бывает, что sudo предупреждает о необходимости запускать tty, я попытался изменить это, чтобы запустить su --session-command="my commands to restart services" root и это не работает (и кажется, что не должно) вообще работать.

Итак, как я могу запускать команды sudo в этом загрузочном скрипте?

Некоторый код:

cloud_init_script:

#!/bin/sh
su --session-command="\
source /etc/profile; \
cd /home/my_user; \
hg clone ssh://fabric_tasks_repo fabric; \
/usr/local/bin/fab -f /home/my_user/fabric/fabfile.py \`ec2-describe-tags   --filter \"resource-type=instance\"   --filter \"resource-id=$(ec2-metadata -i | cut -d ' ' -f2)\"   --filter \"key=type\" | cut -f5\` > /home/my_user/fabric.log 2>&1" my_user &

Уловка в /usr/local/bin/fab строка заключается в том, что он запустит несколько сценариев ec2, чтобы проверить, в каком "типе" тега-ключа находится сервер.

sudo: Sorry, you must have a tty to run sudo

Бегать visudo и добавьте следующую строку, чтобы отключить requiretty для вашего пользователя:

Defaults:username !requiretty

ваш лучший выбор (и, вероятно, самый надежный) - предоставить пользователю правильный доступ sudo к необходимым командам и с флагом NOPASSWD

например, если ваш пользователь, запускающий сценарий, - bob, для перезагрузки nginx через sudo без пароля синтаксис / etc / sudoers будет следующим:

bob ALL= NOPASSWD: /etc/init.d/nginx reload

ваш сценарий выше будет фактически изменен на:

sudo -u my_user hg clone ssh://fabric_tasks_repo /home/my_user/fabric
sudo -u my_user /usr/local/bin/fab -f /home/my_user/fabric/fabfile.py `ec2-describe-tags   --filter "resource-type=instance"   --filter "resource-id=$(ec2-metadata -i | cut -d ' ' -f2)"   --filter "key=type" | cut -f5` > /home/my_user/fabric.log 2>&1 &

вам может или не нужно избегать цитат, но я удалил их для ясности

поэтому в вашем файле sudoers есть пользователь, от имени которого вы запускаете скрипт, но он может запускать эти команды как пользователь my_user