Я разрабатываю автоматический загрузчик для некоторых серверов, поскольку мы используем 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