Solución:
Nota: esta respuesta cubre la pregunta general de “¿Cómo puedo verificar la existencia del archivo en ansible?”, No un caso específico de descarga de archivos.
El problema con las respuestas anteriores que usan acciones de “comando” o “shell” es que no funcionan en el modo –check. En realidad, la primera acción se omitirá y la siguiente generará un error en la condición “when: solr_exists.rc! = 0” (debido a que la variable no está definida).
Desde Ansible 1.3, hay una forma más directa de verificar la existencia de archivos, usando el módulo “stat”. Por supuesto, también funciona bien como “local_action” para comprobar la existencia de un archivo local:
- local_action: stat path={{secrets_dir}}/secrets.yml
register: secrets_exist
- fail: msg="Production credentials not found"
when: secrets_exist.stat.exists == False
A menos que tenga una razón para usar wget
por qué no usar get_url
módulo. Verificará si es necesario descargar el archivo.
---
- hosts : all
gather_facts : no
tasks:
- get_url:
url="http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip"
dest="{{project_root}}/solr-4.7.0.zip"
NOTA: Si coloca el directorio y no la ruta completa en el dest
ansible aún descargará el archivo a un directorio temporal, pero hará una verificación md5 para decidir si copiar al directorio de destino.
Y si necesita guardar el estado de descarga, puede usar:
---
- hosts : all
gather_facts : no
tasks:
- get_url:
url="http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip"
dest="{{project_root}}/solr-4.7.0.zip"
register: get_solr
- debug:
msg="solr was downloaded"
when: get_solr|changed
Muchos módulos ya conocen el resultado y se omitirán si ya está allí, como file
o geturl
. A otros les gusta command
tener un creates
opción, que omitirá este comando si ese archivo ya existe (o no existe, si usa la removes
opción).
Por lo tanto, primero debe verificar los módulos disponibles, si ya son lo suficientemente inteligentes. Si no: recomiendo el stats
módulo. Ventaja sobre la otra solución: No hay “errores rojos pero ignorados” en la salida.
- name: Check MySQL data directory existence
stat: path=/var/lib/mysql-slave
register: mysql_slave_data_dir
- name: Stop MySQL master to copy data directory
service: name=mysql state=stopped
sudo: yes
when: not mysql_slave_data_dir.stat.exists