Comment déplacer / renommer un fichier à l'aide D'une tâche Ansible sur un système distant

Comment est-il possible de déplacer/renommer un fichier/répertoire en utilisant un module Ansible sur un système distant? Je ne veux pas utiliser les tâches de commande/shell et je ne veux pas copier le fichier du système local vers le système distant.

149
demandé sur Christian Berendt 2014-06-11 16:30:17

8 réponses

Le module de fichiers ne copie pas les fichiers sur le système distant. Le paramètre src n'est utilisé que par le module file lors de la création d'un lien symbolique vers un fichier.

Si vous voulez déplacer / renommer un fichier entièrement sur un système distant, votre meilleur pari est d'utiliser le module de commande pour appeler simplement la commande appropriée:

- name: Move foo to bar
  command: mv /path/to/foo /path/to/bar

Si vous voulez avoir de la fantaisie, vous pouvez d'abord utiliser le module stat pour vérifier que foo existe réellement:

- name: stat foo
  stat: path=/path/to/foo
  register: foo_stat

- name: Move foo to bar
  command: mv /path/to/foo /path/to/bar
  when: foo_stat.stat.exists
164
répondu Bruce P 2014-06-11 14:22:52

À Partir de la version 2.0, de module de copie, vous pouvez utiliser remote_src paramètre.

Si True il ira à la machine distante / cible pour le src.

- name: Copy files from foo to bar
  copy: remote_src=True src=/path/to/foo dest=/path/to/bar

Si vous voulez déplacer un fichier, vous devez supprimer l'ancien fichier avec le module de fichier

- name: Remove old files foo
  file: path=/path/to/foo state=absent
178
répondu Alex 2017-06-01 12:48:14

J'ai trouvé l'option creates dans le module de commande utile. Que diriez-vous de ceci:

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar

J'avais l'habitude de faire une approche à 2 tâches en utilisant stat comme le suggère Bruce P. Maintenant, je le fais comme une tâche avec creates. Je pense que c'est beaucoup plus clair.

86
répondu Tom Ekberg 2014-06-27 17:42:09

Une autre façon d'y parvenir est d'utiliser file avec state: hard.

C'est un exemple que je suis arrivé à travailler:

- name: Link source file to another destination
  file:
    src: /path/to/source/file
    path: /target/path/of/file
    state: hard

Seulement testé sur localhost (OSX), mais devrait aussi fonctionner sur Linux. Je ne peux pas dire Pour Windows.

Notez que des chemins absolus sont nécessaires. Sinon, il ne me laisserait pas créer le lien. En outre, vous ne pouvez pas croiser les systèmes de fichiers, donc travailler avec n'importe quel support monté peut échouer.

Le lien dur est très similaire au déplacement, si vous supprimez le fichier source après:

- name: Remove old file
  file:
    path: /path/to/source/file
    state: absent

Un autre avantage est que les changements sont persistants lorsque vous êtes au milieu d'une pièce. Donc, si quelqu'un change la source, tout changement est reflété dans le fichier cible.

, Vous pouvez vérifier le nombre de liens vers un fichier via ls -l. Le nombre de liens en dur est affiché à côté du mode (par exemple rwxr-xr-x 2, lorsqu'un fichier a 2 liens).

4
répondu martinczerwi 2017-05-26 22:29:39

Une autre Option qui a bien fonctionné pour moi est d'utiliser le module synchroniser . Ensuite, supprimez le répertoire d'origine à l'aide du module fichier.

Voici un exemple des documents:

- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
    archive: yes
  delegate_to: "{{ inventory_hostname }}"
4
répondu Andrew Becker 2018-03-09 20:53:31

Bruce n'a pas essayé de stat la destination pour vérifier si oui ou non de déplacer le fichier s'il était déjà là; il s'assurait que le fichier à déplacer existait réellement avant d'essayer le mv.

Si votre intérêt, comme celui de Tom, est de ne bouger que si le fichier n'existe pas déjà, je pense que nous devrions toujours intégrer le chèque de Bruce dans le mix:

- name: stat foo
  stat: path=/path/to/foo
  register: foo_stat

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar
  when: foo_stat.stat.exists
3
répondu gkedge 2015-11-10 23:58:30

C'est la façon dont je l'ai fait fonctionner pour moi:

  Tasks:
  - name: checking if the file 1 exists
     stat:      
      path: /path/to/foo abc.xts
     register: stat_result

  - name: moving file 1
    command: mv /path/to/foo abc.xts /tmp
    when: stat_result.stat.exists == True

Le playbook ci-dessus, vérifiera si le fichier abc.xts existe avant de déplacer le fichier dans dossier tmp.

1
répondu eduprado 2016-07-13 15:58:27

Cela peut sembler exagéré, mais si vous voulez éviter d'utiliser le module de commande (ce que je fais, car il n'est pas idempotent), vous pouvez utiliser une combinaison de copy et unarchive.

  1. Utilisez tar pour archiver le ou les fichiers dont vous aurez besoin. Si vous pensez à l'avance, cela a du sens. Vous pouvez vouloir une série de fichiers dans un répertoire donné. Créez ce répertoire avec tous les fichiers et archivez - les dans un tar.
  2. Utilisez le module unarchive. Lorsque vous faites cela, avec l' destination: et remote_src: mot-clé, vous pouvez placer copier tous vos fichiers dans un dossier temporaire pour commencer, puis les décompresser exactement où vous voulez.
1
répondu Mark Chassy 2017-07-11 22:27:04