2017-06-06 75 views
0

我正在研究一個Ansible操作手冊,在模板中,我需要用一個字典列表來替換一個變量。Ansible模板中的值替換

任務文件如下:

vars: 
locations: 
    - context: "/rest" 
    server: "http://locahost:8080;" 
    - context: "/api" 
    server: "http://localhost:9090;" 
tasks: 
- name: testing the template 
    template: 
    src: ./conf.j2 
    dest: /tmp/test.conf 
    with_items: '{{ locations }}' 

我需要替換locations在模板中。因此,模板如下:

location /rest 
proxy_pass http://localhost:8080 

location /api 
proxy_pass htpp://localhost:9090 

,但我有在獲得替代正確的硬盤時,任何人可以在指出幫我在哪裏:

{% for location in item %} 
    location {{ location['context'] }} 
    proxy_pass {{ location['server'] }} 
{% endfor %} 

如下我所期待的輸出犯了錯誤。

我得到的錯誤是

failed: [127.0.0.1] (item={u'context': u'/rest', u'server': 
u'http://localhost:9090;'}) => {"failed": true, "item": {"context": 
"/rest", "server": "http://localhost:8080;"}, "msg": 
"AnsibleUndefinedVariable: 'context' is undefined"} 
failed: [127.0.0.1] (item={u'context': u'/api', u'server': 
u'http://locahost:8080;'}) => {"failed": true, "item": {"context": 
"/api", "server": "http://locahost:9090;"}, "msg": 
"AnsibleUndefinedVariable: 'context' is undefined"} 
+0

在標題和第一段中提到的「替代」到底在哪裏?我在這裏看不到任何替代品。另外,你得到了什麼結果,以及在你的預期結果中分號發生了什麼? – techraf

+0

抱歉,混亂,替換是在模板中。我在期待輸出如問題中提到的那樣,經過多次調整代碼後,我沒有得到正確的輸出。要麼執行中出現錯誤,要麼模板中的值不會被替換 – Bidyut

+0

根據SO規則,您應該發佈確切的錯誤消息或描述。在這種形式下,問題應該被關閉。 – techraf

回答

1

在這一刻,因爲with_items,要傳遞的locations列表中的單個元素,所以在第一次迭代,item成爲以下詞典:

context: "/rest" 
server: "http://locahost:8080;" 

然後在模板中,您嘗試將該詞典作爲列表迭代(使用for)。您需要決定是否要在模板外部(創建多個文件)或內部(創建單個文件)之外循環。

你的情況看起來像後者,所以你不需要使用with_items

- name: testing the template 
    template: 
    src: ./conf.j2 
    dest: /tmp/test.conf 

隨着模板:

{% for location in locations %} 
    location {{ location['context'] }} 
    proxy_pass {{ location['server'] }} 
{% endfor %} 

您在忽略我的問題有關缺少分號期望的輸出結束,所以你自己處理。