通过组变量 Ansible 循环到模板 prometheus.yml
Ansible loop through group vars to templating 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 所需的代码有什么想法吗?提前致谢!
这会比您预期的要复杂一些。
您首先需要获得一个唯一配置的端口列表,供您的导出器循环使用。
然后对于每个端口迭代,您将需要select配置了相应端口的导出器。
下面的解决方案结合了几个 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 %}
我正在尝试使用 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 所需的代码有什么想法吗?提前致谢!
这会比您预期的要复杂一些。
您首先需要获得一个唯一配置的端口列表,供您的导出器循环使用。
然后对于每个端口迭代,您将需要select配置了相应端口的导出器。
下面的解决方案结合了几个 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 %}