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.
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
À 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
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.
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).
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 }}"
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
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.
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.
- 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.
- 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.