Ansible 嵌套变量和 Jinja2 模板
Ansible Nested variables and Jinja2 templates
我想弄清楚为什么我的 jinja2 模板(以及 ansible 模板)无法在我的清单文件中找到我的变量。
这是我的清单文件:
all:
hosts:
test05:
ansible_host: 192.168.x.x
filebeat:
version: 7.15.2
applog:
- title: Separate Application Log Path with Tags
type: log
paths:
- /var/log/something/moresomething/current
tags: '["something", "application"]'
- title: Separate Application Log Path, with Tags, and "decode_json_fields" processor.
type: log
paths:
- /var/log/something/moresomething/blah-shell.log
tags: ["application", "something"]
fields: ["message"]
depth: 2
- title: Separate Application Log Path, with Tags, and Multiline fields
type: log
paths:
- /var/log/something/moresomething/production.log
tags: ["application", "something"]
multiline_type: pattern
multiline_patern: 'Started'
multiline_negate: true
multiline_match: after
然后争取拿到第一个称号。我正在执行以下操作:
- name: debugging
debug:
var: filebeat.applog.title
当我 运行 时,我最终得到 filebeat.applog.title: VARIABLE IS NOT DEFINED!
,我认为这很好,因为它不知道我想要什么标题。所以将其更改为
- name: debugging
debug:
var: filebeat.applog.0.title
我最终得到了我想要的filebeat.applog.0.title: Separate Application Log Path with Tags
。但是,如何在 jinja2 模板中使用它?
我有以下模板,我知道我需要更新它以遍历我库存中的不同项目。关于如何循环这个是另一个问题。
title: {{ filebeat.applog.title }}
- type: {{ filebeat.applog.type }}
enabled: true
paths:
- {{ filebeat.applog.path }}
tags: {{ filebeat.applog.tags }}
{% if filebeat.applog.fields is defined %}
processors:
- decode_json_fields:
fields: {{ filebeat.applog.fields }}
max_depth: {{ filebeat.applog.depth }}
target: {{ filebeat.applog.target | default "" }}
{% endif %}
{% if filebeat.applog.multiline_pattern is defined %}
multiline.type: {{ filebeat.applog.multiline_type }}
multiline.pattern: {{ filebeat.applog.multiline_pattern }}
multiline.negate: {{ filebeat.applog.multiline_negate }}
multiline.match: {{ filebeat.applog.multiline_match }}
{% endif %}
每次我得到以下结果,即使我确实在模板中使用了 {{ filebeat.applog.0.logtitle }}
:
fatal: [test05]: FAILED! => changed=false
msg: |-
AnsibleError: template error while templating string: expected token 'end of print statement', got 'string'. String: title: {{ filebeat.applog.title }}
- type: {{ filebeat.applog.type }}
enabled: true
paths:
- {{ filebeat.applog.path }}
tags: {{ filebeat.applog.tags }}
{% if filebeat.applog.fields is defined %}
processors:
- decode_json_fields:
fields: {{ filebeat.applog.fields }}
max_depth: {{ filebeat.applog.depth }}
target: {{ filebeat.applog.target | default "" }}
{% endif %}
{% if filebeat.applog.multiline_pattern is defined %}
multiline.type: {{ filebeat.applog.multiline_type }}
multiline.pattern: {{ filebeat.applog.multiline_pattern }}
multiline.negate: {{ filebeat.applog.multiline_negate }}
multiline.match: {{ filebeat.applog.multiline_match }}
{% endif %}
我不确定我遗漏了什么或做错了什么。我想我做错了,因为这是第一次做这样的事情。
因此您拥有的模板应该是:
- 有一个
for
循环来遍历 filebeat.applog
或
- 引用
filebeat.applog
的第 个 元素
除此之外,还有如下错误:
1.
target: {{ filebeat.applog.target | default "" }}
这是主要的,这就是错误消息所抱怨的,即 got 'string'
。 default
过滤器的正确用法是 {{ some_variable | default("") }}
.
2.
{% if filebeat.applog.multiline_pattern is defined %}
在清单中这个变量是 mis-spelled,即 multiline_patern
(缺少一个“t”)。在您的库存中修复此问题。
3.
when I do use {{ filebeat.applog.0.logtitle }}
in the template
这应该 {{ filebeat.applog.0.title }}
才能工作。
考虑到上述修复,循环遍历 filebeat.applog
的模板(如下所示)应该可以工作:
{% for applog in filebeat.applog %}
title: {{ applog.title }}
- type: {{ applog.type }}
enabled: true
paths: {{ applog.paths }}
tags: {{ applog.tags }}
{% if applog.fields is defined %}
processors:
- decode_json_fields:
fields: {{ applog.fields }}
max_depth: {{ applog.depth }}
target: {{ applog.target | default("") }}
{% endif %}
{% if applog.multiline_pattern is defined %}
multiline.type: {{ applog.multiline_type }}
multiline.pattern: {{ applog.multiline_pattern }}
multiline.negate: {{ applog.multiline_negate }}
multiline.match: {{ applog.multiline_match }}
{% endif %}
{% endfor %}
我想弄清楚为什么我的 jinja2 模板(以及 ansible 模板)无法在我的清单文件中找到我的变量。
这是我的清单文件:
all:
hosts:
test05:
ansible_host: 192.168.x.x
filebeat:
version: 7.15.2
applog:
- title: Separate Application Log Path with Tags
type: log
paths:
- /var/log/something/moresomething/current
tags: '["something", "application"]'
- title: Separate Application Log Path, with Tags, and "decode_json_fields" processor.
type: log
paths:
- /var/log/something/moresomething/blah-shell.log
tags: ["application", "something"]
fields: ["message"]
depth: 2
- title: Separate Application Log Path, with Tags, and Multiline fields
type: log
paths:
- /var/log/something/moresomething/production.log
tags: ["application", "something"]
multiline_type: pattern
multiline_patern: 'Started'
multiline_negate: true
multiline_match: after
然后争取拿到第一个称号。我正在执行以下操作:
- name: debugging
debug:
var: filebeat.applog.title
当我 运行 时,我最终得到 filebeat.applog.title: VARIABLE IS NOT DEFINED!
,我认为这很好,因为它不知道我想要什么标题。所以将其更改为
- name: debugging
debug:
var: filebeat.applog.0.title
我最终得到了我想要的filebeat.applog.0.title: Separate Application Log Path with Tags
。但是,如何在 jinja2 模板中使用它?
我有以下模板,我知道我需要更新它以遍历我库存中的不同项目。关于如何循环这个是另一个问题。
title: {{ filebeat.applog.title }}
- type: {{ filebeat.applog.type }}
enabled: true
paths:
- {{ filebeat.applog.path }}
tags: {{ filebeat.applog.tags }}
{% if filebeat.applog.fields is defined %}
processors:
- decode_json_fields:
fields: {{ filebeat.applog.fields }}
max_depth: {{ filebeat.applog.depth }}
target: {{ filebeat.applog.target | default "" }}
{% endif %}
{% if filebeat.applog.multiline_pattern is defined %}
multiline.type: {{ filebeat.applog.multiline_type }}
multiline.pattern: {{ filebeat.applog.multiline_pattern }}
multiline.negate: {{ filebeat.applog.multiline_negate }}
multiline.match: {{ filebeat.applog.multiline_match }}
{% endif %}
每次我得到以下结果,即使我确实在模板中使用了 {{ filebeat.applog.0.logtitle }}
:
fatal: [test05]: FAILED! => changed=false
msg: |-
AnsibleError: template error while templating string: expected token 'end of print statement', got 'string'. String: title: {{ filebeat.applog.title }}
- type: {{ filebeat.applog.type }}
enabled: true
paths:
- {{ filebeat.applog.path }}
tags: {{ filebeat.applog.tags }}
{% if filebeat.applog.fields is defined %}
processors:
- decode_json_fields:
fields: {{ filebeat.applog.fields }}
max_depth: {{ filebeat.applog.depth }}
target: {{ filebeat.applog.target | default "" }}
{% endif %}
{% if filebeat.applog.multiline_pattern is defined %}
multiline.type: {{ filebeat.applog.multiline_type }}
multiline.pattern: {{ filebeat.applog.multiline_pattern }}
multiline.negate: {{ filebeat.applog.multiline_negate }}
multiline.match: {{ filebeat.applog.multiline_match }}
{% endif %}
我不确定我遗漏了什么或做错了什么。我想我做错了,因为这是第一次做这样的事情。
因此您拥有的模板应该是:
- 有一个
for
循环来遍历filebeat.applog
或
- 引用
filebeat.applog
的第 个 元素
除此之外,还有如下错误:
1.
target: {{ filebeat.applog.target | default "" }}
这是主要的,这就是错误消息所抱怨的,即 got 'string'
。 default
过滤器的正确用法是 {{ some_variable | default("") }}
.
2.
{% if filebeat.applog.multiline_pattern is defined %}
在清单中这个变量是 mis-spelled,即 multiline_patern
(缺少一个“t”)。在您的库存中修复此问题。
3.
when I do use
{{ filebeat.applog.0.logtitle }}
in the template
这应该 {{ filebeat.applog.0.title }}
才能工作。
考虑到上述修复,循环遍历 filebeat.applog
的模板(如下所示)应该可以工作:
{% for applog in filebeat.applog %}
title: {{ applog.title }}
- type: {{ applog.type }}
enabled: true
paths: {{ applog.paths }}
tags: {{ applog.tags }}
{% if applog.fields is defined %}
processors:
- decode_json_fields:
fields: {{ applog.fields }}
max_depth: {{ applog.depth }}
target: {{ applog.target | default("") }}
{% endif %}
{% if applog.multiline_pattern is defined %}
multiline.type: {{ applog.multiline_type }}
multiline.pattern: {{ applog.multiline_pattern }}
multiline.negate: {{ applog.multiline_negate }}
multiline.match: {{ applog.multiline_match }}
{% endif %}
{% endfor %}