web-dev-qa-db-ja.com

ファイルがansibleでダウンロードされたかどうかを確認する方法

Ansibleから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ファイルがその場所に存在しない場合にのみ、それを実行したいです。現在、システムは毎回それをダウンロードしています。

25
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 ansibleに絶対パスではなくディレクトリを配置すると、ファイルは一時ディレクトリにダウンロードされますが、宛先にコピーするかどうかを決定するためにmd5チェックを実行します。 dir。

ダウンロードの状態を保存する必要がある場合は、次を使用できます。

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

注:この回答は、ファイルをダウンロードする特定のケースではなく、「ansibleでファイルの存在を確認する方法」の一般的な質問を対象としています。

「コマンド」または「シェル」アクションを使用した以前の回答の問題は、-checkモードでは機能しないことです。実際には、最初のアクションはスキップされ、次に「when: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
52
pfalcon

filegeturlのように、多くのモジュールはすでに結果を認識しており、既に存在する場合はスキップされます。 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

ここには少なくとも2つのオプションがあります。

ファイルが存在する場合は変数を登録でき、 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

commands modulecreatesオプションとともに使用することもできます。

- 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

したがって、基本的には、コマンドから変数を登録し、そのリターンコードをチェックすることで、このチェックを行うことができます。 (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

それが役に立てば幸い。

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

私のお気に入りは、ローカルファイルよりもnewの場合にのみファイルをダウンロードすることです(ローカルファイルが存在しない場合も含む)

wgetの-Nオプションはこれを行います: 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