2013-07-30 43 views
1

是否可以強制用戶在部署到生產時輸入密碼?Fabric - 生產部署強制密碼提示

我正在部署到staging,但不小心打到CL上的標籤爲production,反而幾乎犯了一個大錯!不用說,我永遠不會再使用自動完成功能fab ...

UPDATE:

下面是我們的基本fabfile樣子。每個主機(例如application-stagingapplication-production)都保存在ssh配置中。

from fabric import colors 
from fabric.api import * 
from fabric.contrib.project import * 

import git 

env.app = '{{ project_name }}' 
env.dest = "/var/www/%(app)s" % env 
env.use_ssh_config = True 

def reload_processes(): 
    sudo("kill -HUP `cat /tmp/%(app)s.pid`" % env) 

def sync(): 
    repo = git.Repo(".") 
    sha = repo.head.commit.hexsha 
    with cd(env.dest): 
     run("git fetch --all") 
     run("git checkout {} -f".format(sha)) 

    if "production" in env.host_string: 
     with cd(env.dest): 
      run("compass compile") 

      with prefix(". /home/ubuntu/environments/%(app)s/bin/activate" % env): 
       run("%(dest)s/manage.py syncmedia" % env) 

def deploy(): 
    sync() 
    link_files() 
    reload_processes() 
    add_commit_sha() 

def link_files(): 
    print(colors.yellow("Linking settings.")) 
    env.label = env.host_string.replace("%(app)s-", "") 
    with cd(env.dest): 
     sudo("rm -f local_settings.py") 
     sudo("ln -s conf/settings/%(label)s.py local_settings.py" % env) 

     sudo("rm -f conf/gunicorn/current.py") 
     sudo("ln -s %(label)s.py conf/gunicorn/current.py" % env) 

     sudo("rm -f celeryconfig.py") 
     sudo("ln -s conf/settings/celery/%(label)s.py celeryconfig.py" % env) 

     sudo("rm -f conf/supervisor/programs.ini" % env) 
     sudo("ln -s %(label)s.ini conf/supervisor/programs.ini" % env) 

def reload_processes(reload_type="soft"): 
    print(colors.yellow("Reloading processes.")) 

    env.label = env.host_string.replace("%(app)s-", "") 
    with cd(env.dest): 
     sudo("kill -HUP `cat /tmp/gunicorn.%(app)s.%(label)s.pid`" % env) 

def add_commit_sha(): 
    repo = git.Repo(".") 
    sha = repo.head.commit.hexsha 
    sed("{}/settings.py".format(env.dest), "^COMMIT_SHA = .*$", 'COMMIT_SHA = "{}"'.format(sha), backup="\"\"", use_sudo=True) 
+0

你能告訴我們你的結構文件嗎? –

回答

0

我使用這個模式,你在自己的任務,成立了分期/生產配置:

@task 
def stage(): 
    env.deployment_location = 'staging' 
    env.hosts = ['staging'] 

@task 
def prod(): 
    env.deployment_location = 'production' 
    env.hosts = ['prod1', 'prod2'] 

@task 
def deploy(): 
    require('deployment_location', used_for='deployment. \ 
    You need to prefix the task with the location, i.e: fab stage deploy.') 

    confirm("""OK. We're about to deploy to: 

    Location: {env.deployment_location} 

    Is that cool?""".format(env=env)) 

    # deployment tasks down here 

在這種情況下,你必須以類fab prod deploy說是確認消息部署到生產。

只要輸入fab deploy是一個錯誤,因爲deployment_location env變量未設置。

它並不防止總白癡,但它確實可以防止意外錯別字,並且迄今爲止它的效果很好。

+0

不錯,我不知道require(),現在看着它。問題:爲什麼你將結構函數定義爲芹菜任務?我已經嘗試了其他方法,但無法使其工作... – tzenderman

+0

對不起,他們不是Celery任務,Fabric有一個@task裝飾器來標記可以自行運行的任務: http ://fabric.readthedocs.org/en/1.7/api/core/decorators.html#fabric.decorators.task –

+0

有時我只想運行構建部分,或者只是部署部分(依此類推),並通過標記與@task我的功能可以。 –

0

我的意思是說。你可以刪除所有的ssh密鑰,並且每次都使用密碼。您也可以使用stdlib提示來詢問用戶是否意味着生產。您也可以讓某些用戶使用基本ACL寫入生產。有很多方法可以減緩部署過程,主要是歸結於你和你的開發人員所喜歡的。