tutorial tower source open logo hat ansible

tower - ansible tutorial



Cómo mover/cambiar el nombre de un archivo usando una tarea de Ansible en un sistema remoto (8)

Bruce no intentaba establecer el destino para verificar si mover el archivo si ya estaba allí; se estaba asegurando de que el archivo que se iba a mover existía realmente antes de intentar el mv.

Si su interés, como el de Tom, es moverse solo si el archivo no existe, creo que deberíamos integrar el cheque de Bruce en la mezcla:

- 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ómo es posible mover / renombrar un archivo / directorio usando un módulo Ansible en un sistema remoto? No quiero utilizar las tareas de comando / shell y no quiero copiar el archivo desde el sistema local al sistema remoto.


El módulo de archivo no copia archivos en el sistema remoto. El parámetro src solo lo utiliza el módulo de archivo al crear un enlace simbólico a un archivo.

Si desea mover / cambiar el nombre de un archivo completamente en un sistema remoto, la mejor opción es usar el módulo de comando para invocar el comando apropiado:

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

Si quieres ser elegante, primero puedes usar el módulo de estadísticas para verificar que foo realmente exista:

- 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


Esta es la forma en que lo hice funcionar para mí:

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

el libro de jugadas anterior, verificará si el archivo abc.xts existe antes de mover el archivo a la carpeta tmp.


Esto puede parecer exagerado, pero si quiere evitar el uso del módulo de comando (lo cual hago, porque usar el comando no es idempotente) puede usar una combinación de copiar y desarchivar.

  1. Use tar para archivar el (los) archivo (s) que necesitará. Si piensas en el futuro, esto tiene sentido. Es posible que desee una serie de archivos en un directorio determinado. Cree ese directorio con todos los archivos y archívelos en un tar.
  2. Usa el módulo de desarchivar. Cuando lo haga, junto con el destino: y remote_src: keyword, puede colocar todos sus archivos en una carpeta temporal para comenzar y luego descomprimirlos exactamente donde desee.

He encontrado que la opción crea en el módulo de comando es útil. Qué tal esto:

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

Solía ​​hacer un enfoque de 2 tareas usando estadística como sugiere Bruce P. Ahora hago esto como una tarea con crea. Creo que esto es mucho más claro.


Otra forma de lograr esto es usar el file con state: hard .

Este es un ejemplo que llegué a trabajar:

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

Solo se probó en localhost (OSX), pero también debería funcionar en Linux. No puedo decir por Windows.

Tenga en cuenta que se necesitan rutas absolutas. De lo contrario, no me dejaría crear el enlace. Además, no puede cruzar sistemas de archivos, por lo que puede fallar el trabajo con cualquier medio montado.

El enlace fijo es muy similar al movimiento, si luego quita el archivo fuente:

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

Otro beneficio es que los cambios persisten cuando estás en medio de una jugada. Entonces, si alguien cambia la fuente, cualquier cambio se refleja en el archivo de destino.

Puede verificar la cantidad de enlaces a un archivo a través de ls -l . El número de enlaces duros se muestra junto al modo (por ejemplo, rwxr-xr-x 2, cuando un archivo tiene 2 enlaces).


Otra opción que me ha funcionado es utilizar el módulo de sincronización . A continuación, elimine el directorio original utilizando el módulo de archivo.

Aquí hay un ejemplo de los documentos:

- synchronize: src: /first/absolute/path dest: /second/absolute/path archive: yes delegate_to: "{{ inventory_hostname }}"


Desde la versión 2.0 , en el módulo de copia puede usar el parámetro remote_src .

Si es True , irá a la máquina remota / de destino para el src.

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

Si desea mover el archivo, debe eliminar el archivo anterior con el módulo de archivo

- name: Remove old files foo file: path=/path/to/foo state=absent