再次介绍 Ansible 循环和模板

再次介绍 Ansible 循环和模板

我正在尝试设置一个剧本来概括日志文件集中化和模板的设置。我想通过通用模板使用 ansible vars 编写 rsyslog.d/ 配置文件。

变量:

  vars:
    loglist:
      - app_id: 'dsm'
        rsyslog_conf_file: '13-dsm.conf'
        ruleset: 'Centralize'
        logfiles:
          - name: /var/opt/ds_agent/diag/amEvent.log
            regex: 'zzz'
          - name: /XXXX/amEvent.log
            regex: 'xxx'
      - app_id: 'audit'
        rsyslog_conf_file: '06-auditd.conf'
        ruleset: 'Centralize'
        logfiles:
          - name: /var/log/audit/audit.log
            regex: ''

任务 :

  - name: Rsyslog logs config
    template:
      src: ./templates/rsyslog.d/99-generic-template.conf.j2
      dest: /tmp/{{ item.0.rsyslog_conf_file }}
      owner: root
      group: root
      mode: '0644'
    with_subelements:
      - "{{ loglist }}"
      - logfiles

模板:

{% for val in loglist | subelements('logfiles') %}

input(type="imfile"
    File="{{ val.1.name }}"
    Tag="{{ val.0.app_id }}__"
{% if val.1.regex|length %}
    startmsg.regex="{{ val.1.regex }}"
{% endif %}
    Ruleset="{{ val.0.ruleset }}"
    addMetadata="on")

{% endfor %}

我已经接近了,但是模板正在遍历整个列表,每次迭代所有日志文件名,而不是仅遍历当前项目。

结果是 2 个具有相同内容的文件:13-dsm.conf 和 06-auditd.conf:

input(type="imfile"
    File="/var/opt/ds_agent/diag/amEvent.log"
    Tag="dsm__"
    startmsg.regex="a"
    Ruleset="Centralizehorsprod"
    addMetadata="on")


input(type="imfile"
    File="/XXXX/amEvent.log"
    Tag="dsm__"
    startmsg.regex="X"
    Ruleset="Centralizehorsprod"
    addMetadata="on")


input(type="imfile"
    File="/var/log/audit/audit.log"
    Tag="audit__"
    startmsg.regex="hqhq"
    Ruleset="Centralizehorsprod"
    addMetadata="on")

预期结果是2个文件及其各自的日志文件名。

06-审计.conf

input(type="imfile"
    File="/var/log/audit/audit.log"
    Tag="audit__"
    startmsg.regex="hqhq"
    Ruleset="Centralizehorsprod"
    addMetadata="on")

和 13-dsm.conf

input(type="imfile"
    File="/var/opt/ds_agent/diag/amEvent.log"
    Tag="dsm__"
    startmsg.regex="a"
    Ruleset="Centralizehorsprod"
    addMetadata="on")


input(type="imfile"
    File="/XXXX/amEvent.log"
    Tag="dsm__"
    startmsg.regex="X"
    Ruleset="Centralizehorsprod"
    addMetadata="on")

谢谢

答案1

尝试这个

任务

  - name: Rsyslog logs config
    template:
      src: ./templates/99-generic-template.conf.j2
      dest: /tmp/{{ item.rsyslog_conf_file }}
    with_items:
    - "{{ loglist }}"

模板

{% for val in item.logfiles %}
input(type="imfile"
    File="{{ val.name }}"
    Tag="{{ item.app_id }}__"
{% if val.regex|length %}
    startmsg.regex="{{ val.regex }}"
{% endif %}
    Ruleset="{{ item.ruleset }}"
    addMetadata="on")
{% endfor %}

相关内容