【问题标题】:Templating YAML with ansible使用 ansible 模板化 YAML
【发布时间】:2016-04-29 09:35:08
【问题描述】:

我需要模板一个 configuration file,它本身具有 YAML 格式。有什么好的做法吗?

最终文件如下所示:

development:
  adapter: mysql2
  database: tracks
  # set this if you are storing utf8 in your mysql database to handle strings
  # like "Réné". Not needed for sqlite. For PostgreSQL use encoding: unicode
  # encoding: utf8
  host: localhost
  username: root
  password: qwerty

这些变量中的大部分应该被定义,有些需要非默认值。它在 vars 和模板中都是 YAML。所以我必须至少重复两次几乎相同的结构:在模板和 vars 文件中。

一个真正的问题是可选参数。要设置正确的编码(或不设置),我必须编写如下内容:

# tasks/configure.yml
- include: {tracks_database}.yml

# variables/mysql2.yml
tracks_database_encoding: utf8

# templates/site.yml
development:
  database: "{{ tracks_database }}"
  {% if tracks_database_use_utf8 %}
  encoding: "{{ tracks_database_encoding }}"
  {% endif %} 
  • 这看起来很丑陋并且破坏了 YAML 格式。
  • 大量重复代码

所以我考虑了另一种方法:将配置原样存储在变量中,然后将其写入配置through a jijna filter

# group_vars/tracks.yml
tracks_database_settings:
  development:
    name: tracks
    adapter: mysql2
    host: localhost
    encoding: utf8
    username: root
    password: qwerty

# templates/site.yml
{{ tracks_database_settings | to_nice_yaml }}

但也有负面影响:

  • 评论丢失
  • 如果我只需要覆盖几个变量,我必须复制整个结构。 (hash_behaviour=merge 不是一个选项)。
  • 无法为不同的数据库类型和include预设变量。
  • 字典中的元素被重新排列(排序)。

有没有更好的模板化 YAML 文件的方法?完美的解决方案是这样的:

{{ tracks_database_default_settings_with_comments |
  with overriden values from group_vars/host_vars/whatever |
  with preset values from db-specific file |
  to_nice_yaml_with_comments }}

我目前正在查看combining hashes/dictionaries,但我仍然不知道如何/在哪里定义组合字典。


UPD:现在我设法做到了:

{{ tracks_database_defaults | combine(tracks_database_override, recursive=True) | to_nice_yaml }}

但对于 ansible 来说,它看起来真的很不寻常。而且还是不方便。

【问题讨论】:

    标签: yaml ansible jinja2


    【解决方案1】:

    根据当前变量管理行为和您的要求:

    • hash_behaviour=merge 不是一个选项
    • 不要在 var 和模板文件中重复自己

    您选择了最佳选项。

    另外,请注意combine(..., recursive=True) 过滤器和hash_behaviour=merge 使用相同的merge_hash 函数。
    因此,它将简单地替换嵌套的标量或数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多