2016-03-12 32 views
0

所有文件被Ansible劇本只添加角色依存變量

# roles/a/defaults/main.yml 
test: Role A 

# roles/a/tasks/main.yml 
- name: Things I dont want to run 
    debug: msg="Not expected" 


# hosts 
host-1 host-1 ansible_connection=local test=Override 


# test.yml 
- hosts: all 
    roles: 
    - a # I only need the variable 
    tasks: 
    - name: action 
     debug: var=test # Expected Override 

我怎樣才能做到這一點?

我想過這個

roles/ 
    a-var # only include defaults variable definition 
    a # depends on a-var 
    b # depends on a-var, but do not run role a's task 

的繁瑣類,但我認爲這可能是唯一的方式來解決。

爲什麼我想這是我不希望用戶關心太多的文件(group_vars,host_vars,extra_vars),他們不知道可行的,我必須儘可能簡單地部署我們的系統,他們需要的唯一的東西在乎的是清單文件,這樣

host-1 
host-2 

[a] 
host-1 port=1234 

[b] 
host-2 # use default port defined in role 

[all:vars] 
install_path=/opt # override the default path 

但爲了加載變量是

  • 角色默認
  • 庫存瓦爾
  • 庫存group_vars
  • 庫存host_vars
  • 劇本group_vars
  • 劇本host_vars
  • 主機事實
  • 註冊瓦爾
  • set_facts
  • 發揮瓦爾
  • 發揮vars_prompt
  • 發揮vars_files
  • 角色,包括瓦爾
  • 塊瓦爾(僅適用於塊任務)
  • 任務瓦爾(僅適用於任務)
  • 額外的增值經銷商(總是贏優先)

這是很難爲這個組織,因爲我無法做到這一點,var文件將擊敗庫存配置。

- host: b 
    var_files: 
    # I hope this is just default and not take over inventory config 
    - roles/a/defaults/main.yml 
    tasks: 
    - debug: var=install_path # become default not custom's 

回答

3

我沒有看到你心中的計劃錯了。這確實很麻煩,但會起作用。

另一個想法是使用一個條件:

roles: 
    - role: a 
    when: False 

這不會執行任何裏面的角色a的任務,但它的增值經銷商和默認值進行評估,後來提供給其他角色。

這裏的醜陋之處在於,Ansible會將條件傳遞給角色的每個任務。它仍然會在輸出中顯示爲跳過的任務。


但只是爲了確保你瞭解default()過濾器:

你可以在你的模板或任務是這樣的:

{{ port | default(42) }} 

所以,如果端口是在庫存中定義文件將被使用。如果沒有定義,它將會是42.

你甚至可以把它和set_fact任務結合起來。

- set_fact: 
    port: "{{ port | default(42) }}" 

這是最乾淨的方式來做我認爲你的目標。

如果您有更多的變量,你需要一個默認值,你都可以做,在一個任務:

- set_fact: 
    port: "{{ port | default(42) }}" 
    install_path: "{{ install_path | default('/opt') }}" 
+0

我也得到了很多默認瓦爾像'A = 1,B =「{{ }}/{{a}}「',我會嘗試'when:False',並使用'default'過濾器替換一些默認值,謝謝。 – wener

+0

我可以在'角色依賴關係中執行'錯誤'嗎? – wener

+0

從來沒有嘗試過,但我不明白爲什麼這不應該工作。 – udondan