You need to enable JavaScript to run this app. Ansible结合Jinja2渲染Prometheus prometheus.yml模板的方法
优惠活动
大模型
产品
解决方案
定价
更多

Ansible结合Jinja2渲染Prometheus prometheus.yml模板的方法

可直接落地的Prometheus模板生成方案

前置参考:Ansible主机清单配置

按照你的环境划分,inventory配置参考如下,确保变量定义和分组匹配:

# /etc/ansible/hosts 配置参考
[prometheus-server]
promserver.domain.es

[prometheus-exporter]
exporter01 ansible_host=192.168.1.11 spring_port=[20001, 20002]
exporter02 ansible_host=192.168.1.12 spring_port=[20001, 20002]
exporter03 ansible_host=192.168.1.13 spring_port=[20001]

核心Jinja2模板实现

模板的核心逻辑是先全局去重所有Exporter节点开放的端口,再按端口维度筛选匹配的节点聚合到同一抓取任务,避免原来逐节点生成任务导致的同端口任务拆分问题。
完整的prometheus.yml.j2模板代码如下:

{%- set unique_ports = [] %}
{# 第一步:遍历所有Exporter节点,收集去重后的端口列表 #}
{%- for exporter_host in groups['prometheus-exporter'] %}
{%- for port in hostvars[exporter_host]['spring_port'] %}
{%- if port not in unique_ports %}
{%- set _ = unique_ports.append(port) %}
{%- endif %}
{%- endfor %}
{%- endfor %}

# 全局标准配置
global:
  scrape_interval: 15s
  evaluation_interval: 15s

# 内置自监控抓取任务
scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

{# 第二步:按去重后的端口逐个生成抓取任务,聚合所有匹配端口的节点 #}
{%- for port in unique_ports %}
  - job_name: "spring-actuator-{{ port }}"
    metrics_path: "/actuator/prometheus"
    scrape_interval: 5s
    static_configs:
      - targets:
{%- for exporter_host in groups['prometheus-exporter'] %}
{%- if port in hostvars[exporter_host]['spring_port'] %}
          - "{{ hostvars[exporter_host]['ansible_host'] }}:{{ port }}"
{%- endif %}
{%- endfor %}
        labels:
          app_group: "spring_service"
{%- endfor %}

配置输出效果验证

模板渲染后生成的内容完全匹配你的预期:

  • 20001端口对应的抓取任务会聚合3台Exporter节点的192.168.1.11:20001、192.168.1.12:20001、192.168.1.13:20001三个目标
  • 20002端口对应的抓取任务会聚合2台Exporter节点的192.168.1.11:20002、192.168.1.12:20002两个目标
  • 全局配置、Prometheus自监控配置会按标准格式生成,无需额外调整

落地注意事项

  • 模板中使用hostvars[exporter_host]['ansible_host']获取节点可被Prometheus访问的实际IP,如果你的环境支持主机名DNS解析,可直接替换为exporter_host变量值
  • 列表追加值时使用{% set _ = 列表.append() %}的写法,是为了规避Jinja2在循环内的作用域隔离问题,确保去重后的端口列表能被正确收集
  • 模板中使用{%- %}的裁剪语法自动移除多余空行,保证生成的YAML文件缩进符合Prometheus配置要求
  • 如果后续新增Exporter节点、调整开放端口,无需修改模板内容,只需要在主机清单里更新对应节点的spring_port变量,重新执行Ansible部署即可自动更新抓取配置

内容的提问来源于stack exchange,提问作者Javier Matos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 20:45:04