Как я могу проверить, был ли файл загружен в недоступном
Я загружаю файл с wget
из незаменимого.
- 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
но я хочу сделать это только в том случае, если zip файл не существует в этом месте. В настоящее время система загружает его каждый раз.
Ответы
Ответ 1
Если у вас нет причин использовать wget
, почему бы не использовать модуль get_url
. Он будет проверять, нужно ли загружать файл.
---
- 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"
ПРИМЕЧАНИЕ: Если вы поместите каталог, а не полный путь в dest
ansible, он все равно загрузит файл во временный каталог, но проведет проверку md5, чтобы решить, следует ли копировать в dest реж.
И если вам нужно сохранить состояние загрузки, вы можете использовать:
---
- 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
Ответ 2
Примечание. Этот ответ охватывает общий вопрос "Как проверить существование файла в недоступном", а не конкретный случай загрузки файла.
Проблемы с предыдущими ответами с использованием действий "команда" или "оболочка" в том, что они не будут работать в режиме -check. На самом деле, первое действие будет пропущено, а следующее будет выходить из состояния "когда: solr_exists.rc!= 0" (из-за того, что переменная не определена).
Так как Ansible 1.3, существует более прямой способ проверки существования файла - с использованием модуля stat. Конечно, он также хорошо работает как "local_action" для проверки локального существования файла:
- local_action: stat path={{secrets_dir}}/secrets.yml
register: secrets_exist
- fail: msg="Production credentials not found"
when: secrets_exist.stat.exists == False
Ответ 3
Многие модули уже знают о результатах и будут пропущены, если они уже существуют, например file
или geturl
. Другие, такие как command
, имеют параметр creates
, который пропустит эту команду, если этот файл уже существует (или не существует, если вы используете параметр removes
).
Итак, вы должны сначала проверить доступные модули, если они уже достаточно умны. Если нет: рекомендую модуль stats
. Преимущество над другим решением: в выводе нет "красных ошибок, но проигнорировано".
- 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
Ответ 4
Здесь есть как минимум два варианта.
Вы можете зарегистрировать переменную, если файл существует, а затем использовать условие when для выполнения команды при условии, что файл еще не существует:
- 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
Вы также можете использовать модуль команд с опцией 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
Ответ 5
Таким образом, вы можете выполнить эту проверку, зарегистрировав переменную из команды и проверив ее код возврата. (Вы также можете сделать это, проверив его 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
В основном это говорит о том, что если команда /usr/bin/test -e {{project_root}}/solr/solr-4.7.0.zip
возвращает код, который не равен 0, то есть он не существует, то выполните задачу Download Solr
Надеюсь, что это поможет.
Ответ 6
Эта статья может быть полезна
Из этого выйдет следующий пример:
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
Ответ 7
Используйте аргумент 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