Django的Fabric部署
项目描述
仓库
快速入门
有一个完整的示例: https://github.com/vmihailenco/fabdeploy-example。
创建 fabconf.py
from fabdeploy.api import DefaultConf
class BaseConf(DefaultConf):
django_dir = 'project_name'
class StagingConf(BaseConf):
address = 'user@staging-host.com'
class ProdConf(BaseConf):
address = 'user@prod-host.com'
创建 fabfile.py
from fabdeploy import monkey; monkey.patch_all()
from fabric.api import *
from fabdeploy.api import *; setup_fabdeploy()
@task
def user_create():
users.create.run()
ssh.push_key.run(pub_key_file='~/.ssh/id_rsa.pub')
@task
def deploy():
pass
Fabdeploy使用两个系统(Linux)用户
sudo_user 执行需要sudo权限的任务(默认为root)。
user 执行其他任务(默认为SSH用户)。
在Ubuntu中,默认禁用了root用户。您可以使用以下命令创建特殊的fabdeploy用户
fab fabd.default_conf:address=user@host,sudo_user=user fabd.create_user
然后您应该告诉fabdeploy使用新的sudo_user
class ProdConf(BaseConf):
sudo_user = 'fabdeploy'
可用任务列表
fab --list
可用变量列表
fab fabd.debug
这有助于测试配置
$ fab fabd.conf:prod fabd.debug:django_path /home/prj/src/prj
或
$ fab fabd.conf:prod fabd.debug:cpu_count 2
或
$ fab fabd.conf:prod fabd.debug:current_time 2011.11.27-13.40
要部署项目,您可以使用
$ fab fabd.conf:staging deploy $ fab fabd.conf:prod deploy
示例
控制日志存储位置
fabconf.py
from fabdeploy.api import DefaultConf
class ProdConf(DefaultConf):
my_task__log_path = '/var/log/my_task'
fabfile.py
from fabdeploy.api import Task
class MyTask(Task):
def do(self):
print self.conf.log_path
my_task = MyTask()
输出
$ fab fabd.conf:prod my_task /var/log/my_task
您也可以临时设置日志路径
$ fab fabd.conf:prod my_task:log_path='/var' /var
这对所有变量和所有任务都有效。
多个数据库
fabconf.py
from fabdeploy.api import DefaultConf
class ProdConf(DefaultConf):
# default DB
db_name = 'name1'
db_user = 'user1'
db_password = 'pass1'
# logging DB
loggingdb__db_name = 'name2'
loggingdb__db_user = 'user2'
loggingdb__db_password = 'pass2'
fabfile.py
from fabdeploy import postgres
@task
def dump_db():
postgres.dump.run() # dump default DB
postgres.dump.run(_namespace='loggingdb__') # dump logging DB
内置任务自定义
Fabdeploy被编写成高度可配置的。例如,有内置的tar任务,默认情况下会打包整个项目,上传到服务器并在那里解包。
但是您可以自由地使用它来上传自定义目录
from fabdeploy import tar
@task
def push_static():
tar.push.run(
src_dir=os.path.join(env.conf.django_ldir, 'static'),
target_dir=posixpath.join(env.conf.django_dir, 'static'))
开发和生产使用不同的数据库
fabconf.py
from fabdeploy import api
from fabdeploy.api import DefaultConf
class DevConf(DefaultConf):
address = 'user@localhost'
db = getattr(fabdeploy, 'mysql')
class ProdConf(DefaultConf):
address = 'user@localhost'
db = getattr(fabdeploy, 'postgres')
fabfile.py
@task
def execute():
print env.conf.db.execute
配置
有一些约定用于配置fabdeploy
您应该扩展DefaultConf
from fabdeploy.api import DefaultConf class BaseConf(DefaultConf): pass每个值都可以包含Python格式化
class BaseConf(DefaultConf): supervisor__log_dir = '%(var_dir)s/log/supervisor'远程路径应该有后缀_path。您可以使用任务fabd.mkdirs使用一条命令创建所有远程目录。它看起来像这样
$ fab fabd.conf:staging_conf fabd.mkdirs mkdir --parents /path/to/dir1 /path/to/dir2 /path/to/dir3
远程目录(例如var)有后缀_dir。
本地路径有后缀_lpath。本地目录有后缀_ldir。这类似于Fabric的cd和lcd任务。
目录(后缀_dir和_ldir)和路径(后缀_path和_lpath)可以是Python列表。这些列表将传递给os.path.join()或posixpath.join()。上一个示例可以看起来像这样
from fabdeploy.api import DefaultConf class BaseConf(DefaultConf): supervisor__log_dir = ['%(var_dir)s', 'log', 'supervisor']函数可以被conf装饰器装饰。例如,current_time任务看起来像这样
from fabdeploy.api import DefaultConf class BaseConf(DefaultConf): @conf def current_time(self): return datetime.datetime.utcnow().strftime(self.time_format)您可以在您的任务中这样使用它
from fabdeploy.api import Task class MyTask(Task): def do(self): puts(self.conf.current_time)您可以单独配置每个任务
class BaseConf(DefaultConf): postgres__db_name = 'postgresql_db' # module=postres mysql__db_name = 'mysql_db' # module=mysql mysql__create_db__db_user = 'root' # module=mysql, task=create_db
配置存储在任务实例变量self.conf中。每个任务都有自己的配置副本。配置变量将在以下位置搜索
任务关键字参数var(fab task:foo=bar);
任务实例方法var()装饰了@conf();
在env.conf中的键var,该键由fabd.conf任务填充;
使用fabric提示让用户提供变量var。
全局配置存储在env.conf中。
编写您的任务
您的任务是基于fabric类的类,除了fabdeploy为您管理配置
from fabric.api import puts
from fabdeploy.api import Task, conf
class MessagePrinter(Task):
@conf
def message(self):
if 'message' in self.conf:
return self.conf.message
return 'Hi!'
def do(self):
if self.conf.secret == '123':
puts(self.conf.message)
else:
puts('huh?')
message_printer = MessagePrinter()
然后您可以像这样运行此任务
$ fab message_printer > secret = 123 Hi! $ fab message_printer:message='Hello world!' > secret = 123 Hello world!
Fabfile示例
典型的fabfile可能看起来像这样
from fabdeploy import monkey; monkey.patch_all()
from fabric.api import *
from fabdeploy.api import *; setup_fabdeploy()
@task
def install():
users.create.run()
ssh.push_key.run(pub_key_file='~/.ssh/id_rsa.pub')
system.setup_backports.run()
system.install_common_software.run()
with settings(warn_only=True):
postgres.create_role.run()
postgres.create_db.run()
postgres.grant.run()
nginx.install.run()
for app in ['supervisor']:
pip.install.run(app=app)
@task
def setup():
fabd.mkdirs.run()
nginx.push_gunicorn_config.run()
nginx.restart.run()
supervisor.d()
@task
def deploy():
fabd.mkdirs.run()
release.create.run()
postgres.dump.run()
git.init.run()
git.push.run()
supervisor.push_configs.run()
django.push_settings.run()
gunicorn.push_config.run()
virtualenv.create.run()
virtualenv.pip_install_req.run()
virtualenv.pip_install.run(app='gunicorn')
virtualenv.make_relocatable.run()
django.syncdb.run()
django.migrate.run()
django.collectstatic.run()
release.activate.run()
supervisor.update.run()
supervisor.restart_program.run(program='celeryd')
gunicorn.reload_with_supervisor.run()
项目详情
django-fabdeploy-plus-0.4.tar.gz的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 2f3298ba344220f13f159721bdae3db2cac03f0713e901ef996515b64c80389f |
|
| MD5 | 76c76eb92334c5ebda69a5c7e3fe738c |
|
| BLAKE2b-256 | ae919791f2dfabd0d8ab4b7d81a04face710d48bb4147f89ca00ef25ec0a7ac8 |