我正在尝试使用jinja2在部署中使用Ansible来模板prometheus.yml。
我有一个prometheus服务器和3个出口商。这是我的主机文件
[prometheus-server]
promserver.domain.es
[prometheus-exporter]
exporter01.domain.es spring_port='["20001", "20002"]'
exporter02.domain.es spring_port='["20001", "20002"]'
exporter03.domain.es spring_port='["20001"]' 我的目标是得到一个像这样的prometheus.yml
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s)
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'Prometheus_Monitoring'
# Load and evaluate rules in this file every 'evaluation_interval' seconds.
rule_files:
- "alert.rules"
# A scrape configuration containing exactly one endpoint to scrape.
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 10s
static_configs:
- targets: ['promserver.domain.es:9090']
- job_name: 'spring-actuator-20001'
metrics_path: '/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['exporter01.domain.es:20001' , 'exporter02.domain.es:20001' , 'exporter03.domain.es:20001' ]
- job_name: 'spring-actuator-20002'
metrics_path: '/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['exporter01.domain.es:20002' , 'exporter02.domain.es:20002' ]我想部署prometheus模板prometheus.yml,所以我使用jinja2来使用下一段代码获得prometheus.yml.j2
{% for port in groups[prometheus-exporter.{{ spring_port }}] %}
- job_name: 'spring-actuator-{{ port }}'
metrics_path: '/prometheus'
scrape_interval: 5s
static_configs:
- targets: [{% for host in groups[prometheus-exporter] %}'{{ hostvars[host].inventory_hostname }}:{{ port }}'{{ '' if loop.last else ','}}{% endfor %}]
{% endfor %}但没有正常工作以获得预期的结果。
对于获得正确的prometheus.yml所需的代码有什么想法吗?提前感谢!
发布于 2021-03-02 09:12:42
这将比你预期的要复杂一些。
您首先需要获得唯一配置的端口列表,以供出口商循环使用。
然后,对于每个端口迭代,您将需要选择具有相应端口配置的出口商。
下面的解决方案结合了几个ansible/jinja2 2过滤器和概念。解释其中的每一个都超出了这个单一的答案,您必须查看不同的文档才能更进一步。
注意事项:不推荐在组名中使用破折号(-)。您必须用下划线(_)替换它们。我在我使用的测试清单中修正了这个问题,并且该更改也反映在下面的示例模板中。
{% set port_list = groups.prometheus_exporter | map('extract', hostvars) | selectattr('spring_port', 'defined') | map(attribute='spring_port') | flatten | unique | sort %}
{% for port in port_list %}
- job_name: 'spring-actuator-{{ port }}'
metrics_path: '/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['{{ groups.prometheus_exporter | map('extract', hostvars) | selectattr('spring_port', 'defined') | selectattr('spring_port', 'contains', port) | map(attribute='inventory_hostname') | map('regex_replace', '(^.*$)', '\g<1>:' + port) | join("', '") }}']
{% endfor %}https://stackoverflow.com/questions/66428925
复制相似问题