Ansible:使用节点锚点和合并键拆分成不同的Yaml文件

时间:2019-05-13 15:30:55

标签: ansible yaml node-anchor merge-key

我很难让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角度来看,我认为这足够合理。

我该如何使用它?还有另一种方法可以实现这一目标吗?

2 个答案:

答案 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

  

别名节点使用文档中以前未出现的锚点是错误的

所以别名无效如果它在同一文件中,但是引用了另一个文档,并且您尝试引用另一个文件中的文档中的锚点,则该别名也无效