Ansible任务失败,模板包含特殊字符

Ansible任务失败,模板包含特殊字符,ansible,jinja2,Ansible,Jinja2,我有一个logstash配置模板,通过组变量填充。而我添加了下面的grok模式 kv { source => "[message]" allow_duplicate_values => false remove_char_key => "\\\"" value_split => ":" field_split_pattern => "\," target =&

我有一个logstash配置模板,通过组变量填充。而我添加了下面的grok模式

 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将模板与列表元素中的可重放文件一起使用,它会抱怨!“不安全”适用于基于普通文件的模板。太好了,如果对您有效,请将答案标记为“解决方案”