2012-12-18 16 views
5

यह प्रश्न सर्वोत्तम प्रथाओं के बारे में है। मैं फैब्रिक के साथ एक तैनाती स्क्रिप्ट चला रहा हूँ। मेरी तैनाती उपयोगकर्ता 'तैनाती' सेवाओं को पुनरारंभ करने के लिए सुडो की जरूरत है। इसलिए मैं अपनी स्क्रिप्ट में इन आदेशों को चलाने के लिए कपड़े से सूडो फ़ंक्शन का उपयोग कर रहा हूं। यह ठीक काम करता है लेकिन स्क्रिप्ट निष्पादन के दौरान पासवर्ड के लिए संकेत देता है। मैं तैनाती के दौरान पासवर्ड टाइप नहीं करना चाहता हूं। यहां सबसे अच्छा अभ्यास क्या है। एकमात्र समाधान जो मैं सोच सकता हूं वह सूडो अनुमतियों को बदल रहा है ताकि मेरे परिनियोजन उपयोगकर्ता द्वारा चलाए जाने वाले आदेशों के लिए पासवर्ड की आवश्यकता न हो। यह मेरे लिए सही प्रतीत नहीं होता है।फैब्रिक सूडो कोई पासवर्ड समाधान

+3

आप विशेष रूप से तैनात है, जो आदेशों आप sudo का उपयोग किए बिना चलाने की आवश्यकता की पहुंच है के लिए कोई नया उपयोगकर्ता जोड़ना पर गौर कर सकता है,। – Bartek

उत्तर

-2

Bartek भी पता चलता है, पासवर्ड से कम sudo सक्षम: समस्या सिर्फ पासवर्ड लिखने की रही है, तो एक विकल्प स्वचालित रूप से प्रवेश करने के लिए pexpect मॉड्यूल का उपयोग कर, शायद एक पासवर्ड है कि आप एन्क्रिप्टेड संग्रहीत कर सकती है के साथ शामिल होगा sudoers फ़ाइल में तैनाती 'उपयोगकर्ता' के लिए।

कुछ की तरह:

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

यह दो कारणों से वास्तव में एक अच्छा तरीका नहीं है। सबसे पहले, यह आदेश चलाने पर हर बार इस लाइन को जोड़ देगा। दूसरा, sudoers फ़ाइल इस तरह से संशोधित करने के लिए नहीं है। अगर sudoers फ़ाइल में कोई त्रुटि है, तो आप मैन्युअल रूप से रूट पहुंच प्राप्त किए बिना फिर से sudo आदेश चलाने में सक्षम नहीं हो सकते हैं। –

+1

मेरा जवाब पासवर्ड रहित सुडो सक्षम करना है। उपयोगकर्ता यह कैसे करता है एक और सवाल है, मैंने अभी एक विधि का सुझाव दिया है। और हां उपयोगकर्ता को आपके द्वारा बताए गए नुकसानों से अवगत होना चाहिए। –

1

sudo जैसा लगता है कि यह सब के बाद एक विकल्प का बुरा नहीं हो सकता है। आप निर्दिष्ट कर सकते हैं कि उपयोगकर्ता कौन से आदेश और चला सकता है जो कमांड ले सकते हैं (man sudoers)।

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

आप उपयोग कर सकते हैं:

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

ये सामान पासवर्ड प्रकट करने वाले वीसीएस में जाते हैं, कभी भी सबसे अच्छा विचार नहीं है, खासकर हम यहां सर्वर पासवर्ड के बारे में बात कर रहे हैं। –

5

आदर्श समाधान आपके सर्वर पर उपयोगकर्ता बनाना है जिसका उपयोग केवल तैनाती के लिए किया जाता है (उदाहरण के लिए, deploy)। फिर, अपने fabfile में env.user=deploy सेट करें। फिर अपने सर्वर पर, आप उपयोगकर्ता एक आदेश-दर-आदेश के आधार पर आवश्यक अनुमति एक sudoers फाइल में दे सकते हैं:

महत्वपूर्ण: हमेशा एक sudoers फाइल को संशोधित करने के sudo visudo का उपयोग

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

आप तैनात उपयोगकर्ता द्वारा आवश्यक Cmnd_Alias निर्देशों को जोड़ सकते हैं, फिर उन आदेशों में से प्रत्येक के लिए NOPASSWD पहुंच प्रदान करें। अधिक जानकारी के लिए man sudoers देखें। includedir /etc/suoders.d अंत में:

मैं जोड़कर /etc/sudoers से /etc/sudoers.d/deploy में मेरी तैनाती विशेष sudoers config रखने के लिए और उस फ़ाइल को शामिल करना चाहते।

1

ऐसा करने का सबसे अच्छा तरीका subtasks के साथ है। आप fabfile में पासवर्ड पासवर्ड के लिए संकेत दे सकते हैं और कभी भी किसी भी पासवर्ड का पर्दाफाश नहीं कर सकते हैं, न ही रिमोट सिस्टम पर सुडौ में कॉन्फ़िगरेशन कॉन्फ़िगरेशन बदल सकते हैं।

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) 

ध्यान दें कि आप भी समानांतर निष्पादन और prompt कार्य के साथ इस गठजोड़ कर सकते हैं अभी भी केवल एक बार, जबकि deploy कार्य भूमिका में प्रत्येक होस्ट के लिए चलाता है, समानांतर में चलाता है।

अंत में, आप इसे कैसे आह्वान का एक उदाहरण:

$ fab prompt:deploy,some_arg,another_arg,key=value 
संबंधित मुद्दे