模仿YAML与ansible

Nic*_*kin 5 yaml jinja2 ansible

我需要模板化配置文件,该文件本身具有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
Run Code Online (Sandbox Code Playgroud)

应该定义大多数这些变量,并且一些变量需要非默认值.在变量和模板中都是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 %} 
Run Code Online (Sandbox Code Playgroud)
  • 这看起来很丑陋,打破了YAML格式.
  • 很多重复的代码

所以我考虑了另一种方法:将配置存储在变量中,然后通过jijna过滤器将其写入配置.

# 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 }}
Run Code Online (Sandbox Code Playgroud)

但是有负面影响:

  • 评论丢失了
  • 如果我只需要覆盖几个变量,我必须复制整个结构.(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 }}
Run Code Online (Sandbox Code Playgroud)

我目前正在考虑组合哈希/词典,但我仍然不知道如何/在何处定义组合词典.


UPD:到现在为止我设法做到了:

{{ tracks_database_defaults | combine(tracks_database_override, recursive=True) | to_nice_yaml }}
Run Code Online (Sandbox Code Playgroud)

但是对于安塞尔来说,它看起来很不寻常 而且还不方便.

小智 1

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

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

你选择了最好的选择。

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