1 votes

Ansible - Éviter les doublons entre les variables de groupe et d'hôte

Je suis nouveau dans l'utilisation d'ansible pour la gestion des serveurs et j'ai besoin d'aide pour gérer la définition des utilisateurs et des groupes en fonction de l'hôte et du groupe d'hôtes, avec un minimum de duplication et un maximum d'extensibilité.
(25 utilisateurs/20 groupes sur 50 hôtes, avec différents "sudo" et "appartenance à des groupes" à la fin).
L'idée est d'avoir :

  • "groups_vars" fichiers définissant les utilisateurs (liste ou hachage) à créer sur chaque hôte du groupe d'hôtes.
  • Les fichiers "host_vars" définissant les utilisateurs pour un hôte spécifique. (A la fin, j'aurai besoin de groupes imbriqués, plus que de fichiers host_vars spécifiques).

J'ai besoin que le contenu de ces "*_vars files" soit fusionné et non remplacé (je comprends comment fonctionne la "vars precedence") car je veux éviter la duplication des déclarations de l'utilisateur.
Pour y parvenir, j'ai utilisé la syntaxe de hachage dans les fichiers "*_vars" et défini "hash_behaviour=merge" dans /etc/ansible/ansible.cfg.
Voici mes fichiers :
Mon inventaire :

all:
  children:
    type_a:
      hosts:
        vm1:
        vm2:

Mon manuel de débogage :

- hosts: type_a
  tasks:
    - name: Debugging
      debug:
        msg: "{{ users }}"

group_vars/type_a.yaml :

users:
  user1:
    name: user1
  user2:
    name: user2

host_vars/vm1.yaml

users:
  user3_vm1_specific:
    name: user3_vm1_specific

A la fin, j'ai besoin des 3 utilisateurs sur "vm1" et seulement "user1" et "user2" sur "vm2" et ensuite j'utiliserai les variables pour la création de l'utilisateur. L'utilisation de l'option de fusion (qui sera dépréciée dans une nouvelle version d'ansible) fonctionne, mais ne semble pas être une bonne pratique.
J'ai cherché ici sur ServFault et sur d'autres sites web, et la plupart du temps, les solutions sont les suivantes :

  • pour dupliquer la définition de l'utilisateur (plus de 8 propriétés pour chaque utilisateur et trop de hostsgroup : inacceptable).
  • d'utiliser un autre nom pour la deuxième liste d'utilisateurs, puis d'assembler les deux en utilisant "{{ user_list1 + user_list2 }}".
    Pas très évolutif si l'on veut ajouter de nombreux groupes imbriqués. Vous devrez ajouter une liste de noms personnalisée à chaque fois. Il fait aussi des doublons si "host_vars" et "group_vars" ont le même utilisateur défini : il ne fusionne pas le contenu, mais le déclare deux fois avec un contenu différent à chaque fois.

Ma première solution fonctionne, mais en utilisant une option quasi obsolète. Alors quelles sont les meilleures pratiques pour gérer les vars dans ce genre de situation ? (J'ai déjà lu la documentation ansible sur les vars mais cela ne m'a pas vraiment aidé).

De plus, peut-être qu'une tour ansible ou un foreman pourrait résoudre ce problème ?

Salutations
M.

1voto

Tero Kilkanen Points 32968

Ansible Jinja2 dispose d'une combine() qui peut être utilisé pour fusionner deux dicts ensemble.

Dans votre cas, vous l'auriez fait :

group_vars/type_a.yaml

group_users:
  user1:
    name: user1
  user2:
    name: user2

host_vars/vm1.yaml

host_users:
  user3_vm1_specific:
    name: user3_vm1_specific

Et le manuel de débogage :

- hosts: type_a
  tasks:
    - name: Debugging
      debug:
        msg: "{{ group_users | combine(host_users) }}"

Je pense que le merge est dépréciée parce que c'est tout ou rien et qu'elle peut provoquer des effets secondaires indésirables.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X