Je travaille sur un projet, et nous utilisons ansible pour créer un déploiement d'un cluster de serveurs. L'une des tâches que je dois implémenter consiste à copier un fichier local sur l'hôte distant, uniquement si ce fichier existe localement. Maintenant j'essaye de résoudre ce problème en utilisant ceci
- hosts: 127.0.0.1
connection: local
tasks:
- name: copy local filetocopy.Zip to remote if exists
- Shell: if [[ -f "../filetocopy.Zip" ]]; then /bin/true; else /bin/false; fi;
register: result
- copy: src=../filetocopy.Zip dest=/tmp/filetocopy.Zip
when: result|success
Bu cela échoue avec le message suivant: ERREUR: l'attribut 'action' ou 'local_action' est manquant dans la tâche "copier local filetocopy.Zip sur distant s'il existe"
J'ai essayé de créer ceci si avec la tâche de commande. J'ai déjà essayé de créer cette tâche avec une action locale, mais je n'ai pas pu la faire fonctionner. Tous les échantillons que j'ai trouvés ne considèrent pas un Shell dans local_action, il n'y a que des échantillons de commande, et aucun d'eux n'a autre chose qu'une commande. Existe-t-il un moyen d'effectuer cette tâche en utilisant ansible?
Modifiez votre première étape comme suit sur
- name: copy local filetocopy.Zip to remote if exists
local_action: stat path="../filetocopy.Zip"
register: result
Une réponse plus complète:
Si vous souhaitez vérifier l'existence d'un fichier local avant d'effectuer une tâche, voici l'extrait complet:
- name: get file stat to be able to perform a check in the following task
local_action: stat path=/path/to/file
register: file
- name: copy file if it exists
copy: src=/path/to/file dest=/destination/path
when: file.stat.exists
Si vous souhaitez vérifier l'existence d'un fichier distant avant d'effectuer une tâche, voici la marche à suivre:
- name: get file stat to be able to perform check in the following task
stat: path=/path/to/file
register: file
- name: copy file if it exists
copy: src=/path/to/file dest=/destination/path
when: file.stat.exists
Si vous ne souhaitez pas configurer deux tâches, vous pouvez utiliser is_file pour vérifier si des fichiers locaux existent:
tasks:
- copy: src=/a/b/filetocopy.Zip dest=/tmp/filetocopy.Zip
when: '/a/b/filetocopy.Zip' | is_file
Le chemin est relatif au répertoire playbook, il est donc recommandé d'utiliser la variable magique role_path si vous faites référence à des fichiers dans le répertoire role.
Réf: http://docs.ansible.com/ansible/latest/playbooks_tests.html#testing-paths
Fileglob permet une recherche d'un fichier éventuellement présent.
- name: copy file if it exists
copy: src="{{ item }}" dest=/destination/path
with_fileglob: "/path/to/file"