无法在 Ansible Inventory 插件中使用 yaml 引用
Fail to use yaml reference in ansible inventory plugin
我想将此配置与库存插件一起使用
# test_inventory_xxx.yml
plugin: cloudscale # or openstack or ...
inventory_hostname: &inventory_hostname_value uuid
compose:
setting_of_inventory_hostname: *inventory_hostname_value
我没有收到任何错误,但未设置值。它是有效的 yaml。 (至少我的检查员和我自己都没有看到错误。
所以我决定使用标准的构造插件来简化它:
# inventory_constructed.yaml
plugin: constructed
# add variables to existing inventory
keyed_groups:
- key: from_inventory
prefix: inventory
parent_group: &common_parent_group test_group_1
compose:
var_from_constructed: 1233456789
also_from_constr: "'also'" # must be in quotes 2x!
some_from_constr: &ref1 1234567777
ref_from_constr: *ref1 # this works fine
ref_to_test: *common_parent_group # <--- this line returns an error
strict: yes
现在我得到错误:Could not set ref_to_test for host my_host: 'test_group_1' is undefined
但是当我取消注释标记的行时它通过了。 (ref &common_parent_group 仍被定义,但未与 *common_parent_group 一起使用。)为什么 test_group_1
在一种情况下未定义,但在另一种情况下未定义?
重现方式:ansible -i some_of/your_inventory -i inventory_constructed.yaml -m debug -a var=vars
我做错了什么?或者还有什么问题?
(我认为这是一个缺失的功能,所以 https://github.com/ansible/ansible/issues/69043 中的原始信息)
似乎 parent_group
采用文字字符串,而 ref_to_test
采用 Jinja2 表达式(因为它在 compose
之下)。如果你写
它应该以同样的方式失败
ref_to_test: test_group_1
因为 test_group_1
根本不是 Jinja2 变量。你必须写
ref_to_test: "'test_group_1'"
就像上面一样,所以 Jinja2 看到 'test_group_1'
这是一个文字字符串。这也意味着您不能使用别名,因为 parent_group
不会使用 Jinja2 评估其内容,因此不应在其内容中包含引号。
我想将此配置与库存插件一起使用
# test_inventory_xxx.yml
plugin: cloudscale # or openstack or ...
inventory_hostname: &inventory_hostname_value uuid
compose:
setting_of_inventory_hostname: *inventory_hostname_value
我没有收到任何错误,但未设置值。它是有效的 yaml。 (至少我的检查员和我自己都没有看到错误。
所以我决定使用标准的构造插件来简化它:
# inventory_constructed.yaml
plugin: constructed
# add variables to existing inventory
keyed_groups:
- key: from_inventory
prefix: inventory
parent_group: &common_parent_group test_group_1
compose:
var_from_constructed: 1233456789
also_from_constr: "'also'" # must be in quotes 2x!
some_from_constr: &ref1 1234567777
ref_from_constr: *ref1 # this works fine
ref_to_test: *common_parent_group # <--- this line returns an error
strict: yes
现在我得到错误:Could not set ref_to_test for host my_host: 'test_group_1' is undefined
但是当我取消注释标记的行时它通过了。 (ref &common_parent_group 仍被定义,但未与 *common_parent_group 一起使用。)为什么 test_group_1
在一种情况下未定义,但在另一种情况下未定义?
重现方式:ansible -i some_of/your_inventory -i inventory_constructed.yaml -m debug -a var=vars
我做错了什么?或者还有什么问题?
(我认为这是一个缺失的功能,所以 https://github.com/ansible/ansible/issues/69043 中的原始信息)
似乎 parent_group
采用文字字符串,而 ref_to_test
采用 Jinja2 表达式(因为它在 compose
之下)。如果你写
ref_to_test: test_group_1
因为 test_group_1
根本不是 Jinja2 变量。你必须写
ref_to_test: "'test_group_1'"
就像上面一样,所以 Jinja2 看到 'test_group_1'
这是一个文字字符串。这也意味着您不能使用别名,因为 parent_group
不会使用 Jinja2 评估其内容,因此不应在其内容中包含引号。