Fabric - 在生产部署上强制密码提示

时间:2013-07-30 22:45:55

标签: django fabric django-deployment

是否可以强制用户在部署到生产时输入密码?

我正在部署到staging,但意外地将CL上的标签点击到production,而且几乎犯了一个大错误!毋庸置疑,我永远不会再为fab ...使用自动完成功能了。

更新

以下是我们的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)

2 个答案:

答案 0 :(得分:0)

我是说是的。您可以删除所有ssh密钥并使其每次都使用密码。您还可以使用stdlib提示询问用户是否意味着生产。您也可以只使用基本ACL将某些用户写入生产。有许多方法可以减慢部署过程,这主要取决于您和您的开发人员更喜欢的内容。

答案 1 :(得分:0)

我使用这种模式,你可以在自己的任务中设置staging / prod配置:

@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变量。

它不会阻止完全愚蠢,但它确实可以防止意外的错别字,到目前为止它运作良好。