Ansible 변수 템플릿 문제

Ansible 변수 템플릿 문제

Prometheus용 구성 파일을 만들기 위한 템플릿이 Ansible에 있습니다. 변수를 사용하여 호스트를 동적으로 추가하고 싶습니다 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": "AnsibleUndefineVariable: 'ansible.parsing.yaml.objects.AnsibleUnicode object' has no attribute 'name'"} 재시도하려면 다음을 사용하세요. --limit @/home/gitlab- 러너/빌드/xw_vGpUQ/0/ansible/middleware/middleware.retry

문제를 해결하는 방법을 알고 있나요? 감사합니다!

답변1

표현에서는

 {% for host in prometheus_hosts if host.name.startswith('edge') %}

"host"는 "prometheus_hosts" 목록의 항목입니다. 이 목록의 항목에는 "이름" 속성이 없습니다. 이것이 오류의 원인입니다

"msg": "AnsibleUndefineVariable: 'ansible.parsing.yaml.objects.AnsibleUnicode 객체'에 'name' 속성이 없습니다.


사용이 가능합니다문자열 테스트. 예를 들어

{% for host in my_hosts %}
{% if host is regex('^edge(.*)$') %}

관련 정보