2016-02-12 72 views
3

Ansible版本:2.0.0.2Ansible可變優先哈希

我需要通過庫存主機變量覆蓋角色的默認變量。據我瞭解,在Ansible Docs中閱讀Variable Precedence: Where Should I Put A Variable?,這是可能的,但也許它不是一個最佳實踐,但不幸的是有些主機需要調整一些默認配置參數。

我要再現真實的情況下,讓我們考慮下面的目錄結構:

├── debug.yml 
├── host_vars 
│   └── test.localdomain 
├── inventory 
│   └── debug 
└── roles 
    └── debug 
     ├── tasks 
     │   └── main.yml 
     └── vars 
      └── main.yml 

debug.yml是我們的劇本文件。

--- 
- name: debug 
    hosts: debug 
    roles: 
    - debug 

host_vars/test.localdomain包含我想優先默認值的變量。

--- 
foo: 
    bar: 
    - hey 

庫存/調試是我們將要使用的清單文件。

[debug] 
test.localdomain 

角色/調試/任務/ main.yml打印出foo.bar變量。

--- 
- debug: msg="{{foo.bar}}" 

角色/調試/瓦爾/ main.yml包含默認角色的變量。

--- 
foo: 
    bar: 
    - hello 
    - world 

在這一點上,我希望劇本調試運行期間,foo.bar的值是[ "hey" ],但顯然我錯了:

> ansible-playbook debug.yml -i inventory/debug 

PLAY [debug] ********************************** 

TASK [setup] ********************************** 
ok: [test.localdomain] 

TASK [debug : debug] ************************** 
ok: [test.localdomain] => { 
    "msg": [ 
     "hello", 
     "world" 
    ] 
} 

PLAY RECAP ************************************* 
test.localdomain : ok=2 changed=0 unreachable=0 failed=0 

從運行調試模塊可靠的cli給了我預期的結果,所以我很確定主機變量的計算是正確的,但也許由於某些原因,它們並沒有優先於默認角色變量。

> ansible test.localdomain -i inventory/debug -m debug -a 'msg="{{foo.bar}}"' 
test.localdomain | SUCCESS => { 
    "msg": [ 
     "hey" 
    ] 
} 

我的錯誤在哪裏?

回答

11

問題是你沒有使用角色默認變量,而是角色變量。再看看從文檔列表:

  • 角色默認
  • 庫存瓦爾
  • 庫存group_vars
  • 庫存host_vars
  • 劇本group_vars
  • 劇本host_vars
  • 東道主的事實
  • 註冊瓦爾
  • set_facts
  • 發揮瓦爾
  • 發揮vars_prompt
  • 發揮vars_files
  • 作用,包括瓦爾
  • 塊瓦爾(僅適用於塊任務)
  • 任務瓦爾(只爲任務)
  • 額外變量

role-vars優先於host-vars。

role defaults需要存儲在目錄defaults。所以,只需將文件夾vars重命名爲defaults即可獲得預期的行爲。