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