tower - execute ansible yaml
¿Cómo puedo comprobar si el archivo ha sido descargado en ansible? (8)
Estoy descargando el archivo con wget
de ansible.
- name: Download Solr
shell: chdir={{project_root}}/solr wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip
pero solo quiero hacer eso si el archivo zip no existe en esa ubicación. Actualmente el sistema lo está descargando cada vez.
A menos que tenga una razón para usar wget
por qué no usa el módulo get_url
. Verificará si el archivo necesita ser descargado.
---
- 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 destino, todavía se descargará el archivo en un directorio temporal, pero haga una comprobación de md5 para decidir si desea copiar en el directorio de destino.
Y si necesitas guardar el estado de descarga puedes 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
Básicamente, puede hacer esta comprobación registrando una variable desde un comando y comprobando su código de retorno. (También puede hacer esto comprobando su stdout)
- name: playbook
hosts: all
user: <your-user>
vars:
project_root: /usr/local
tasks:
- name: Check if the solr zip exists.
command: /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.zip
ignore_errors: True
register: solr_exists
- name: Download Solr
shell: chdir={{project_root}}/solr wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip
when: solr_exists.rc != 0
Básicamente, esto dice que si el comando /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.zip
devuelve un código que no es 0, lo que significa que no existe, ejecute la tarea Download Solr
Espero eso ayude.
Hay al menos dos opciones aquí.
Puede registrar una variable si el archivo existe, luego use una condición when para ejecutar el comando con la condición de que el archivo ya no exista:
- command: /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.zip
register: solr_zip
ignore_errors: True
- name: Download Solr
shell: chdir={{project_root}}/solr /usr/bin/wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip
when: solr_zip|failed
También puedes usar el módulo de comandos con la opción de creates
:
- name: Download Solr
command: /usr/bin/wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip chdir={{project_root}}/solr creates={{project_root}}/solr/solr-4.7.0.zip
Muchos módulos ya conocen el resultado y se omitirán si ya están allí, como file
o geturl
. Otros, como el command
tienen una opción de creates
, que omitirá este comando si ese archivo ya existe (o no existe, si usa la opción de removes
).
Por lo tanto, primero debe verificar los módulos disponibles, si ya son lo suficientemente inteligentes. Si no: recomiendo el módulo de stats
. Ventaja sobre la otra solución: no hay "errores rojos, pero se ignoran" 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
Nota: esta respuesta cubre la pregunta general de "¿Cómo puedo verificar la existencia del archivo en ansible?", No un caso específico de la descarga del archivo.
Los problemas con las respuestas anteriores al usar las acciones "comando" o "shell" es que no funcionarán en el modo --check. En realidad, la primera acción se omitirá, y la siguiente será un error en "when: solr_exists.rc! = 0" condicion (debido a que la variable no esta 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 "acción local" para verificar 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
Usa el argumento creates
- name: Download Solr
shell: creates={{working_directory}}/solr/solr-4.7.0.zip chdir={{working_directory}}/solr wget http://mirror.mel.bkb.net.au/pub/apache/lucene/solr/4.7.0/solr-4.7.0.zip
mi favorito es descargar el archivo solo si es más nuevo que el archivo local (que incluye cuando el archivo local no existe)
La opción -N
con wget hace esto: https://www.gnu.org/software/wget/manual/html_node/Time_002dStamping-Usage.html .
Lamentablemente, no creo que haya una función equivalente en get_url
así que un cambio muy pequeño:
- name: Download Solr shell: chdir={{project_root}}/solr wget -N http://<SNIPPED>/solr-4.7.0.zip
Este artículo podría ser útil
De aquí sale este ejemplo:
tasks:
- shell: if [[ -f "/etc/monitrc" ]]; then /bin/true; else /bin/false; fi
register: result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped