Ansible: использование якорей узлов и ключей слияния, разделенных на разные файлы yaml - PullRequest
0 голосов
/ 13 мая 2019

Мне трудно заставить 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"

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 / specific / vars.yaml

---
process_settings:
    <<: *default_process_settings
    heartbeat_rate:    "5"

Именно в этом последнем файле , кажется, вызывает проблему.Когда я запускаю playbook:

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 ]

2 голосов
/ 13 мая 2019

Мне трудно заставить 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 голос
/ 13 мая 2019

Хотя документ ключа слияния ничего не говорит о нескольких документах

Но спецификация YAML очень явно говорит об использовании псевдонимов :

Ошибка узла псевдонима использовать привязку, которая ранее не встречалась в документе

Таким образом, псевдоним недействителен , если он находится в том же файле, но ссылается на другой документ , и вы пытаетесь сослаться на привязку в документе в другом файле, так что это также недопустимо.

...