2016-12-04 52 views
3

Ansible變量,例如:如何建立從字符串

我有變量{{ami_redhat_7_2}},我想用

vars: 
    OsType: redhat 
    OsVersion: '7_2' 

tasks: 
- debug: 'msg="{{ ami_{{OsType}}_{{ OsVersion }} }}"' 

我得到了錯誤:

fatal: [localhost]: FAILED! => { 
    "failed": true, 
    "msg": "template error while templating string: expected token 'end of print statement', got '{'. String: {{ ami_{{ OsType }}_{{ OsVersion }} }}" 
} 
+0

您是否嘗試過: - debug:msg =「{{vars [」ami_「〜OsType〜」_「〜OsVersion]}}」 – Shasha99

回答

10

「根'具有動態名稱的變量在Ansible中是一件棘手的事情。
如果他們是主人的事實,你可以像這樣訪問他們:

{{ hostvars[inventory_hostname]['ami_'+OsType+'_'+OsVersion] }} 

如果他們發揮綁定變量,您可以通過無證vars對象訪問它們:

{{ vars['ami_'+OsType+'_'+OsVersion] }} 

但他們絕不會獲取模板,因爲vars以特殊方式處理。

你最簡單的方法是一些字典與預定義的名稱和動態密鑰的名字,如:

ami: 
    redhat_7_2: 827987234/dfhksdj/234ou234/ami.id 

並訪問它,你可以使用:

{{ ami[OsType+'_'+OsVersion] }} 

附:並根據其他答案中的建議刪除msg左右的引號。

+1

FAQ:[如果您需要使用動態變量在適當時使用hostvars或vars字典](http://docs.ansible.com/ansible/faq.html#when-should-i-use-also-how-to-interpolate-variables-or-dynamic-variable名字),所以'vars'被記錄:-) – techraf

+0

它是如此令人討厭,它沒有更好的記錄。 – MMT