我在 Ansible 中有一个模板,用于为 Prometheus 制作配置文件。我想使用变量动态添加主机prometheus_hosts
。此变量在每个主机的 host_vars 中定义,但 Ansible 可能对模板存在一些问题。
变量设置如下:prometheus_hosts: [ host1, host2, host3 ]
模板
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 %}
错误
致命:[test-mw]:失败!=> {“changed”: false,“msg”:“AnsibleUndefinedVariable:'ansible.parsing.yaml.objects.AnsibleUnicode object'没有属性'name'”} 要重试,请使用:--limit @/home/gitlab-runner/builds/xw_vGpUQ/0/ansible/middleware/middleware.retry
您知道如何修复它吗?谢谢!
答案1
在表达式中
{% for host in prometheus_hosts if host.name.startswith('edge') %}
“host” 是列表“prometheus_hosts”中的一个项目。此列表中的项目没有属性“name”。这就是错误的原因
“msg”:“AnsibleUndefinedVariable:'ansible.parsing.yaml.objects.AnsibleUnicode 对象'没有属性'name'
可以使用测试字符串。 例如
{% for host in my_hosts %}
{% if host is regex('^edge(.*)$') %}