47 votes

Ajouter à des listes ou ajouter des clés à des dictionnaires dans Ansible

(En lien avec Callbacks ou crochets, et séries réutilisables de tâches, dans les rôles Ansible):

Y a-t-il un moyen meilleur pour ajouter à une liste ou ajouter une clé à un dictionnaire dans Ansible que d'utiliser une expression de modèle jinja2?

Je sais que vous pouvez faire quelque chose comme:

- name: c'est une astuce
  shell: echo "{% originalvar.append('x') %}La nouvelle valeur de originalvar est {{originalvar}}"

mais n'y a-t-il vraiment pas une sorte de tâche ou aide pour le faire?

Cela semble fragile, semble être non documenté, et repose sur de nombreuses hypothèses sur le fonctionnement des variables dans Ansible.

Mon cas d'utilisation est plusieurs rôles (extensions de serveur de base de données) qui doivent chacun fournir une certaine configuration à un rôle de base (le serveur de base de données). Ce n'est pas aussi simple que d'ajouter une ligne au fichier de configuration du serveur de base de données; chaque changement s'applique à la même ligne, par exemple, les extensions bdr et pg_stat_statements doivent toutes deux apparaître sur une ligne cible:

shared_preload_libaries = 'bdr, pg_stat_statements'

Est-ce la méthode Ansible pour le faire de simplement traiter le fichier de configuration plusieurs fois (une fois par extension) avec une expression régulière qui extrait la valeur actuelle, l'analyse, puis la réécrit? Si oui, comment le rendre idempotent sur plusieurs exécutions?

Que se passe-t-il si la config est plus difficile à analyser et ce n'est pas aussi simple que d'ajouter une autre valeur séparée par des virgules? Pensez aux fichiers de configuration XML.

-5voto

Joe Bubna Points 253

Ansible est un système d'automatisation et, en ce qui concerne la gestion des fichiers de configuration, il n'est pas très différent d' apt. La raison pour laquelle de plus en plus de logiciels offrent la possibilité de lire des extraits de configuration à partir d'un répertoire conf.d est de permettre à de tels systèmes d'automatisation d'ajouter différentes configurations au logiciel. Je crois que la philosophie d' Ansible n'est pas de faire ce que vous avez en tête, mais plutôt d'utiliser l'astuce conf.d. Si le logiciel en cours de configuration ne propose pas cette fonctionnalité, vous pourriez rencontrer des problèmes.

Comme vous mentionnez les fichiers de configuration XML, je profite de l'occasion pour me plaindre. Il y a une raison pour laquelle la tradition Unix consiste à utiliser des fichiers de configuration en texte brut. Les fichiers de configuration binaires ne se prêtent pas bien à l'automatisation système, donc tout type de format binaire vous pose problème et vous obligera probablement à créer un programme pour gérer la configuration. (Si quelqu'un pense que XML est un format de texte brut, il devrait faire examiner son cerveau.)

Maintenant, concernant votre problème spécifique avec PostgreSQL. PostgreSQL prend en charge l'astuce conf.d. Tout d'abord, je vérifierais si shared_preload_libraries peut être spécifié plusieurs fois. Je n'ai trouvé aucun indice dans la documentation indiquant que c'est possible, mais je tenterais quand même. Si cela ne peut pas être spécifié plusieurs fois, j'expliquerais mon problème aux responsables de PostgreSQL au cas où ils auraient des idées ; cela concerne PostgreSQL et non Ansible. S'il n'y a pas de solution et que je ne peux vraiment pas fusionner les différents rôles en un seul, j'implémenterais un système pour compiler la configuration sur l'hôte géré. Dans ce cas, je créerais probablement un script /usr/local/sbin/update_postgresql_config qui compilerait /etc/postgresql/postgresql.conf.jinja en /etc/postgresql/9.x/main/postgresql.conf. Le script lirait les bibliothèques de préchargement partagé depuis /etc/postgresql/shared_preload_libraries.txt, une bibliothèque par ligne, et les fournirait à jinja.

Il n'est pas rare que les systèmes d'automatisation fassent cela. Un exemple est le paquet Debian exim4.

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