首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将嵌套字典保存为jinja2 ansible中的变量?

如何将嵌套字典保存为jinja2 ansible中的变量?
EN

Stack Overflow用户
提问于 2021-01-29 19:32:35
回答 1查看 253关注 0票数 1

我正试图为我们的ansible角色创建一个prometheus.yml.j2模板。这是一个变量:

代码语言:javascript
复制
SCRAPE_CONFIGS:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'postgresql'
    static_configs:
      - targets: ['postgresql-exporter:9187']

我试过:

代码语言:javascript
复制
scrape_config:
  {% for scrape in SCRAPE_CONFIGS -%}
    {{ scrape }}
  {% endfor %}

这是输出:

代码语言:javascript
复制
scrape_config:
  {'job_name': 'prometheus', 'static_configs': [{'targets': ['localhost:9090']}]}
  {'job_name': 'postgresql', 'static_configs': [{'targets': ['postgresql-exporter:9187']}]}

但是它应该看起来像变量本身:

代码语言:javascript
复制
  scrape_config:
    - job_name: 'prometheus'
      static_configs:
        - targets: ['localhost:9090']

    - job_name: 'postgresql'
      static_configs:
        - targets: ['postgresql-exporter:9187']

否则,prometheus容器将引发语法错误,因为它无法正确读取prometheus.yml配置文件。有没有人有更好的建议来迭代这个嵌套的二叉树呢?结构应保持不变。还应该可以使用更多的条目添加不同的scrape_configs,如:

代码语言:javascript
复制
- job_name: 'elasticsearch'
  scrape_intervall: 10s
  scrape_timeout: 5s
  static_configs:
    - targets: ['elasticsearch-exporter:9114']
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-29 20:44:29

为什么不直接使用set_fact来重新创建所请求的字典结构,然后使用过滤器to_yaml将整个过程转储为YAML

考虑到剧本:

代码语言:javascript
复制
- hosts: all
  gather_facts: no

  tasks:
    - set_fact:
        config: 
          scrape_config: "{{ SCRAPE_CONFIGS }}"
      vars:
        SCRAPE_CONFIGS:
          - job_name: 'prometheus'
            static_configs:
              - targets: ['localhost:9090']

          - job_name: 'postgresql'
            static_configs:
              - targets: ['postgresql-exporter:9187']

    - copy:
        content: "{{ config | to_yaml }}"
        dest: prometheus.yml.j2

这将创建一个包含以下内容的文件prometheus.yml.j2:

代码语言:javascript
复制
scrape_config:
- job_name: prometheus
  static_configs:
  - targets: ['localhost:9090']
- job_name: postgresql
  static_configs:
  - targets: ['postgresql-exporter:9187']

为了增加一个额外的元素,

代码语言:javascript
复制
- hosts: all
  gather_facts: no

  tasks:
    - set_fact:
        config: 
          scrape_config: "{{ SCRAPE_CONFIGS + elements_to_add }}"
      vars:
        SCRAPE_CONFIGS:
          - job_name: 'prometheus'
            static_configs:
              - targets: ['localhost:9090']

          - job_name: 'postgresql'
            static_configs:
              - targets: ['postgresql-exporter:9187']

        elements_to_add:
          - job_name: 'elasticsearch'
            scrape_intervall: 10s
            scrape_timeout: 5s
            static_configs:
              - targets: ['elasticsearch-exporter:9114']

    - copy:
        content: "{{ config | to_yaml }}"
        dest: prometheus.yml.j2

将创建一个包含以下内容的文件prometheus.yml.j2:

代码语言:javascript
复制
scrape_config:
- job_name: prometheus
  static_configs:
  - targets: ['localhost:9090']
- job_name: postgresql
  static_configs:
  - targets: ['postgresql-exporter:9187']
- job_name: elasticsearch
  scrape_intervall: 10s
  scrape_timeout: 5s
  static_configs:
  - targets: ['elasticsearch-exporter:9114']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65960671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档