ansible - 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 所需的代码有什么想法吗?提前致谢!
解决方案
这将比您预期的要复杂一些。
您首先需要获取一个独特的配置端口列表,供您的出口商循环使用。
然后对于每个端口迭代,您将需要选择配置了相应端口的导出器。
下面的解决方案结合了几个 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 %}
推荐阅读
- python - 如何在 python 中使用地理编码将新加坡的邮政编码转换为 lat lng?
- python - 从 pct_change 返回的动态时间窗口内的最大值
- json - 无法从 Angular 的 API 访问子接口数据。我究竟做错了什么?
- .net - 如何使用此示例在 .net MVC 2 中使用谷歌日历 API https://developers.google.com/calendar/quickstart/dotnet
- parallel-processing - Julia pmap:如何有效地将辅助函数发送给其他工作人员?
- android - android,,camera 无法在屏幕关闭或应用程序未聚焦在屏幕上时访问
- amazon-athena - 限制用户选择数据库的访问权限
- java - 关于“双重检查锁定”的另一个问题
- lua - 如何在 Lua 中存储特定值并检索连接?
- c# - 如何将 MySQL 数据库数据推送到 MVC .NET Web 应用程序