2012-10-26 26 views
18

में उपयोगकर्ता को स्विच करना मुझे अपने वेब एप्लिकेशन को तैनात करने के लिए मेरे एसएसएच वर्कफ़्लो की नकल करने के लिए फैब्रिक का उपयोग करते समय समस्या है।फैब्रिक

  1. SSH जड़ उपयोगकर्ता का उपयोग कर:

    यहाँ आदेशों की मेरी हमेशा की तरह प्रवाह जब मैं एक सर्वर से ssh है। ssh [email protected]

  2. स्विच वेब उपयोगकर्ता के लिए: सु - वेब
  3. बदलें निर्देशिका: सीडी/SRV/वेब/prod/abc_project
  4. प्रारंभ virtualenv: workon abc_env
  5. Git पुल को पूरा करें: Git पुल मूल गुरु
  6. में चलने वाली स्क्रिप्ट: build_stuff -m
  7. रन एक और स्क्रिप्ट का निर्माण: ./run

मैं कपड़ा में एक तैनाती स्क्रिप्ट के रूप में यह लिखने का प्रयास किया है और मैं एक खोल उत्पादन जब रों मिल यू - वेब दर्ज किया गया है। मुझे स्क्रिप्ट जारी रखने के लिए Ctrl-D को हिट करना होगा। मैं अपने वर्चुअलएनवी को सक्रिय करने में भी असमर्थ हूं .... क्योंकि: su-web सफलतापूर्वक उपयोगकर्ता को web पर स्विच करता है लेकिन Ctrl-d की वजह से (ताकि मैं फैब्रिक स्क्रिप्ट जारी रख सकूं), यह उस उपयोगकर्ता से वापस लॉग आउट हो जाता है और वापस जड़।

env.user = 'root' 

@roles('web') 
def deploy(): 
    dev_path = '/srv/web/prod' 
    app_path = '/srv/web/prod/rhino' 
    workon = 'workon rhino_env' 
    with prefix('su - web'): 
     puts('Switched to `web` user') 
     with settings(warn_only=True): 
      run('kill -9 `cat /srv/web/run/rhino/rhino.pid`') 
      puts('Stopped rhino...') 
     with cd(app_path): 
      run('git reset --hard HEAD') 
      puts('Discarded all untracked and modified files') 
      run('git checkout master') 
      run('git pull origin master') 
      users = run('users') 
      puts('Output from `users` command: %s' % users) 
      run(workon) 
      run('build_assets -m build') 
     run('cd %(dev_path)s; chown -R web:ebalu rhino' % {'dev_path': dev_path}) 
     run('cd %(app_path)s; ./run' % {'app_path': app_path}) 
     pid = run('cat /srv/web/run/rhino/rhino.pid') 
     puts('Rhino started again with pid: %s.' % pid) 

... वहाँ एक और बात है::

यहाँ मेरी स्क्रिप्ट है नहीं, मैं वेब के रूप में शुरू में प्रवेश नहीं कर सकते, मैं रूट के रूप में लॉग इन किया है। यह वह वेब उपयोगकर्ता है जिसमें वर्चुअलएव रूट उपयोगकर्ता नहीं है।

उत्तर

12

सबसे पहले, आपको किसी अन्य उपयोगकर्ता के तहत आदेश निष्पादित करते समय sudo का उपयोग करना चाहिए। दूसरा, workon वर्तमान खोल के लिए पर्यावरण चर सेट करता है। चूंकि कपड़े प्रत्येक कमांड के लिए नए खोल को आमंत्रित करता है, इसलिए आपको प्रत्येक कमांड में workon rhino_env चलाया जाना चाहिए, जहां आपको वर्चुअलएन्व (यानी उपसर्ग के रूप में) की आवश्यकता है। के साथ इस संपादित करता yor कोड इस तरह दिखना चाहिए:

env.user = 'root' 

@roles('web') 
def deploy(): 
    dev_path = '/srv/web/prod' 
    app_path = '/srv/web/prod/rhino' 
    workon = 'workon rhino_env; ' 
    with settings(warn_only=True): 
     run('kill -9 `cat /srv/web/run/rhino/rhino.pid`') 
     puts('Stopped rhino...') 
    with cd(app_path): 
     sudo('git reset --hard HEAD', user='web') 
     puts('Discarded all untracked and modified files') 
     sudo('git checkout master', user='web') 
     sudo('git pull origin master', user='web') 
     users = run('users') 
     puts('Output from `users` command: %s' % users) 

     with prefix(workon): 
      sudo('build_assets -m build', user='web') 
    with cd(dev_path): 
     run('chown -R web:ebalu rhino') 

    with cd(app_path): 
     sudo('./run', user='web') 

    pid = run('cat /srv/web/run/rhino/rhino.pid') 
    puts('Rhino started again with pid: %s.' % pid) 
+0

धन्यवाद प्रत्येक बार प्रत्येक पासवर्ड टाइप करना! मैंने कभी भी वेब उपयोगकर्ता का उपयोग करके गिट कमांड चलाने का विचार नहीं किया। मैं इसके बजाए गिट कमांड के सामने 'सु-वेब' का उपयोग करने की कोशिश करता रहा। धन्यवाद एक लाख मेचमाइंड! – Mark

3

su के साथ दूरस्थ उपयोगकर्ता को बदलने के बजाय sudo ऑपरेशन का उपयोग करना एक संभावित समाधान है।

3

तरह से मैं प्राप्त इस

from fabric.api import settings 

with settings(user='otheruser'): 
    ... 

आप otheruser के पासवर्ड के लिए प्रेरित किया जाएगा के साथ है, हालांकि केवल एक बार। तो यह sudo su otheruser के समतुल्य नहीं है, जहां रूट के बिना उपयोगकर्ता खाते में रूट लॉग होता है, लेकिन आपकी स्क्रिप्ट में उपयोगकर्ताओं के बीच स्विच करने का एक आसान तरीका है, केवल

+1

मैं कसम खाता हूं कि यह एक बार काम करता है! मेरा प्रावधान कार्य अब टूट गया है। –

संबंधित मुद्दे