首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过组vars的不可用循环来模板prometheus.yml

通过组vars的不可用循环来模板prometheus.yml
EN

Stack Overflow用户
提问于 2021-03-01 20:06:31
回答 1查看 510关注 0票数 1

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

我有一个prometheus服务器和3个出口商。这是我的主机文件

代码语言:javascript
复制
[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

代码语言:javascript
复制
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

代码语言:javascript
复制
{% 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所需的代码有什么想法吗?提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-02 09:12:42

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

您首先需要获得唯一配置的端口列表,以供出口商循环使用。

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

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

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

代码语言:javascript
复制
{% 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 %}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66428925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档