我正在尝试使用 ansible 将配置文件部署到数百台机器上,其中不同的机器将具有特定配置片段的多个迭代。具体来说,我正在使用 promtail 日志解析器,不同的机器将具有不同的日志文件位置,以使用不同的标签进行解析。理想情况下,我希望将 ansible 配置保持非常简单,这样我就可以使用拉取请求来更改各个部分。
最初我打算使用 group_vars,并在 group_var 中定义每个日志文件位置。只要我只构建一个日志位置,这种方法就没问题。一旦我需要多个日志位置,这种方法就失效了,因为我只能从 group_vars 返回一个值。
为了显示。
hosts:
LOGFILE1:
hosts:
app[15:16].qa2.example.com
LOGFILE2:
hosts
app[16:17].qa2.example.com
GROUP_VARS/LOGFILE1
GROUP_VARS/LOGFILE2
我可能只是希望遍历每个组,然后将输出附加到配置文件,但我没有看到使用模板函数执行此操作的方法。理想情况下,我可以遍历所有日志文件位置,但我不确定如何执行此操作。
或者也许我可以使用外部变量文件,然后使用某种条件来确定哪些主机获得哪些配置?
group_vars 中的数据相同……
file: /opt/tomcat/fxcts/logs/gxxss.log
comp: TX_Tomcat
app: TX
module: GXX
pipeline_regex: None
pipeline_vars:
- None
drop_expression: None
Multiline: None
这是 Jinja 模板
scrape_configs:
- job_name: {{ module }}
pipeline_stages:
- regex:
expression: {{ pipeline_regex }}
- labels:
{% for labels in pipeline_vars -%}
{{ labels }}:
{% endfor %}
{# This is a test #}
- timestamp:
source: date
format: 2006-01-01 15:00:00.000000
- drop:
expression: {{ drop_expression }}
- multiline:
firstline: ""
max_wait_time: 3s
static_configs:
static_configs:
- targets:
- localhost
labels:
app: {{ app }}
host: {{ ansible_hostname }}
component: {{ comp }}
__path__: {{ file }}
以下是实际 yaml 配置的示例。正如我所说,不同的日志位置可能因主机而异。
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://host:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
host: ${HOSTNAME}
__path__: /var/log/*log
- job_name: apps_ssi
static_configs:
- targets:
- localhost
labels:
job: ssi
host: ${HOSTNAME}
__path__: /opt/tomcat/ssi/logs/*log
- job_name: apps_fxcts
static_configs:
- targets:
- localhost
labels:
job: fxcts
host: ${HOSTNAME}
__path__: /opt/tomcat/fxcts/logs/*log
- job_name: journal
journal:
json: false
max_age: 12h
labels:
job: systemd-journal
host: ${HOSTNAME}
relabel_configs:
- source_labels: ['__journal__systemd_unit']
target_label: 'unit'
答案1
很抱歉,但这内容太多了,无法全部读完并完全理解,但本质上我知道您需要根据要解析的某些日志文件位置将不同的配置推送到不同的主机。
我对此的解决方案是 - 捕获所有这些 - 循环遍历您需要监控的所有路径promtail log parser
并相应地调整配置:
---
- name: "playbook to add specific config files"
hosts: localhost
tasks:
- name: Block for promtail log parser conf files
block:
- name: Check if log path exists
stat:
path: "{{ item.path }}"
register: reg_path
- name: Push conf file if path exists
template:
src: "{{ item.templ }}"
dest: "/etc/promtal/whatever.d/"
when: reg_path.stat.exists
loop:
- { name: 'syslog', path: '/var/log/syslog', templ: 'syslog.cong.j2'}
- { name: 'messages', path: '/var/log/messages', templ: 'messages.cong.j2'}
- { name: 'apache-acl', path: '/var/log/httpd/access.log', templ: 'apache-acl.cong.j2'}
此 YAML 代码尚未测试,并且 promtail 配置可能需要以不同的方式操作,但希望您明白我的意思。
答案2
再次,我不确定我是否完全理解,但如果 Roman 的答案不起作用,那么我建议使用主机变量在清单中的文件夹结构中,只需创建一个带有路径/标签映射的变量即可。然后,您可以在 jinja 模板中循环遍历该变量。
如果路径和主机的变化太多,考虑到机器数量,这不可行,那么我建议您尝试标准化位置/标签,或者使用除 promtail 之外能够处理丢失文件的工具。这样,您只需管理一个要抓取的大型日志列表,而不必担心更改任何内容。
我可以建议的最后一个选项是反转方法:找到一个允许您使用文件夹进行配置的工具,并为每个需要监视的工具放入文件。我的意思是您将有一个/etc/logscraper/conf.d
包含在配置中的文件夹。然后每个工具都会在里面创建一个文件/etc/logscraper/conf.d/10-tool.conf
,例如,它将定义如何解析日志。这样,您就可以使用工具本身而不是日志记录工具来部署它。这具有额外的好处,即将与产品/工具(例如 apache)相关的配置保留在部署产品的剧本中。