it-swarm.com.ru

Как я могу проверить, был ли файл загружен в ansible

Я загружаю файл с помощью wget из 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

но я хочу сделать это только в том случае, если Zip-файл не существует в этом месте. В настоящее время система загружает его каждый раз.

23
user1994660

Если у вас нет причин использовать 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, ответ будет загружать файл во временный каталог, но выполнить проверку md5, чтобы решить, следует ли копировать в каталог назначения.

И если вам нужно сохранить состояние загрузки, вы можете использовать:

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

Примечание: этот ответ охватывает общий вопрос «Как я могу проверить существование файла в ansible», а не конкретный случай загрузки файла.

Проблемы с предыдущими ответами, использующими действия «команда» или «Оболочка», состоят в том, что они не будут работать в режиме --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
50
pfalcon

Многие модули уже знают о результате и будут пропущены, если он уже есть, например 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
16
iGEL

Здесь есть как минимум два варианта.

Вы можете зарегистрировать переменную, если файл существует, затем используйте условие 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
8
Ben Whaley

В общем, вы можете сделать эту проверку, зарегистрировав переменную в команде и проверив ее код возврата. (Вы также можете сделать это, проверив его стандартный вывод)

- 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

Надеюсь, поможет.

4
Rico

Эта статья может быть полезна

Из этого выходит этот пример:

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

мой любимый - скачивать файл, только если он новее, чем локальный файл (в том числе, когда локальный файл не существует)

опция -N с wget делает это: https://www.gnu.org/software/wget/manual/html_node/Time_002dStamping-Usage.html

к сожалению, я не думаю, что есть эквивалентная функция в get_url

так что очень небольшое изменение: 

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

0
Tom Carchrae

Используйте аргумент 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