Copier le fichier local s'il existe, en utilisant l'option
je suis sur un projet, et nous utilisons ansible pour créer un déploiement d'un cluster de serveurs. Une des tâches que je dois implémenter, est de copier un fichier local sur l'hôte distant, seulement si ce fichier existe localement. Maintenant j'essaie 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
mais ceci ne fonctionne pas avec le message suivant: Erreur: attribut' action 'ou' local_action ' manquant dans la tâche "copie locale filetocopy.zip à distance s'il existe"
j'ai essayé de créer ce si avec 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 le 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 rien d'autre qu'une commande. Est-il un moyen d'effectuer cette tâche à l'aide d'ansible?
5 réponses
changez votre premier pas dans ce qui suit sur
- name: copy local filetocopy.zip to remote if exists
local_action: stat path="../filetocopy.zip"
register: result
je sais que cette question a déjà été répondue mais je suis tombé sur la même question ce matin et j'ai pensé que je pourrais poster une réponse plus complète pour la référence future.
si vous voulez 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
EDIT : si vous voulez vérifier l'existence d'un distance fichier (comme je l'ai fait), c'est la voie à 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 voulez pas configurer deux tâches, vous pouvez utiliser is_file pour vérifier si les 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, donc l'utilisation de la variable magique role_path est recommandée si vous faites référence à des fichiers à l'intérieur du répertoire role.
Réf: http://docs.ansible.com/ansible/latest/playbooks_tests.html#testing-paths
Fileglob permet de rechercher un fichier éventuellement présent.
- name: copy file if it exists
copy: src="{{ item }}" dest=/destination/path
with_fileglob: "/path/to/file"
Que Diriez-vous de ceci?
tasks:
- copy: src=../filetocopy.zip dest=/tmp/filetocopy.zip
failed_when: false
cela copie le fichier vers la cible s'il existe localement. Si elle n'existe pas, elle ne fait tout simplement rien puisque l'erreur est ignorée.