首页 > 解决方案 > Ansible 通过组变量循环到模板 prometheus.yml

问题描述

我正在尝试使用 jinja2 在使用 Ansible 的部署中模板化 prometheus.yml。

我有一个普罗米修斯服务器和 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 所需的代码有什么想法吗?提前致谢!

标签: ansiblejinja2prometheus

解决方案


这将比您预期的要复杂一些。

您首先需要获取一个独特的配置端口列表,供您的出口商循环使用。

然后对于每个端口迭代,您将需要选择配置了相应端口的导出器。

下面的解决方案结合了几个 ansible/jinja2 过滤器和概念。解释它们中的每一个都超出了这个单一的答案,您将不得不查看不同的文档才能更进一步。

注意-:不推荐在组名中使用破折号 ( )。您必须将它们替换为下划线 ( _)。我在我使用的测试库存中修复了该问题,并且该更改也反映在我下面的示例模板中。

{% 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 %}


推荐阅读