web-dev-qa-db-fra.com

Comment puis-je vérifier si le fichier a été téléchargé dans ansible

Je télécharge le fichier avec 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

mais je veux seulement faire cela si le fichier Zip n'existe pas à cet endroit. Actuellement, le système le télécharge à chaque fois.

23
user1994660

Sauf si vous avez une raison d'utiliser wget, pourquoi ne pas utiliser le module get_url. Il vérifiera si le fichier doit être téléchargé.

---
- 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"

NOTE: Si vous placez le répertoire et non le chemin complet dans la variable dest ansible, le fichier sera tout de même téléchargé dans un répertoire temporaire, mais il effectuera une vérification md5 pour décider de copier dans le répertoire de destination.

Et si vous avez besoin de sauvegarder l’état du téléchargement, vous pouvez utiliser:

---
- 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
30
DomaNitro

Remarque: cette réponse couvre la question générale "Comment puis-je vérifier l’existence du fichier dans ansible", et non un cas spécifique de téléchargement de fichier.

Le problème avec les réponses précédentes utilisant des actions "command" ou "Shell" est qu'elles ne fonctionneront pas en mode --check. En fait, la première action sera ignorée et la prochaine erreur sur la condition "when: solr_exists.rc! = 0" (en raison de la non définition de la variable).

Depuis Ansible 1.3, il existe un moyen plus direct de vérifier l’existence de fichiers - en utilisant le module "stat". Bien sûr, cela fonctionne aussi comme "action_local" pour vérifier l'existence d'un fichier local:

- local_action: stat path={{secrets_dir}}/secrets.yml
  register: secrets_exist

- fail: msg="Production credentials not found"
  when: secrets_exist.stat.exists == False
50
pfalcon

De nombreux modules sont déjà au courant du résultat et seront ignorés s'ils sont déjà présents, comme file ou geturl. D'autres, comme command, ont une option creates, qui ignore cette commande si ce fichier existe déjà (ou n'existe pas, si vous utilisez l'option removes).

Donc, vous devriez d’abord vérifier les modules disponibles, s’ils sont déjà assez intelligents. Sinon, je recommande le module stats. Avantage par rapport à l’autre solution: pas d’erreur "rouge mais ignorée" dans la sortie.

- 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
16
iGEL

Il y a au moins deux options ici.

Vous pouvez enregistrer une variable si le fichier existe, puis utilisez une condition when pour exécuter la commande à condition que le fichier n'existe pas déjà

- 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

Vous pouvez également utiliser le module controls avec l’option 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
8
Ben Whaley

Donc, fondamentalement, vous pouvez effectuer cette vérification en enregistrant une variable à partir d'une commande et en vérifiant son code de retour. (Vous pouvez aussi le faire en vérifiant sa sortie standard)

- 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

Cela indique en gros que si la commande /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.Zip renvoie un code différent de 0, ce qui signifie qu'il n'existe pas, exécutez la tâche Download Solr.

J'espère que ça aide.

4
Rico

Cet article pourrait être utile

Il en résulte cet exemple:

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
4
czerasz

mon préféré est de ne télécharger le fichier que s'il est plus récent que le fichier local (ce qui inclut lorsque le fichier local n'existe pas)

l'option -N avec wget fait ceci: https://www.gnu.org/software/wget/manual/html_node/Time_002dStamping-Usage.html

malheureusement, je ne pense pas qu'il existe une fonctionnalité équivalente dans get_url

donc un très petit changement: 

- name: Download Solr Shell: chdir={{project_root}}/solr wget -N http://<SNIPPED>/solr-4.7.0.Zip

0
Tom Carchrae

Utilisez l'argument 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
0
Felipe