如何在结构fi中设置目标主机

2024-05-20 12:11:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当我创建如Fabric docs所示的set_hosts()任务时,env.hosts设置正确。但是,这不是一个可行的选项,装饰器也不是。在命令行上传递主机最终会产生某种调用fabfile的shell脚本,我希望只有一个工具能够正确地完成这项工作。

它在Fabric文档中说“env.hosts只是一个Python列表对象”。从我的观察来看,这根本不是真的。

有人能解释这是怎么回事吗?如何设置要部署到的主机?


Tags: devenvwebhostserver部署defprod
3条回答

使用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'
...

这里有一个更简单的serverhorrors answer版本:

from fabric.api import settings

def mystuff():
    with settings(host_string='192.0.2.78'):
        run("hostname -f")

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

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函数之前使用,而不仅仅是部署。它非常有用。

相关问题 更多 >