Ansible: несколько файлов vars_files с одинаковой структурой yaml не объединяются - PullRequest
2 голосов
/ 05 августа 2020

У меня есть Ansible playbook, в котором используются два файла var; один для общих свойств, а другие для меня - c свойств. Однако есть некоторые свойства из обоих файлов, которые имеют одну и ту же структуру root YAML (aws.ec2), но когда я запускаю свою книгу воспроизведения, кажется, что свойства не объединяются в одно дерево, но последний указанный файл перезаписывает предыдущий для любых свойств, использующих aws.ec2.

Playbook

- name: Play 1. Create AWS Environment
  hosts: localhost

  vars_files:
    - var_files/aws_management_vars.yml
    - var_files/aws_general_vars.yml

aws_management_vars.yml

aws:
  ec2:
    node:
      name: "Management Node"
      instance_type: "t2.micro"
      ...

aws_general_vars.yml

aws:
  region: us-west-1
  ec2:
    env: mih-env
    vpc_id: vpc-abc12345
    ...

Когда я запустите мою книгу воспроизведения, если у меня есть файл vars в порядке здесь, он жалуется, что не может найти aws.ec2.node.

"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'node'

Если я поменяю порядок, он жалуется, что не может найти aws.region.

"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'region'

Это ограничение vars_files и есть ли что-то еще, что я могу использовать, чтобы анализировать файлы yml и объединять свойства, имеющие одинаковую структуру? Я знаю, что могу просто переименовать структуру в файлах, но я бы хотел, чтобы она оставалась такой, если это возможно.

Ansible v2.7.8

1 Ответ

0 голосов
/ 05 августа 2020

Q: «Это ограничение vars_files? Что я могу использовать для синтаксического анализа файлов yml и объединения свойств, имеющих одинаковую структуру?»

A: Да. Это ограничение vars_files. Можно контролировать, как переменные объединяются . См. DEFAULT_HASH_BEHAVIOUR . Но это не рекомендуется . Цитата: « Обычно мы рекомендуем не использовать этот параметр, если вы не думаете, что он вам абсолютно необходим. »

Существует простое решение. Используйте include_vars, поместите включенные данные в словари и combine их. Установите recursive=True, чтобы объединить ключи. Например,

    - include_vars:
        file: var_files/aws_management_vars.yml
        name: management
    - include_vars:
        file: var_files/aws_general_vars.yml
        name: general
    - set_fact:
        my_vars: "{{ management|combine(general, recursive=True) }}"
    - debug:
        var: my_vars.aws

give

  my_vars.aws:
    ec2:
      env: mih-env
      node:
        instance_type: t2.micro
        name: Management Node
      vpc_id: vpc-abc12345
    region: us-west-1

Q: « include_vars пожаловался, что его нельзя использовать на уровне playbook. Нужно ли мне добавить это в начало всех задач, выполняемых в playbook?"

A: Да. include_vars - это задача. Поместите его в топ задач. См. Приоритет переменных . include_vars (приоритет 18.) перезапишет переменные задач, блоков и ролей (17,16,15). Если поставить его в топ задач, то разницы между include_vars и vars_files (приоритет 14) практически нет. Как следствие, используйте include_role вместо role , если таковые имеются.

...