我正在为我的部署工具开发 Fabric,并在多个主机上分发命令。但我不知道如何在我的 fabfile.py 中定义复杂的主机
例如:我有 4 台服务器。服务器 A、服务器 B、服务器 C、服务器 D
def prod():
env.hosts = ["serverA', "serverB" ]
def dev():
env.hosts = ["serverC' "serverD"]
def all():
prod()
dev()
我是否可以在所有主机上运行命令而无需再次定义?
EX: fab all {command}
答案1
你可以看看定义角色适合您的环境。
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
答案2
一个更加动态的替代解决方案...使用 bash,fabfile 中没有静态配置。
mfab() {
hosts=()
while [ "$#" != 0 ]; do
if [ "$1" = -- ]; then
shift
break
fi
hosts+=("$1")
shift
done
list=$(echo "${hosts[@]}" | tr ' ' ',')
fab -H "$list" "$@"
}
这是一种让它进行试运行的方法...在测试之前运行它:
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 台新机器,但每台机器中就有一台出现故障,我想运行一个命令来检查/修复它。
mfab node{100..106..2} -- example_command
将运行如下命令:
fab -H node100,node102,node104,node106 example_command
示例 3:更多选项,包括--
Fabric 本身使用的选项:
mfab node{01..10} -- -P -- uname -a