结构部署到多个主机,每个主机都有自定义参数

2024-09-24 02:16:22 发布

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

我正在寻找一种在多个服务器上执行任务的方法(是的,我知道roledefs-R和hosts-H选项),但是我需要一些额外的参数,比如每个主机的不同用户等等,我想保持它的整洁,因为我保持我的主机作为函数的定义(如堆栈的某个地方建议的那样),以便能够在一个服务器上执行任务像这样

def test():
    user='root' 
    env.host='myapp-test.com'

我从修改开始环境任务但事实证明它们是由generator迭代的,通过context_manager访问它们只是为了查看(如fab docs)。在

我想保持“像主机一样的功能”,所以最后我修改了环境主机动态编写decorator,它根据当前的环境主机(将来将重写默认任务装饰器)下面的工作代码(出于安全原因,我不得不更改代码中的名称希望不会破坏任何功能):

^{pr2}$

我可以运行组执行任务fab live_服务器pull_提交,也可以运行单个fab live1 pull_提交。在

我知道也可能会有类似于任务重复的情况,使用单独的服务器fab live1 pull_committees live2 pull_committees,但我相信fabric是为具有不同应用程序和用户路径的分布式系统编写的

所以我的问题是:有没有更简单的方法?像是织物内置的东西(还有带额外dict键的roledefs对我不起作用)?或者我没有看到一些织物的功能? 我想保留这个简单的单/多主机部署命令,比如:fab live_servers pull-committes,fab-test-pull-committes


Tags: 方法代码用户test功能服务器live环境
1条回答
网友
1楼 · 发布于 2024-09-24 02:16:22

与其使用当前的方法,不如考虑使用host_string作为ARG服务器字典的键,然后根据需要在任务中加载信息(包括对fabric环境的任何必需更新)。进行这种调整意味着你也应该能够让角色发挥作用。在

例如:

@task
def pull_commits():
    hostinfo = ARG_SERVERS[env.host_string]
    # ... more code
    run(...)

另一个建议是考虑使用ssh配置文件(~/.ssh/config)为所有机器定义ssh别名。这会将所有主机/主机的字符串/用户名信息放在一个中心位置,这样您就可以用一个有意义的名称来引用主机,并简化ARG_服务器。在

^{pr2}$

根据更传统的结构任务模型,您现在应该能够执行以下操作:

# single host
$ fab -H live1 pull_commits

# multiple hosts
$ fab -H test,staging pull_commits

或角色(根据结构文档)。在

相关问题 更多 >