我们在 Fabric 中定义一组角色 和 一组任务

env.roledefs = {
    'stock': ['10.10.1.3', '10.10.1.4','10.10.1.5','10.10.1.6'],
}

@roles('stock')
def uname():
    run('uname -r')

当我们只想在角色中的 10.10.1.3-4 这两台服务器中执行任务 uname 的时候,就需要用到 fabric 的 exclude 的用法了。

根据 Fabric 的官方文档,其中有两种用法,如下

  • 用法一
fab -R stock -x 10.10.1.3,10.10.1.4 uname

执行后,你会发现,其还是把 stock 这个角色中的所有服务器都执行了一遍

  • 用法二
fab uname:roles=stock,exclude_hosts="10.10.1.4;10.10.1.5"

这次执行后,发现按照我们的的实际需求,只在 10.10.1.3-4 这两台服务器执行了,这是为什么呢?

官方文档中对此有详细的描述,摘取的文字描述如下

Host exclusion lists, like host lists themselves, are not merged together across the different “levels” they can be declared in. For example, a global -x option will not affect a per-task host list set with a decorator or keyword argument, nor will per-task exclude_hosts keyword arguments affect a global -H list.

不详细翻译了,大概的意思就是当我们在任务上面先用角色对任务做了声明的话,即如下代码

@roles('stock')
def uname():
    run('uname -r')

使用用法一执行的话,exclude 不会生效,只有使用用法二才会生效。

所以要使用用法一的话,必须不能在任务上面用装饰器声明,代码应该如下:

def uname():
    run('uname -r')

yexiaobai
4.8k 声望875 粉丝

就是不告诉你 O(∩_∩)O哈哈~。


引用和评论

0 条评论