织物如何定义复杂的env.hosts

我正在为我的部署工具使用Fabric,并在多个主机上分发该命令。 但是我不知道如何在fabfile.py中定义一个复杂的主机

例如:我有4台服务器。 serverA,serverB,serverC,serverD

def prod(): env.hosts = ["serverA', "serverB" ] def dev(): env.hosts = ["serverC' "serverD"] def all(): prod() dev() 

我有可能在所有的主机上运行一个命令,而无需再次定义?

 EX: fab all {command} 

你可以看看为你的环境定义angular色 。

 from fabric.api import env, run from fabric.decorators import task env.roledefs = { 'prod': ['ServerA', 'ServerB'], 'dev': ['ServerC', 'ServerD'], 'envC': ['ServerE', 'ServerF'] } env.roledefs['all'] = [h for r in env.roledefs.values() for h in r] @task def hostname(): run('hostname -f') 

这将意味着你的意志现在必须发出你的结构调用像这样:

 fab -R prod hostname fab -R dev hostname fab -R all hostname fab -R dev,envC hostname 

感谢user76776很多的帮助。

其实我的主机configuration比较复杂一点。

 env.roledefs = { 'webA': ['ServerA', 'ServerB'], 'dbA': ['ServerC', 'ServerD'], 'webB': ['serverF', 'ServerK'], 'dbB': ['serverX', 'ServerV'] } env.roledefs['all'] = [h for r in env.roledefs.values() for h in r] 

webA和dbA是泰国的服务器(泰国的系统)webB和dbB是越南的服务器(越南的系统)

情况1:在所有服务器上执行一个命令(它是你的build议)

案例2:如何在所有WEB服务器(包括2个国家 – webA和webB)上执行命令? 情况3:我如何执行只有泰国的服务器(包括webA和dbA)的命令?

对不起,如果我的问题是坏的,因为我是新的面料。

非常感谢你的帮助。

另一种更dynamic的解决scheme…在fabfile中没有使用bash的静态configuration。

 mfab() { hosts=() while [ "$#" != 0 ]; do if [ "$1" = -- ]; then shift break fi hosts+=("$1") shift done list=$(echo "${hosts[@]}" | tr ' ' ',') fab -H "$list" "$@" } 

这里有一个方法可以让你的testing在运行之前运行:

 fab() { echo fab "$@"; } 

例1:使用shell扩展/ globbinb /任何你想使用的任意大小的列表

 mfab node{A..D}{01..05} -- example_command 

会运行一个像这样的命令:

 fab -H nodeA01,nodeA02,nodeA03,nodeA04,nodeA05,nodeB01,nodeB02,nodeB03,nodeB04,nodeB05,nodeC01,nodeC02,nodeC03,nodeC04,nodeC05,nodeD01,nodeD02,nodeD03,nodeD04,nodeD05 example_command 

例2:我刚部署了7台新机器,每台机器都有2台机器坏了,我想运行一个命令来检查/修复它。

 mfab node{100..106..2} -- example_command 

会运行一个像这样的命令:

 fab -H node100,node102,node104,node106 example_command 

示例3:更多选项包括--由织物本身使用:

 mfab node{01..10} -- -P -- uname -a