playbook - introducción a ansible
Copie el archivo local si existe, usando ansible (5)
Estoy trabajando en un proyecto, y utilizamos ansible para crear un despliegue de un grupo de servidores. Una de las tareas que tengo que implementar es copiar un archivo local en el host remoto, solo si ese archivo existe localmente. Ahora estoy tratando de resolver este problema usando este
- 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 esto está fallando con el siguiente mensaje: ERROR: falta el atributo ''acción'' o ''acción_local'' en la tarea "copiar el archivo filetocopy.zip local al remoto si existe"
He intentado crear esto si con la tarea de comando. Ya intenté crear esta tarea con una acción local, pero no pude hacer que funcionara. Todas las muestras que he encontrado no consideran un shell en local_action, solo hay muestras de comando, y ninguna de ellas tiene nada más que un comando. ¿Hay alguna manera de hacer esta tarea usando ansible?
¿Qué tal esto?
tasks:
- copy: src=../filetocopy.zip dest=/tmp/filetocopy.zip
failed_when: false
Esto copiará el archivo al destino si existe localmente. Si no existe, simplemente no hace nada ya que el error se ignora.
Cambia tu primer paso en el siguiente en
- name: copy local filetocopy.zip to remote if exists
local_action: stat path="../filetocopy.zip"
register: result
Fileglob permite una búsqueda de un archivo eventualmente presente.
- name: copy file if it exists
copy: src="{{ item }}" dest=/destination/path
with_fileglob: "/path/to/file"
Sé que esta pregunta ya ha sido respondida, pero me topé con el mismo problema esta mañana y pensé que podría publicar una respuesta más completa para futuras referencias.
Si desea verificar la existencia de un archivo local antes de realizar alguna tarea, aquí está el fragmento completo:
- 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
EDITAR : si desea comprobar la existencia de un archivo remoto (como lo hice), este es el camino a seguir:
- 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
Si no configura dos tareas, puede usar is_file para verificar si existen archivos locales:
tasks:
- copy: src=/a/b/filetocopy.zip dest=/tmp/filetocopy.zip
when: ''/a/b/filetocopy.zip'' | is_file
La ruta es relativa al directorio del libro de jugadas, por lo que se recomienda usar la variable magic role_path si se refiere a archivos dentro del directorio de funciones.
Ref: http://docs.ansible.com/ansible/latest/playbooks_tests.html#testing-paths