Ansible:使用节点锚和合并键在不同的YAML文件上分开



我很难与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"

playbook/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"

playbook/vars/exter/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.nnnThe error appears to have been in 'True': line 4, column 9, but maynbe elsewhere in the file depending on the exact syntax problem.nn(could not open file to display line)nexception type: <class 
'yaml.composer.ComposerError'>nexception: found undefined aliasn  in "<unicode string>", line 4, column 9"}

似乎Ansible可以从不同的YAML文件中获取变量,但是使用节点锚和合并键的YAML引用只有在同一文件中才能起作用。从纯粹的yaml角度来看,我想这足够合理。

我该如何工作?还有另一种可以实现此目标的方法吗?

我很难与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) }}"

虽然合并密钥文档没有对多个文档说什么

,但YAML规范对于使用别名非常明确:

别名节点使用以前在文档中不出现的锚点

因此,如果它在同一文件中,但请参考其他文件,并且您尝试在其他文件中的文档中引用锚点,因此这是无效的。

最新更新