web-dev-qa-db-fra.com

Comment diviser le fichier `defaults / main.yml` d'un rôle ansible en plusieurs fichiers?

Dans certains rôles ansibles (par exemple roles/my-role/) J'ai de gros fichiers de variables par défaut (defaults/main.yml). Je voudrais diviser le main.yml dans plusieurs fichiers plus petits. Est-il possible de faire ça?

J'ai essayé de créer les fichiers defaults/1.yml et defaults/2.yml, mais ils ne sont pas chargés par ansible.

9
myrdd

La fonctionnalité que je décris ci-dessous est disponible depuis Ansible 2.6, mais a obtenu un correctif de bogue dans v2.6.2 et un autre (mineur) dans v2.7.
Pour voir une solution pour les anciennes versions, voir la réponse de Paul.


defaults/main/

Au lieu de créer defaults/main.yml, créez un répertoire - defaults/main/ - et placez tous les fichiers YAML dedans.

  • defaults/main.ymldefaults/main/*.yml

Ansible chargera tout *.yml fichier dans ce répertoire, vous pouvez donc nommer vos fichiers comme roles/my-role/defaults/main/{1,2}.yml.

Remarque, l'ancien fichier - defaults/main.yml - ne doit pas exister. Voir ce commentaire Github .


vars/main/

Soit dit en passant , la solution ci-dessus fonctionne également pour vars/:

  • vars/main.ymlvars/main/*.yml

plus de détails

La fonctionnalité a été introduite dans la v2.6 - git commit , Pull Request , principal problème Github .

Il y a eu deux corrections de bugs:

20
myrdd

Si vous n'utilisez pas 2.6 (ce que vous devriez probablement, mais je comprends que ce n'est pas toujours une option), alors vous pourriez trouver include_vars utile.

- name: Include vars of stuff.yaml into the 'stuff' variable (2.2).
  include_vars:
    file: stuff.yaml
    name: stuff

- name: Conditionally decide to load in variables into 'plans' when x is 0, otherwise do not. (2.2)
  include_vars:
    file: contingency_plan.yaml
    name: plans
  when: x == 0

- name: Load a variable file based on the OS type, or a default if not found. Using free-form to specify the file.
  include_vars: "{{ item }}"
  with_first_found:
    - "{{ ansible_distribution }}.yaml"
    - "{{ ansible_os_family }}.yaml"
    - default.yaml

- name: Bare include (free-form)
  include_vars: myvars.yaml

- name: Include all .json and .jsn files in vars/all and all nested directories (2.3)
  include_vars:
    dir: vars/all
    extensions:
        - json
        - jsn

- name: Include all default extension files in vars/all and all nested directories and save the output in test. (2.2)
  include_vars:
    dir: vars/all
    name: test

- name: Include default extension files in vars/services (2.2)
  include_vars:
    dir: vars/services
    depth: 1

- name: Include only files matching bastion.yaml (2.2)
  include_vars:
    dir: vars
    files_matching: bastion.yaml

Notez cependant qu'il s'agit d'une directive de tâche. Ce n'est pas aussi simple que de pouvoir l'inclure dans le fichier par défaut lui-même.

3
Paul Hodges