2017-10-05 2 views
0

J'ai un modèle Jinja2 dans Ansible et j'ai besoin d'inclure certains fichiers sous condition. Fondamentalement, j'ai une boucle for qui inclut des "sous-parties" qui pourraient ou pourraient ne pas être présentes. L'exemple suivant illustre le code de base qui fonctionnerait si tous les outils avaient en fait un fichier « pbr.j2 », mais il se bloque parce que Ansible ne peut pas trouver certains fichiers:Ansible: Inclure un fichier s'il existe et ne rien faire s'il ne fonctionne pas

{% for tool in tools %} 
    {% set template = 'tools/' + tool.name + '/pbr.j2' %} 
    {% include template %} 
{% endfor %} 

J'ai aussi essayé le exists et is_file filtres, mais je reçois toujours "faux" même lorsque le fichier existe. Voici un exemple de code de ce que j'ai essayé:

{% for tool in tools %} 
    {% set template = 'tools/' + tool.name + '/pbr.j2' %} 
    {% if template|exists %} 
     {% include template %} 
    {% endif %} 
{% endfor %} 

Le résultat de ce dernier exemple est qu'aucun fichier n'est inclus. Si je remplace exists par is_file, j'ai le même comportement.

Que dois-je changer pour accomplir ce que je veux?

Répondre

0

Vous essayez d'utiliser des filtres Ansible (exists, is_file) dans un modèle Jinja2. Cela fonctionne pour les modèles traités par le moteur de modèle Ansible, mais pas pour les modèles traités par le module template.

Jinja2 n'a pas la capacité de vérifier l'existence d'un fichier, vous devez donc déplacer votre logique vers Ansible.

Par exemple: créer une find tâche de rechercher des répertoires dans tools/, et fournissent une intersection de find -Résultats liste avec tools liste Jinja2.

+0

J'ai vu que les filtres étaient censés être utilisés dans les fichiers .yml et je n'ai pas trouvé d'aide pour référencer les tests de fichiers dans les templates Jinja2, mais j'ai pensé qu'il y avait probablement des filtres simples pour accomplir ce que je veux mais ça n'a tout simplement pas été documenté. Je vais aller avec la route de tâche à la place et passer la liste au modèle Jinja2. Merci pour votre aide, j'apprécie vraiment! – Drizzt

1

J'ai trouvé une solution à mon problème: en utilisant ignore missing dans la directive include.

Dans ce cas, je voudrais utiliser:

{% for tool in tools %} 
    {% set template = 'tools/' + tool.name + '/pbr.j2' %} 
    {% include template ignore missing %} 
{% endfor %} 

Ansible ignorera les fichiers manquants et que les fichiers existants de cette boucle s'inclus.