如何在Fabric文件中设置目标主机
我想用Fabric把我的网页应用代码部署到开发、测试和生产服务器上。我的fabfile如下:
def deploy_2_dev():
deploy('dev')
def deploy_2_staging():
deploy('staging')
def deploy_2_prod():
deploy('prod')
def deploy(server):
print 'env.hosts:', env.hosts
env.hosts = [server]
print 'env.hosts:', env.hosts
示例输出:
host:folder user$ fab deploy_2_dev
env.hosts: []
env.hosts: ['dev']
No hosts found. Please specify (single) host string for connection:
当我创建一个set_hosts()
任务,像在Fabric文档中展示的那样,env.hosts就能正确设置。不过,这种方法并不可行,装饰器也不行。通过命令行传递主机,最终会变成某种调用fabfile的shell脚本,我更希望有一个工具能把事情做好。
Fabric文档中说' env.hosts只是一个Python列表对象'。但根据我的观察,这根本不是真的。
有人能解释一下这是怎么回事吗?我该如何设置要部署的主机呢?
15 个回答
49
这是一个更简单的版本,来自于serverhorror的回答:
from fabric.api import settings
def mystuff():
with settings(host_string='192.0.2.78'):
run("hostname -f")
77
使用 角色定义
from fabric.api import env, run
env.roledefs = {
'test': ['localhost'],
'dev': ['user@dev.example.com'],
'staging': ['user@staging.example.com'],
'production': ['user@production.example.com']
}
def deploy():
run('echo test')
用 -R 选择角色:
$ fab -R test deploy
[localhost] Executing task 'deploy'
...
130
我通过为每个环境声明一个实际的函数来实现这个功能。例如:
def test():
env.user = 'testuser'
env.hosts = ['test.server.com']
def prod():
env.user = 'produser'
env.hosts = ['prod.server.com']
def deploy():
...
使用上面的函数,我会输入以下内容来部署到我的测试环境:
fab test deploy
...而以下内容则是部署到生产环境:
fab prod deploy
这样做的好处是,test
和 prod
这两个函数可以在任何 fab 函数之前使用,而不仅仅是部署。这非常有用。