我们在 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')
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。