2015-03-19 110 views
3

我很努力地找出如何覆蓋Ansible模塊選項默認值,而無需用變量手動滾動它。更好的是,如果有一種方法可以覆蓋僅適用於一部分主機的模塊選項默認值。覆蓋Ansible模塊選項默認值

在情侶主機上說,Git可以在/bin/git處得到,如預期的那樣。在其他幾臺主機上,Git的地址是/usr/local/bin/git。如何覆蓋git模塊executable選項默認的後一組主機?

目前我設置一個主機組變量,如:

git_executable=/usr/local/bin/git 

,並使用它與default(omit)過濾到處git使用像這樣:

- git: "executable={{git_executable|default(omit)}} ..." 

所以它得到正確的覆寫主機在哪裏定義,並在其他方面被忽略。

executable可能不是最好的例子,因爲這可能是由PATH環境變量或其他東西控制。那麼一般情況下,我想爲一些主機重寫任何類型的模塊選項,但是否則會回到模塊默認值?

既然有對夫婦更多的在這樣的環境這樣的基本差異,這是相當繁瑣灑這種默認的使用查找變量遍佈以防萬一它被使用非默認安裝在主機上運行的地方。有沒有辦法做得更好?

回答

1

我不認爲有更好的選擇。模塊只知道你傳給他們的東西。除非您明確地將其作爲模塊參數傳遞,否則他們無法訪問全局變量,服務器事實或其他任何內容。

如果這真的很重要,你想投入一些時間,你可以創建自己的動作插件。 Action插件是本地動作,因此可以訪問Ansible runnerc類及其所有屬性,包括事實等。因此,您可以根據服務器事實處理默認參數或可執行檢測,然後以編程方式調用git或任何其他模塊。在我看來巨大的開銷,但這取決於觀點,並可能在你的目的是可行的。

雖然保重,行動插件是100%無證。 Ansible 2.0將在未來幾天發佈。他們聲稱100%向後兼容,但我不會感到驚訝,如果只有記錄的功能。

1

在這種特定的情況下,只要它在PATH或 '/ sbin目錄', '/ usr/sbin目錄',git.executable '在/ usr/local/sbin中',因爲它使用了basic.get_bin_path()

git模塊會發現它在更大的話題上,我個人會選擇你已經做過的事情。但是,如果你願意的話,另一個可能的破解就是[錯誤]使用include語句爲每個模塊創建一個包裝器,該包裝器提供某個變量所需的默認值。 很顯然,你必須在group_vars或host/role/... vars中自己指定路徑。或者在劇本的vars部分中定義的變量。

$ cat my_echo.yml 

- shell: "{{echo_exec}} '{{text}}'" 

$ cat playbook.yml 
- hosts: localhost 
    tags: so 
    gather_facts: False 
    vars: 
    echo_exec: echo 
    tasks: 
    - include: my_echo.yml text='some text' 
    changed_when: False 

- hosts: localhost 
    tags: so 
    gather_facts: False 
    vars: 
    echo_exec: printf 
    tasks: 
    - include: my_echo.yml text='some text' 
    changed_when: False 

$ ansible-playbook playbook.yml -t so -v 

PLAY [localhost] ************************************************************** 

TASK: [shell {{echo_exec}} '{{text}}'] **************************************** 
changed: [localhost] => {"changed": true, "cmd": "echo 'some text'", "delta": "0:00:00.003782", "end": "2015-03-20 17:45:58.352069", "rc": 0, "start": "2015-03-20 17:45:58.348287", "stderr": "", "stdout": "some text", "warnings": []} 

PLAY [localhost] ************************************************************** 

TASK: [shell {{echo_exec}} '{{text}}'] **************************************** 
changed: [localhost] => {"changed": true, "cmd": "printf 'some text'", "delta": "0:00:00.003705", "end": "2015-03-20 17:45:58.690657", "rc": 0, "start": "2015-03-20 17:45:58.686952", "stderr": "", "stdout": "some text", "warnings": []} 

PLAY RECAP ******************************************************************** 
localhost     : ok=2 changed=2 unreachable=0 failed=0 

$