1

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

我正在部署到staging,但不小心点击了 CL 上的选项卡production,几乎犯了一个巨大的错误!不用说,我永远不会再使用自动完成功能fab ...了。

更新:

下面是我们的 fabfile 的基本外观。每个主机,如application-stagingor application-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)
4

2 回答 2

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 环境变量。

它并不能防止完全的白痴,但它确实可以防止意外的拼写错误,并且到目前为止它运行良好。

于 2013-08-03T21:41:43.273 回答
0

我的意思是,是的。您可以删除他们所有的 ssh 密钥并让他们每次都使用密码。您还可以使用 stdlib 提示询问用户他们是否意味着生产。您还可以只让某些用户使用基本 ACL 写入生产环境。有多种方法可以减缓部署过程,主要取决于您和您的开发人员喜欢的方式。

于 2013-08-01T05:48:12.693 回答