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ファイルがその場所に存在しない場合にのみ、それを実行したいです。現在、システムは毎回それをダウンロードしています。
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
注:この回答は、ファイルをダウンロードする特定のケースではなく、「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
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
ここには少なくとも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 module を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
したがって、基本的には、コマンドから変数を登録し、そのリターンコードをチェックすることで、このチェックを行うことができます。 (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
それが役に立てば幸い。
この記事 は役に立つかもしれません
その例を以下に示します。
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
私のお気に入りは、ローカルファイルよりも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
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