vars tower example commands ansible ansible-playbook

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