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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我想使用Fabric将我的Web应用程序代码部署到开发,登台和生产服务器。我的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列表对象'。根据我的观察,这根本不是事实。

这里发生了什么?我如何设置主机部署?

提问于
用户回答回答于

使用roledefs

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'
...
用户回答回答于

为此,我为每个环境声明了一个实际函数。例如:

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函数可以在此之前使用。

扫码关注云+社区