如何仅在单个主机上运行@角度装饰的结构任务

时间:2016-12-22 21:31:52

标签: python fabric

我有一个用@roles装饰的任务,偶尔我想在一个主机上运行(用于测试部署)。

from fabric.api import *

env.roledefs = {
    'web-workers': ['django@worker1', 'django@worker2'],
    'some-other-role': ['django@worker2'],
}

@task
@roles('web-workers')
def bogomips():
    run('uptime')

docs for @roles表示:

  

...禁止在命令行上覆盖,my_func将针对[在角色中]列出的主机执行...

但我不能让这里提到的“覆盖”功能起作用......我试过了:

$ fab bogomips -H django@worker2
$ fab bogomips -R some-other-role

但它总是在装饰器中提到的整个角色上执行......

我在这里缺少什么?如何覆盖运行@roles - 装饰任务的位置?

1 个答案:

答案 0 :(得分:2)

根据Execution model's Order of Precedence,这实际上是预期的行为,并且在这种情况下必须使用稍微不同的语法。

所以这里的命令不起作用:

$ fab bogomips -R some-other-role # fabric ignores the -R values!

以下是工作的版本:

$ fab bogomips:roles=some-other-role

问题在于:#308: @roles and @hosts decorators ignore command line options

文档:http://docs.fabfile.org/en/1.0.0/usage/execution.html#order-of-precedence

  
      
  • 每个任务,命令行主机列表(fab mytask:host = host1)完全覆盖其他所有内容。
  •   
  • 每个任务,装饰器指定的主机列表(@hosts('host1'))覆盖env变量。
  •   
  • 在fabfile中设置的全局指定的主机列表(env.hosts = ['host1'])可以覆盖在命令行上设置的此类列表,但前提是您不小心(或希望它们。)
  •   
  • 在命令行上设置的全局指定的主机列表(--hosts = host1)将初始化env变量,但就是这样。
  •   
相关问题