Executando comandos sudo no script cloud-init

3

Estou desenvolvendo um bootstrapper automático para alguns servidores, já que estamos usando o Amazon EC2 para nossa infraestrutura.

O que eu faço é: executar um script Fabric que se conecta ao EC2 e inicializa uma nova instância, colocando em user-data um script cloud-init. Esse script faz o check-out de um projeto do Mercurial que contém tarefas do Fabric e, depois do checkout, o script descobrirá em qual tipo de servidor está sendo executado e executará uma tarefa local específica do Fabric.

Meu problema é que algumas tarefas precisam executar comandos sudo, como o script foi inicializado a partir do cloud-init acontece que o sudo avisa sobre a necessidade de executar um tty, tentei modificar isso para executar su --session-command="my commands to restart services" root e ele não (e parece que isso não deveria funcionar).

Então, como posso executar comandos sudo neste script de inicialização?

Algum código:

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 &

O truque na linha /usr/local/bin/fab é que ele executará alguns scripts ec2 para verificar qual tag-key "type" o servidor está usando.

    
por victorcampos 24.10.2011 / 22:51

2 respostas

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

Execute visudo e adicione a seguinte linha para desativar requiretty para seu usuário:

Defaults:username !requiretty
    
por 25.10.2011 / 09:06
1

sua melhor aposta (e provavelmente mais confiável) é dar ao usuário acesso correto ao sudo aos comandos necessários e com o sinalizador NOPASSWD

por exemplo, se seu usuário executando o script for bob, para recarregar o nginx via sudo sem uma senha, a sintaxe de / etc / sudoers seria:

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

seu script acima seria efetivamente alterado para:

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 &

você pode ou não precisar escapar de suas citações, mas eu as removi para maior clareza

para que seu arquivo sudoers tenha o usuário no qual você executa o script, mas ele pode executar esses comandos como o usuário my_user

    
por 24.10.2011 / 23:00

Tags