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?

21
demandé sur dirceusemighini 2015-03-04 16:03:12

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    
20
répondu Sandra Parsick 2015-03-05 08:02:49

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
22
répondu edelans 2017-10-04 19:53:00

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

3
répondu Victor Jerlin 2017-10-11 23:46:22

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"
2
répondu Christophe Morio 2017-05-05 07:28:28

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.

-2
répondu Michael Wyraz 2016-02-28 20:56:11