Ansible任务失败,模板包含特殊字符
我有一个logstash配置模板,通过组变量填充。而我添加了下面的grok模式Ansible任务失败,模板包含特殊字符,ansible,jinja2,Ansible,Jinja2,我有一个logstash配置模板,通过组变量填充。而我添加了下面的grok模式 kv { source => "[message]" allow_duplicate_values => false remove_char_key => "\\\"" value_split => ":" field_split_pattern => "\," target =&
kv {
source => "[message]"
allow_duplicate_values => false
remove_char_key => "\\\""
value_split => ":"
field_split_pattern => "\,"
target => "modsec"
remove_char_value => "\\\""
include_brackets => false
}
grok {
match => { "[modsec]{data}" => '\{%{GREEDYDATA:p_data}\}'}
remove_tag => ["_grokparsefailure"]
add_tag => ["modsec_audit"]
}
kv {
source => "p_data"
field_split => ":"
target => query
}
Ansible模板任务在线上失败
match => { "[modsec]{data}" => '\{%{GREEDYDATA:p_data}\}'}
如何逃过这条线
当我将'\{%{greedydydata:p_data}\}'
的值复制到ansible变量时,如下所示:-
logstash_grok_value: "'\'{%{GREEDYDATA:p_data}'\'}"
它出错为
“模板字符串时模板错误:应为标记名。字符串:”
当我在中使用转义字符而不是使用变量时
match => { "[modsec]{data}" => \'\\\{\%\{GREEDYDATA:p_data}\\\}\'}
它错误为
这个看起来很容易修理。似乎有一个价值开始了
带有引号,YAML解析器希望看到行结束
用同样的语录
我的logstash责任任务如下所示:-
- name: Create configuration files in conf.d
copy:
dest: "/etc/logstash/conf.d/{{ item.name }}.conf"
content: "{{ item.config }}"
owner: "{{ logstash_user }}"
group: "{{ logstash_group }}"
mode: 0755
with_items:
- "{{ logstash_input_output_config }}"
notify:
- Restart logstash
logstash_input_output_config包含以下详细信息:
日志存储\输入\输出\配置:
- name: mdg-config
config: |
### INPUTS ###
input {
kafka {
bootstrap_servers => "{{ logstash_kafka_hosts_list }}"
client_id => "{{ inventory_file | basename }}-wafnginx-audit"
topics => "topic-secaudit-nginx"
type => "topic-secaudit-nginx"
codec => json
fetch_max_bytes => "7242880"
}
filter {
if [type] == 'topic-seaudit-nginx' {
kv {
source => "[message]"
allow_duplicate_values => false
remove_char_key => "\\\""
value_split => ":"
field_split_pattern => "\,"
target => "modsec"
remove_char_value => "\\\""
include_brackets => false
}
grok {
match => "[modsec]{data}" => "\{%{GREEDYDATA:p_data}\}"
remove_tag => ["_grokparsefailure"]
add_tag => ["modsec_audit"]
}
}
}
预期结果是任务应该成功完成。您可以尝试添加不安全选项吗
logstash_grok_value: !unsafe '\{%{GREEDYDATA:p_data}\}'
注:
Ansible提供了一种内部数据类型,用于将变量值声明为“不安全”。这意味着变量值内的数据应视为不安全数据,以防止不安全的字符替换和信息泄露
Jinja2包含转义功能,或通过
{%raw%}等功能告诉Jinja2不要模板数据。。。{%endraw%}
,但是这使用了更全面的实现来确保该值永远不会被模板化。谢谢。在使用unsafe的上下文中,我受到限制,因为replacable数组/散列中有ansible变量
因此,我需要使用{%raw%}{%endraw%}或{{\“\}}
当我使用“{%raw%}{%endraw%}{%raw%}{%endraw%}{%raw%}{%endraw%}{%endraw%}{GREEDYDATA:p_data}{%raw%}{%endraw%}{%raw%}{%endraw%}{%endraw%}}{%endraw%}
它显示“{%{GREEDYDATA:p\u data}}”,而我只需要“{%{GREEDYDATA:p\u data}”
当我使用“{%raw%}{%endraw%}{%raw%}{%endraw%}{%raw%}%{%endraw%}{GREEDYDATA:p_data}}}}”时非常感谢。不安全的选择奏效了。当在多个项目的列表中使用时,会出现问题。当我们使用普通模板文件时,它工作得很好。例如,如果ansible将模板与列表元素中的可重放文件一起使用,它会抱怨!“不安全”适用于基于普通文件的模板。太好了,如果对您有效,请将答案标记为“解决方案”