Ответ
Шаблон для генерации конфигурационного файла мониторинга Prometheus (prometheus.yml.j2):
# Ansible Managed File - Do not edit manually
global:
scrape_interval: {{ prometheus_scrape_interval | default('15s') }}
evaluation_interval: {{ prometheus_evaluation_interval | default('15s') }}
# Правила оповещений
rule_files:
- "rules/*.yml"
{% if enable_alerting %}
- "alerts/*.yml"
{% endif %}
# Конфигурация scrape-задач
scrape_configs:
# Статичная конфигурация для самого Prometheus
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Динамическая конфигурация через переменные Ansible
# Мониторинг Node Exporter на всех хостах из группы [monitored_servers]
- job_name: 'node'
static_configs:
- targets:
{% for host in groups['monitored_servers'] %}
- '{{ hostvars[host].ansible_host | default(host) }}:9100'
{% endfor %}
# Условное добавление задачи для мониторинга Kubernetes
{% if enable_kubernetes_monitoring %}
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
{% endif %}
# Внешний Alertmanager (конфигурируется условно)
{% if alertmanager_host is defined %}
alerting:
alertmanagers:
- static_configs:
- targets: ['{{ alertmanager_host }}:9093']
{% endif %}
Ключевые элементы Jinja2 в Ansible:
{{ variable }}— подстановка переменной.{{ variable | default('value') }}— фильтр с значением по умолчанию.{% if condition %} ... {% endif %}— условный блок.{% for item in list %} ... {% endfor %}— цикл для генерации конфигурации на основе данных инвентаризации.{# comment #}— комментарий (не показан в примере).
Использование в таске Ansible:
- name: Generate Prometheus configuration
ansible.builtin.template:
src: templates/prometheus.yml.j2
dest: /etc/prometheus/prometheus.yml
owner: prometheus
group: prometheus
mode: '0644'