Tengo una plantilla en Ansible para crear un archivo de configuración para Prometheus. Me gustaría agregar hosts dinámicamente, usando variables prometheus_hosts
. Esta variable está definida en host_vars para cada host, pero probablemente Ansible tenga algún problema con la plantilla.
La variable se establece como:prometheus_hosts: [ host1, host2, host3 ]
La plantilla
global:
scrape_interval: 15s
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
{% if prometheus_hosts is defined %}
{% for host in prometheus_hosts %}
- job_name: '{{ host }}'
scrape_interval: 5s
static_configs:
- targets: ['{{ host }}:9100']
{% endfor %}
- job_name: 'mysql'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9104']
- job_name: 'redis'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9121']
{% for host in prometheus_hosts if host.name.startswith('edge') %}
- job_name: '{{ host }}_varnish'
scrape_interval: 5s
static_configs:
- targets: ['{{ host }}:9131']
{% endfor %}
{% endif %}
El error
fatal: [prueba-mw]: ¡FALLÓ! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible.parsing.yaml.objects.AnsibleUnicode object' no tiene el atributo 'name'"} para volver a intentarlo, use: --limit @/home/gitlab- corredor/builds/xw_vGpUQ/0/ansible/middleware/middleware.retry
¿Tienes alguna idea de cómo solucionarlo? ¡Gracias!
Respuesta1
en la expresión
{% for host in prometheus_hosts if host.name.startswith('edge') %}
"host" es un elemento de la lista "prometheus_hosts". Los elementos de esta lista no tienen atributos "nombre". Esta es la razón del error.
"msg": "AnsibleUndefinedVariable: 'ansible.parsing.yaml.objects.El objeto AnsibleUnicode' no tiene el atributo 'nombre'
Es posible utilizarCadenas de prueba. Por ejemplo
{% for host in my_hosts %}
{% if host is regex('^edge(.*)$') %}