2016-12-16 57 views
1

我正在編寫一個Ansible角色,可用於不同的Linux操作系統系列,並且每個操作系統系列的變量具有不同的默認值。定義Ansible變量的角色與操作系統特定的默認值,可以輕鬆覆蓋

起初,我認爲這將是很容易建立使用包括瓦爾中的角色任務,如:

- name: Gather OS family variables 
    include_vars: "{{ ansible_os_family|lower }}.yml" 

my_role_variable: "Here is the default for Enterprise Linux" 

myrole/vars/redhat.yml

my_role_variable: "Here is the default for Debian Linux" 

in myrole/vars/debian.yml

但是,就我而言,使用角色的劇本能夠輕鬆覆蓋默認值是非常重要的。

所以,我試圖找出一種方法來爲每個OS系列的變量設置不同的默認值,如上所述,但我希望變量是角色默認變量而不是角色包含變量。有沒有辦法做到這一點?

回答

3

使用​​:

- name: Gather OS family variables 
    include_vars: "{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml" 

這樣,如果變量override_os_family定義,你的表情就會有它的價值,如果沒有,它會使用的ansible_os_family值。


實施例:

--- 
- hosts: localhost 
    connection: local 
    tasks: 
    - debug: msg="{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml" 

- hosts: localhost 
    connection: local 
    vars: 
    override_os_family: Lamarck 
    tasks: 
    - debug: msg="{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml" 

結果(摘錄):

... 

TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "msg": "darwin.yml" 
} 

... 

TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "msg": "lamarck.yml"