ansible - supprimer les fichiers non gérés à partir d'un répertoire?
Je veux récursive de copier un répertoire et rendre tous les .j2 fichiers là que les modèles. Pour cela, je suis actuellement en utilisant les lignes suivantes:
- template: >
src=/src/conf.d/{{ item }}
dest=/dest/conf.d/{{ item|replace('.j2','') }}
with_lines: find /src/conf.d/-type f -printf "%P\n"
Maintenant, je suis à la recherche d'un moyen de supprimer les fichiers non gérés à partir de ce répertoire. Par exemple si je veux supprimer un fichier/modèle de /src/conf.d/
je veux Ansible pour le supprimer de /dest/conf.d/
ainsi.
Est-il possible de faire cela? J'ai essayé de bidouiller avec rsync --delete
, mais là, j'ai eu un problème avec les modèles qui obtiennent leur suffixe .j2
supprimé.
Vous devez vous connecter pour publier un commentaire.
Je ferais comme ceci, en supposant une variable définie comme "managed_files' vers le haut de, qui est une liste de.
when: item|regex_replace('^(.*)\\.ext$', '\\1') not in managed_files
managed_files
basé sur un répertoire local, utilisezset_fact: managed_files="{{lookup('fileglob', 'conf.d/*').split(',') | map('basename') | list}}"
Nous le faisons avec nos nginx fichiers, car nous voulons qu'ils soient dans un ordre particulier, venez à partir de modèles, mais de supprimer non managés cela fonctionne:
Le truc (comme vous pouvez le voir), c'est que modèle et with_items ont des attributs différents dans le registre des résultats. Puis vous tournez dans une liste de fichiers, de gérer et d'obtenir ensuite une liste de l'annuaire et supprimé ceux qui ne sont pas dans cette liste.
Pourrait être fait avec moins de code si vous avez déjà une liste de fichiers. Mais dans ce cas, je suis de la création d'une liste indexée donc besoin de créer la liste fournie avec la carte.
ls -l
essayerfind {{ nginx_conf_dir }} -type f
au lieu de cela, dans ce scénarioJe veux partager mon expérience avec ce cas.
Ansible de 2.2 est a with_filetree boucle fournit un moyen simple de télécharger des répertoires, des liens, des fichiers statiques, et même (!) modèles. C'est la meilleure façon de garder ma config dir synchronisé.
Prochaine on peut vouloir supprimer des fichiers de config-dir. C'est simple.
Nous recueillons liste des fichiers téléchargés et il existe des fichiers sur le serveur distant, ensuite enlevez le diffrence.
Mais on peut vouloir avoir non les fichiers de config-dir.
J'ai utilisé
-prune
fonctionnalité defind
pour éviter la suppression de dossiers avec des fichiers non gérés.PS _(A)_ sûr après j'ai supprimé certains fichiers non gérés
Voici quelque chose que je suis venu avec:
Pros: Vous éviter de multiples 'sauté' entrées apparaître lors d'supprime.
Inconvénients: Vous aurez besoin de concaténer chaque template_results.résultats si vous voulez faire plusieurs modèle de tâches avant de faire la recherche/supprimer.
Il y a peut être un couple de façons de le gérer cela, mais serait-il possible de vider le répertoire cible dans une tâche avant le modèle de l'étape? Ou peut-être la chute de l'basées sur des modèles de fichiers dans un répertoire temporaire, puis supprimez+renommer dans une étape ultérieure?
Habituellement, je ne supprimez pas les fichiers, mais j'ai ajouter
-unmanaged
suffixe à son nom.Exemple ansible tâches:
EXPLICATION
Commande Grep utilise:
-r
à faire de la recherche récursive--include=\*.list
- seulement prendre des fichiersavec .liste d'extension au cours de la recherche récursive
-L '^# Ansible'
- affichage des noms de fichiers qui ne sont pas avoir de ligne commençant par '# Ansible'|| true
- ce est utilisé pour ignorer les erreurs. Ansible estignore_errors
fonctionne aussi mais avant d'en ignorant l'erreur ansible montrera en couleur rouge pendant ansible-playbook exécuterce qui est indésirable (au moins pour moi).
Puis-je enregistrer la sortie de la commande grep comme une variable. Lorsque grep affiche une sortie j'ai mis cette tâche que modifiée (la ligne
changed_when
est responsable de cette dernière).Dans la prochaine tâche que je itérer grep sortie (c'est à dire les noms de fichiers retournés par grep) et d'exécuter des commande renommer pour ajouter un suffixe à chaque fichier.
C'est tout. La prochaine fois que vous exécutez la commande première tâche devrait être de vert et de deuxième sauté.
Apparemment ce n'est pas possible avec ansible pour le moment. J'ai eu une conversation avec mdehaan sur IRC et elle se résume à l'ansible de ne pas avoir un graphe dirigé acyclique pour les ressources, de faire des choses comme ça très dur.
Demandant mdehaan pour un exemple, par exemple, avec autorité, la gestion d'un sudoers.d: répertoire, il est venu avec ces choses: