我正在为一些服务器开发自动引导程序,因为我们正在使用Amazon EC2作为我们的基础架构。
我所做的是:运行连接到EC2的Fabric脚本,并初始化一个新实例,将用户数据放入一个cloud-init脚本。 该脚本检出包含Fabric任务的Mercurial项目,然后在签出后,脚本将找出正在运行的服务器的types并执行特定的本地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脚本来检查服务器所在的标记键“type”。
sudo: Sorry, you must have a tty to run sudo
运行visudo并添加以下行以禁用您的用户的requiretty :
Defaults:username !requiretty
你最好的select(也许是最可靠的)是给用户正确的sudo访问所需的命令和NOPASSWD标志
例如,如果您的用户运行脚本是bob,通过sudo无需密码重新加载nginx,/ 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的身份运行这些命令