Ansible 模板中的值替换
Value substitution in Ansible template
我正在编写 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
。所以模板如下:
{% for location in item %}
location {{ location['context'] }}
proxy_pass {{ location['server'] }}
{% endfor %}
我期待如下输出:
location /rest
proxy_pass http://localhost:8080
location /api
proxy_pass htpp://localhost:9090
但是我很难正确替换,谁能帮助指出我哪里出错了。
我得到的错误是
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"}
此时,由于 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 %}
你忽略了我关于你预期输出末尾缺少分号的问题,所以你自己处理吧。
我正在编写 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
。所以模板如下:
{% for location in item %}
location {{ location['context'] }}
proxy_pass {{ location['server'] }}
{% endfor %}
我期待如下输出:
location /rest
proxy_pass http://localhost:8080
location /api
proxy_pass htpp://localhost:9090
但是我很难正确替换,谁能帮助指出我哪里出错了。
我得到的错误是
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"}
此时,由于 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 %}
你忽略了我关于你预期输出末尾缺少分号的问题,所以你自己处理吧。