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)
所以我考虑了另一种方法:将配置存储在变量中,然后通过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
根据当前的变量管理行为和您的要求:
你选择了最好的选择。
另请注意,combine(..., recursive=True)过滤器和hash_behaviour=merge使用相同的merge_hash函数。
因此,它将简单地替换嵌套标量或数组。
归档时间: |
|
查看次数: |
3619 次 |
最近记录: |