web-dev-qa-db-fra.com

Copiez le fichier local s'il existe, en utilisant ansible

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?

23
dirceusemighini

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    
21
Sandra Parsick

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
25
edelans

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

8
Victor Jerlin

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"
2