(Liés à des rappels ou des points d' ancrage, et à une série de tâches réutilisables, dans des rôles Ansible ):
Y at-il un meilleur moyen d’ajouter à une liste ou d’ajouter une clé à un dictionnaire dans Ansible que (ab) en utilisant une expression de modèle jina2?
Je sais que tu peux faire quelque chose comme:
- name: this is a hack
shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"
mais n'y a-t-il vraiment aucune sorte de méta-tâche ou d'aide pour le faire?
Il se sent fragile, semble ne pas avoir de papiers d'identité et repose sur de nombreuses hypothèses sur le fonctionnement des variables dans Ansible.
Mon cas d'utilisation est constitué de plusieurs rôles (extensions de serveur de base de données) qui doivent chacun fournir une 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
doit apparaître sur une ligne cible:
shared_preload_libaries = 'bdr, pg_stat_statements'
Pour ce faire, Ansible peut-il simplement traiter le fichier de configuration plusieurs fois (une fois par extension) avec une expression rationnelle qui extrait la valeur actuelle, la analyse, puis la réécrit? Si oui, comment rend-on cet idempotent après plusieurs exécutions?
Que faire si la configuration est plus difficile à analyser que cela et si ce n'est pas aussi simple que d'ajouter une autre valeur séparée par des virgules? Pensez aux fichiers de configuration XML.
Réponses:
Vous pouvez fusionner deux listes dans une variable avec
+
. Disons que vous avez ungroup_vars
fichier avec ce contenu:Et il est utilisé dans un modèle
pgsql.conf.j2
comme:Vous pouvez ensuite ajouter des extensions aux serveurs de base de données de test de la manière suivante:
Lorsque le rôle est exécuté sur l'un des serveurs de test, les extensions supplémentaires sont ajoutées.
Je ne suis pas sûr que cela fonctionne également pour les dictionnaires, et que vous fassiez également attention aux espaces et en laissant une virgule au bout de la ligne.
la source
group_vars
, les rôles ne peuvent pas prendre en charge les détails de la configuration des extensions elles-mêmes. Il s'agit d'ajouter des variables à partir de rôles que je recherche particulièrement, afin qu'un rôle puisse être ajouté à un var exposé par un autre rôle.with_items
phrase.Depuis Ansible v2.x, vous pouvez faire ceci:
tout ce qui précède est documenté dans: http://docs.ansible.com/ansible/playbooks_filters.html
la source
u'(': u\"'\"}"
2.4.x
(FIXED)set_fact: my_dict_var: '{{my_dict_var|default({})|combine({item[0]: item[1]})}}'
. L'erreur non définie survient lorsqu'un filtrage est utilisé ou qu'aucun résultat n'est enregistré.vous devez diviser la boucle en 2
et addhost.yml
la source
Vous ne savez pas quand ils ont ajouté cela, mais au moins pour les dictionnaires / hachages (PAS les listes / tableaux), vous pouvez définir la variable hash_behaviour , comme ceci:
hash_behaviour = merge
dans votreansible.cfg
.Il m'a fallu plusieurs heures pour tomber par hasard sur ce réglage: S
la source
Presque toutes les réponses ici nécessitent des modifications dans les tâches, mais je devais fusionner de manière dynamique les dictionnaires dans la définition de vars, pas pendant l'exécution.
Par exemple, je veux définir des vars partagés dans
all
group_vars
puis je veux les étendre dans un autregroup
ouhost_vars
. Très utile lorsque vous travaillez pour des rôles.Si vous essayez d'utiliser le
combine
ou lesunion
filtres écrasant la variable d'origine dans les fichiers var, vous vous retrouverez avec une boucle infinie lors de la création de modèles. J'ai donc créé cette solution de contournement (ce n'est pas une solution).Vous pouvez définir plusieurs variables en fonction d'un modèle de nom, puis les charger automatiquement dans le rôle.
group_vars/all.yml
group_vars/group1.yml
extrait de code de rôle
do_some_stuff.yml
C'est juste un extrait, mais vous devriez avoir une idée de la façon dont cela fonctionne. remarque: la recherche ('varnames', '') est disponible depuis ansible 2.8
Je suppose qu'il serait également possible de fusionner toutes les variables
dictionary_of_bla.*
dans un dictionnaire lors de l'exécution à l'aide de la même recherche.L'avantage de cette approche est qu'il n'est pas nécessaire de définir des listes exactes de noms de variables, mais seuls le modèle et l'utilisateur peuvent le définir de manière dynamique.
la source
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 deapt
. La raison pour laquelle de plus en plus de logiciels offrent la possibilité de lire des extraits de configuration à partir d'unconf.d
répertoire est de permettre à ces systèmes d'automatisation d'avoir différents packages / rôles pour ajouter une configuration au logiciel. Je crois que ce n’est pas la philosophie deAnsible
faire ce que vous avez en tête, mais plutôt d’utiliser leconf.d
truc. Si le logiciel en cours de configuration n'offre pas cette fonctionnalité, vous risquez d'avoir des problèmes.Puisque vous parlez de fichiers de configuration XML, j'en profite pour me plaindre. Il existe une raison pour la tradition Unix d’utiliser des fichiers de configuration en texte brut. Les fichiers de configuration binaires ne se prêtent pas bien à l'automatisation du système. Par conséquent, tout type de format binaire vous causera des problèmes 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 aller faire examiner son cerveau.)
Maintenant, sur votre
PostgreSQL
problème spécifique .PostgreSQL
supporte leconf.d
truc. Tout d'abord, je voudrais vérifier sishared_preload_libraries
peut être spécifié plusieurs fois. Je n'ai trouvé aucune indication dans la documentation, mais je voudrais quand même l'essayer. S'il ne peut pas être spécifié plusieurs fois, j'expliquerai mon problème auxPostgreSQL
gars au cas où ils auraient des idées; c'est unPostgreSQL
problème et non unAnsible
problème. S'il n'y avait pas de solution et que je ne pouvais vraiment pas fusionner les différents rôles, je mettrais en place un système pour compiler la configuration sur l'hôte géré. Dans ce cas, je serais probablement créer un script/usr/local/sbin/update_postgresql_config
qui compilerait/etc/postgresql/postgresql.conf.jinja
dans/etc/postgresql/9.x/main/postgresql.conf
. Le script lirait les bibliothèques de préchargement partagées à partir de/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
exim4
paquet Debian .la source
conf.d
mécanisme d'inclusion et utilise heureusement les fichiers en texte clair. Cependant, il existe certaines options de configuration où plusieurs extensions peuvent avoir des opinions à ce sujet - par exemple, "augmenter max_wal_senders de 10 par rapport à ce qu'il était auparavant".