我很难让Ansible与YAML合并键和节点锚一起使用,并且想知道它们在不同文件中时是否可以工作,还有什么替代方法。
我试图定义默认数据结构(请参见vars/default/vars.yaml
),并将其合并到更具体的版本(请参见vars/specific/vars.yaml
),尽管这些文件位于不同的文件中:
例如
playbook/
├── my_playbook.yaml
├── tasks
│ └── example.yaml
└── vars
├── default
│ └── vars.yaml
└── specific
└── vars.yaml
重新创建此问题的文件的内容如下:
playbook / my_playbook.yaml
---
- hosts: "local"
tasks:
- include_tasks: "tasks/example.yaml"
playbook / tasks / example.yaml
- name: include default and specific
include_vars:
file: "{{item}}"
with_items:
- "default/vars.yaml"
- "specific/vars.yaml"
剧本/vars/default/vars.yaml
---
process_settings: &default_process_settings
kill_timeout: "10"
log_retention: "5"
retry_times: "3"
alert_email: "process.alert@testsite.com",
deploy_server: "http://testsite.com:8000"
剧本/vars/specific/vars.yaml
---
process_settings:
<<: *default_process_settings
heartbeat_rate: "5"
出现在此最后一个文件中的是 。当我运行剧本时:
ansible-playbook -i inventory playbook/my_playbook.yaml
我收到以下神秘错误:
TASK [include default and specific] ***********************************************************************************************
ok: [127.0.0.1] => (item=default/vars.yaml)
failed: [127.0.0.1] (item=specific/vars.yaml) => {"ansible_facts": {}, "ansible_included_var_files": [], "changed": false, "failed": true, "item": "specific/vars.yaml", "message": "Syntax Error while loading YAML.\n\n\nThe error appears to have been in 'True': line 4, column 9, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\n(could not open file to display line)\nexception type: <class
'yaml.composer.ComposerError'>\nexception: found undefined alias\n in \"<unicode string>\", line 4, column 9"}
似乎Ansible可以从不同的YAML文件中提取变量,但是使用节点锚点和合并键的YAML引用仅在同一文件中有效。从纯粹的YAML角度来看,我认为这足够合理。
我该如何使用它?还有另一种方法可以实现这一目标吗?
答案 0 :(得分:2)
我很难让Ansible与YAML合并键和节点锚一起使用,并且想知道它们在不同文件中时是否可以工作,还有什么替代方法。
合并键和节点锚不能在文件之间使用。它们仅在单个YAML文档中有用。
我收到以下神秘错误:
“例外:找到未定义的别名”似乎可以准确地描述问题。
谁能建议这是否/如何工作,或者是否有另一种方法可以实现这一目标?
您可以使用combine
过滤器:
process_settings: "{{ default_process_settings|combine({'heartbeat_rate': '5'}) }}"
相同,但也许更易于阅读(更容易编写,尤其是在您拥有多个键的情况下):
override_process_settings:
heartbeat_rate: "5"
process_settings: "{{ default_process_settings|combine(override_process_settings) }}"
答案 1 :(得分:1)
尽管merge key document并没有说出有关多个文档的任何信息
但是YAML specification is very explicit about the use of aliases:
别名节点使用文档中以前未出现的锚点是错误的
所以别名无效如果它在同一文件中,但是引用了另一个文档,并且您尝试引用另一个文件中的文档中的锚点,则该别名也无效