Saya agak baru dalam ansible dan ingin menggunakan prometheus-grok-exporter (melalui peran ansible-grok-exporter) dengan konfigurasi khusus untuk semua node saya yang menjalankan aplikasi kaktus.

Inventaris saya seperti ini:

cacti_first ansible_host=192.168.50.50
cacti_second ansible_host=192.168.50.51

[group__cacti]
cacti_first
cacti_second

Di dalam group_vars/group__cacti saya ingin menambahkan sesuatu seperti ini:

---
prometheus_grok_services_template:
  - name: cacti_metrics
    config_version: 3
    input:
        type: file
        paths: 
        {% for cacti_dir in cacti_path %}
        - "{{cacti_dir}}/log/cacti.log"
        {% endfor %}
        readall: false
        extaConfigContinuesFromHere: true

Dan saya memiliki konfigurasi Host seperti ini: host_vars/cacti_first:

---
cacti_path:
 - /usr/share/cacti
prometheus_grok_services:
  - prometheus_grok_services_template

host_vars/cacti_second:

---
cacti_path:
 - /usr/share/cacti
 - /usr/share/cacti2
prometheus_grok_services:
  - prometheus_grok_services_template

Di dalam buku pedoman saya melakukan loop untuk prometheus_grok_services dan menggunakan data yaml untuk menyediakan layanan.

Sekarang - ini berfungsi selama saya tidak mencoba menggunakan loop di dalam group_vars/group__cacti. ansible-inventory melaporkan bahwa:

$ ansible-inventory -i hosts --list cacti_second
ERROR! Syntax Error while loading YAML.
  found character that cannot start any token

The error appears to be in '/home/bastion/ansible-playbooks/group_vars/group__cacti': line 8, column 10, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

        paths:
        {% for cacti_dir in cacti_path %}
         ^ here


Jadi, saya ingin bertanya - apakah diperbolehkan melakukan jinja loop untuk membangun yaml untuk vars grup? Apakah ini kesalahan sintaksis di pihak saya? Bagaimana saya harus membuat templatenya?

Saya ingin menghindari memindahkan blok ke Host vars (yang saya tahu berfungsi), sebagian besar karena itu adalah bagian besar dari kode (sekitar 2KB konfigurasi yaml) dan itu tidak seanggun menggunakan grup vars.

Terima kasih!

1
Adrian 2 Juni 2021, 15:15

2 jawaban

Jawaban Terbaik

Perbaiki group_vars. Sebagai contoh

shell> cat group_vars/group__cacti
---
prometheus_grok_services_template:
  - name: cacti_metrics
    config_version: 3
    input:
        type: file
        paths: "{{ paths_str|from_yaml }}"
        readall: false
        extaConfigContinuesFromHere: true
paths_str: |
  {% for cacti_dir in cacti_path %}
  - {{ cacti_dir }}/log/cacti.log
  {% endfor %}

Kemudian, buku pedoman

- hosts: group__cacti
  gather_facts: false
  tasks:
    - debug:
        msg: "{{ lookup('vars', item) }}"
      loop: "{{ prometheus_grok_services }}"

Memberi

ok: [cacti_first] => (item=prometheus_grok_services_template) =>
  msg:
  - config_version: 3
    input:
      extaConfigContinuesFromHere: true
      paths:
      - /usr/share/cacti/log/cacti.log
      readall: false
      type: file
    name: cacti_metrics
ok: [cacti_second] => (item=prometheus_grok_services_template) => 
  msg:
  - config_version: 3
    input:
      extaConfigContinuesFromHere: true
      paths:
      - /usr/share/cacti/log/cacti.log
      - /usr/share/cacti2/log/cacti.log
      readall: false
      type: file
    name: cacti_metrics
1
Vladimir Botka 2 Juni 2021, 15:09

Anda tidak dapat menggunakan loop for semacam ini dalam file variabel atau buku pedoman - ini hanya berfungsi di file template. Untuk mencapai apa yang Anda cari, Anda dapat menggunakan filter produk, seperti yang dijelaskan https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#products

Dalam contoh Anda, Anda akan memiliki:

---
prometheus_grok_services_template:
  - name: cacti_metrics
    config_version: 3
    input:
        type: file
        paths: "{{ cacti_path | product(['/log/cacti.log']) | map('join') | list }}"
        readall: false
        extaConfigContinuesFromHere: true
1
olambert 2 Juni 2021, 14:51