2016-12-22 95 views
1

我有一個任務,我偶爾會喜歡在單個主機上運行(用於金絲雀測試部署)的@roles如何僅在單個主機上運行@角色裝飾的結構任務

from fabric.api import * 

env.roledefs = { 
    'web-workers': ['[email protected]', '[email protected]'], 
    'some-other-role': ['[email protected]'], 
} 

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

docs for @roles的規定:

...在命令行上禁止超馳,my_func,並將對將列出[中的作用]的主機來執行...

但我不能得到這裏提到的「覆蓋」功能工作...我試過了:

$ fab bogomips -H [email protected] 
$ fab bogomips -R some-other-role 

但它總是對裝飾者提到的整個角色執行...

我在這裏錯過了什麼?我如何覆蓋運行修飾任務的位置?

+0

對於它的價值,我遇到了同樣的行爲。當一個任務用角色('...')裝飾時,似乎忽略了--roles'標誌。例如,用'--roles = NOT_A_ROLE'試試你的代碼,它應該沒有任何錯誤。從任務中刪除@roles('...')裝飾器,它會拋出一個錯誤(角色不存在)。但至少角色標誌似乎在這種情況下工作。絕對不是文檔描述的行爲。 – YellowShark

回答

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變量,但就是這樣。
相關問題