如何在Fabric文件中设置目标主机

109 投票
15 回答
67419 浏览
提问于 2025-04-15 19:40

我想用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

这样做的好处是,testprod 这两个函数可以在任何 fab 函数之前使用,而不仅仅是部署。这非常有用。

撰写回答