Приведи пример Jinja2 шаблона в Ansible.

«Приведи пример Jinja2 шаблона в Ansible.» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Шаблон для генерации конфигурационного файла мониторинга 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'