2012-12-18 12 views
5

To pytanie dotyczy najlepszych praktyk. Uruchamiam skrypt wdrażania za pomocą Fabric. Mój użytkownik wdrożenia "wdrażanie" wymaga sudo, aby ponownie uruchomić usługi. Używam funkcji sudo z tkaniny do uruchamiania tych poleceń w moim skrypcie. Działa to dobrze, ale monituje o hasło podczas wykonywania skryptu. NIE chcę wpisywać hasła podczas wdrażania. Jaka jest najlepsza praktyka tutaj. Jedynym rozwiązaniem, jakie mogę wymyślić jest zmiana uprawnień sudo, aby nie wymagać hasła dla poleceń uruchamianych przez mojego użytkownika wdrożenia. Nie wydaje mi się to właściwe.Tkanina Sudo Brak rozwiązania hasła

+3

Można spojrzeć na dodanie nowego użytkownika, specjalnie dla wdraża, kto ma dostęp do poleceń potrzebnych do uruchomienia bez korzystania z sudo. – Bartek

Odpowiedz

-2

Jak Bartek sugeruje również, umożliwić hasłem mniej sudo dla "użytkownika" wdrażania w pliku sudoers.

Coś jak:

run('echo "{0} ALL=(ALL) ALL" >> /etc/sudoers'.format(env.user)) 
+4

To nie jest dobry sposób z kilku powodów. Po pierwsze, doda ten wiersz za każdym razem, gdy polecenie zostanie uruchomione. Po drugie, plik sudoers nie ma być modyfikowany w ten sposób. Jeśli wystąpi błąd w pliku sudoers, może nie być w stanie ponownie uruchomić polecenia sudo bez uzyskiwania dostępu do konta root ręcznie. –

+1

Moja odpowiedź brzmi: umożliwić sudo bez haseł. W jaki sposób użytkownik robi to jest inne pytanie, właśnie zasugerowałem jedną metodę. I tak, użytkownik powinien zdawać sobie sprawę z pułapek, o których wspomniałeś. –

1

Wygląda na to, że sudo może wcale nie być tak źle. Możesz określić, które polecenia użytkownik może uruchamiać i argumenty, które może wykonać polecenie (man sudoers). Jeśli problem jest tylko konieczności wpisywania hasła, opcja wiązałaby się z wykorzystaniem modułu pexpect aby zalogować się automatycznie, może z hasłem, które można przechowywać zaszyfrowanych:

import pexpect, sys 

pwd = getEncryptedPassword() 
cmd = "yourcommand" 

sCmd = pexpect.spawn('sudo {0}'.format(cmd)) 
sCmd.logfile_read = sys.stdout 
sCmd.expect('Password:') 
sCmd.sendline(pwd) 
sCmd.expect(pexpect.EOF) 
2

Można użyć:

fabric.api import env 
# [...] 
env.password = 'yourpassword' 
+1

Te rzeczy idą do vcs ujawniając hasła nigdy nie są najlepszym pomysłem, szczególnie mówimy tu o haseł do serwera. –

5

Idealnym rozwiązaniem jest utworzenie użytkownika na serwerze, który jest używany tylko do wdrożenia (np. deploy). Następnie ustaw env.user=deploy w swoim pliku fabfile. Następnie na serwerach, można dać użytkownikowi niezbędną zgodę na zasadzie poleceń przez dowódcę w pliku sudoers:

WAŻNE: Zawsze używaj sudo visudo zmodyfikować pliki sudoers

Cmnd_Alias RELOAD_SITE = /bin/bash -l -c supervisorctl*, /usr/bin/supervisorctl* 
deploy ALL = NOPASSWD: RELOAD_SITE 

Możesz dodać wiele dyrektyw Cmnd_Alias, zgodnie z potrzebą użytkownika wdrażania, a następnie przyznać dostęp NOPASSWD dla każdego z tych poleceń. Aby uzyskać więcej informacji, patrz man sudoers.

Chciałbym zachować moją konfigurację sudoers specyficzną dla wdrożenia w /etc/sudoers.d/deploy i dołączyć ten plik z /etc/sudoers, dodając na koniec: includedir /etc/suoders.d.

1

Najlepszym sposobem na to jest podzadanie. Możesz poprosić o hasło w pliku fabfile i nigdy nie ujawniać żadnych haseł ani nie wprowadzać lekkomyślnych zmian w konfiguracji sudo na zdalnym systemie (ach).

import getpass 

from fabric.api import env, parallel, run, task 
from fabric.decorators import roles 
from fabric.tasks import execute 


env.roledefs = {'my_role': ['host1', 'host2']} 


@task 
# @parallel -- uncomment if you need parallel execution, it'll work! 
@roles('my_role') 
def deploy(*args, **kwargs): 
    print 'deploy args:', args, kwargs 
    print 'password:', env.password 
    run('echo hello') 


@task 
def prompt(task_name, *args, **kwargs): 
    env.password = getpass.getpass('sudo password: ') 
    execute(task_name, *args, role='my_role', **kwargs) 

pamiętać, że można nawet połączyć to z równoległego wykonywania i zadania prompt nadal działa tylko raz, podczas gdy zadaniem deploy biegnie dla każdego hosta w roli równolegle.

Wreszcie przykładem jak można ją wywołać:

$ fab prompt:deploy,some_arg,another_arg,key=value 
Powiązane problemy