Ich habe eine Vorlage in Ansible, um eine Konfigurationsdatei für Prometheus zu erstellen. Ich möchte Hosts dynamisch hinzufügen, indem ich die Variable verwende prometheus_hosts
. Diese Variable ist in host_vars für jeden Host definiert, aber Ansible hat wahrscheinlich ein Problem mit der Vorlage.
Die Variable wird wie folgt festgelegt:prometheus_hosts: [ host1, host2, host3 ]
Die Vorlage
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 %}
Der Fehler
fatal: [test-mw]: FEHLGESCHLAGEN! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible.parsing.yaml.objects.AnsibleUnicode-Objekt' hat kein Attribut 'name'"} zum erneuten Versuch verwenden Sie: --limit @/home/gitlab-runner/builds/xw_vGpUQ/0/ansible/middleware/middleware.retry
Haben Sie eine Idee, wie man das Problem beheben kann? Danke!
Antwort1
Im Ausdruck
{% for host in prometheus_hosts if host.name.startswith('edge') %}
"host" ist ein Eintrag aus der Liste "prometheus_hosts". Die Einträge in dieser Liste haben kein Attribut "name". Dies ist der Grund für den Fehler
"msg": "AnsibleUndefinedVariable: 'ansible.parsing.yaml.objects.AnsibleUnicode-Objekt' hat kein Attribut 'Name'
Es ist möglich,Testen von Zeichenfolgen. Zum Beispiel
{% for host in my_hosts %}
{% if host is regex('^edge(.*)$') %}