我需要模板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
应该定义大多数这些变量,有些需要非默认值。在变量和模板中都是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 %}
所以我考虑了另一种方法:将配置存储在变量中,然后将其写入配置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而言看起来很不寻常。而且还不方便。
答案 0 :(得分:1)
根据当前的变量管理行为和您的要求:
您选择了最佳选择。
另请注意,combine(..., recursive=True)过滤器和hash_behaviour=merge使用相同的merge_hash功能。
因此,它将简单地替换嵌套的标量或数组。