Voilà la partie:
vars_files:
- vars/vars.default.yml
- vars/vars.yml
Si un fichier vars/vars.yml
n'existe pas - voici une erreur.
ERROR: file could not read: /.../vars/vars.yml
Comment puis-je charger des variables supplémentaires à partir de ce fichier uniquement s'il existe? (sans erreur)
Selon les développeurs d'Ansible , la bonne façon de résoudre ce problème est d'utiliser quelque chose comme:
De plus, ils disent :
la source
include_vars
dans la tâche donnera une priorité élevée des variables par rapport au rôledefaults
ouvars
J'ai rencontré ce problème dans une configuration où j'avais besoin de créer plusieurs environnements de déploiement (en direct, démo, bac à sable) sur le même serveur physique (pas de machines virtuelles autorisées ici), puis un script pour déployer des dépôts svn arbitraires
Cela nécessitait une arborescence de répertoires de fichiers variable.yml (facultatifs), qui fusionneraient les uns sur les autres et ne lèveraient pas d'exception le cas échéant
Commencez par activer la fusion de variables dans ansible - notez que cela fait une fusion de hachage peu profonde (1 niveau de profondeur) et une fusion profonde non récursive
ansible.cfg
Disposition de répertoire possible
rôles / déployer / tâches / inclut.yml
Il s'agit de la logique principale d'une arborescence de répertoires de fichiers variables facultatifs.
group_vars / all.yml
Configurer les variables par défaut pour le projet et divers utilisateurs et environnements
rôles / deploy / vars / main.yml
valeurs par défaut du projet
rôles / deploy / vars / project_1.yml
valeurs par défaut pour project_1
rôles / deploy / vars / live / main.yml
par défaut pour l'environnement en direct, remplace les valeurs par défaut du projet
rôles / deploy / vars / live / project_1.yml
substitutions finales pour project_1 dans l'environnement en direct
playbooks / demo.yml
Configurer des playbooks séparés pour chaque environnement
AVERTISSEMENT: étant donné que tous les environnements vivent sur un seul hôte, tous les playbooks doivent être exécutés individuellement, sinon Ansible tentera de manière irrégulière d'exécuter tous les scripts en tant que premier utilisateur de connexion ssh et n'utilisera que les variables pour le premier utilisateur. Si vous devez exécuter tous les scripts séquentiellement, utilisez xargs pour les exécuter chacun en tant que commandes distinctes.
la source
Remarque: Les tests de chemin (est un fichier, existe, ...) ne fonctionnent qu'avec des chemins absolus ou des chemins relatifs au répertoire de travail actuel lors de l'exécution de la commande ansible-playbook. C'est la raison pour laquelle nous avons utilisé la recherche. la recherche accepte les chemins relatifs au répertoire playbook et renvoie le chemin absolu lorsque le fichier existe.
la source
Ou d'une manière plus yaml:
Autrement dit, au lieu d'écrire un tableau sur une ligne avec des crochets, comme:
Utilisez la méthode yaml pour écrire des valeurs de tableau sur plusieurs lignes, comme:
Comme mentionné, cela recherche un fichier vars nommé
{{ ansible_hostname }}.yml
, et s'il n'existe pas, il utilisedefault.yml
la source
{{ ansible_hostname }}.yml
le nom de fichier au lieu de../path/to/file1
. À quoi ça sert? On peut ajouter un nombre illimité de noms de fichiers d'entrée.Assemblage de divers morceaux ensemble ... include_vars avec une clause when qui est vraie lorsque le fichier existe. c'est à dire
la source
Nouvelle réponse basée sur les dernières versions d'Ansible - en gros, vous devez utiliser
with_first_found
, ainsi queskip: true
pour ignorer la tâche si aucun fichier n'est trouvé.Cela vous évite d'avoir à avoir un fichier vars de secours dans cette liste.
Voir à ce sujet: /programming//a/39544405/100134
la source