サーバーにansible playbook
からダウンロードする必要のあるファイルがいくつかありますが、接続が中断する可能性が高いため、ダウンロード後にそれらの整合性を確認したいと思います。
私は2つのアプローチを考えています:
file.extension
とfile.extension.md5
のようになります。firstアプローチでは、md5をansibleで維持する際にオーバーヘッドが発生します。したがって、誰かが新しいファイルを追加するたびに、彼は正しい場所にmd5を追加することを確認する必要があります。
しかし、利点として、get_url
と共に組み込みのchecksum=md5
アクションからのチェックを使用して、これに対する解決策があります。例えば。:
action: get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf checksum=md5:66dffb5228a211e61d6d7ef4a86f5758
secondアプローチはよりエレガントで、責任を狭めます。誰かがサーバーに新しいファイルを追加するとき、彼は.md5
も確実に追加し、ansibleプレイブックを使用する必要すらありません。
checksum
アプローチを使用してファイルのmd5と一致させる方法はありますか?
サーバー上のファイルにチェックサムを保存する方法を使いたい場合は、get_urlチェックサム引数を使用して検証することができます。
.md5ファイルをダウンロードして、varに読み込みます。
- set_fact:
md5_value: "{{ lookup('file', '/etc/myfile.md5') }}"
そして、ファイルをダウンロードするときに、md5_valueの内容をget_urlに渡します。
- get_url:
url: http://example.com
dest: /my/dest/file
checksum: "md5:{{ md5_value }}"
force: true
dest
でファイルへのパスを指定することが重要であることに注意してください。これをディレクトリに設定した場合(およびファイル名がurl
にある場合)、動作は大幅に変化します。
また、おそらくforce:trueが必要であることにも注意してください。これにより、実行するたびに新しいファイルがダウンロードされます。チェックサムは、ファイルがダウンロードされたときにのみトリガーされます。ホストにファイルがすでに存在する場合、既存のファイルの合計を検証する必要はありません。これは望ましくない場合があります。
ファイルがすでに存在するかどうかを統計で確認するたびにダウンロードを回避するには、ファイルの合計を確認し、条件付きでforceパラメータを設定します。
- stat:
path: /my/dest/file
register: existing_file
- set_fact:
force_new_download: "{{ existing_file.stat.md5 != md5_value }}"
when: existing_file.stat.exists
- get_url:
url: http://example.com
dest: /my/dest/file
checksum: "md5:{{ md5_value }}"
force: "{{ force_new_download | default ('false') }}"
また、ある種のWebサーバーから合計/アーティファクトをプルしている場合、実際にファイルをホストにダウンロードしなくても、URLから合計の値を取得できます。アーティファクトとその合計をホストするNexusサーバーの使用例を次に示します。
- set_fact:
md5_value: "{{ item }}"
with_url: http://my_nexus_server.com:8081/nexus/service/local/artifact/maven/content?g=log4j&a=log4j&v=1.2.9&r=central&e=jar.md5
これは、get_urlを使用してmd5ファイルをダウンロードし、ルックアップを使用してそこから読み取る代わりに使用できます。
エレガントなソリューションは、ansible自体によって提供される以下の3つのモジュールを使用します
http://docs.ansible.com/ansible/stat_module.html
statモジュールを使用してmd5値を抽出し、変数に登録します
http://docs.ansible.com/ansible/copy_module.html
コピーモジュールを使用してサーバーからファイルをコピーするときに、md5の戻り値を別の変数に登録します。
http://docs.ansible.com/ansible/playbooks_conditionals.html
この条件付きモジュールを使用して、上記の2つの変数を比較し、ファイルが正しくコピーされたかどうかに関係なく結果を出力します
Statモジュールで:
- stat:
path: "path/to/your/file"
register: your_file_info
- debug:
var: your_file_info.stat.md5
別の解決策はrl lookupを使用することです(ansible-2.3.1.0でテスト済み):
- name: Download
get_url:
url: "http://localhost/file"
dest: "/tmp/file"
checksum: "md5:{{ lookup('url', 'http://localhost/file.md5') }}"
https://pypi.org/project/checksumdir の助けを借りてansibleモジュールを書いた
モジュールが見つかります ここ
例:
- get_checksum:
path: path/to/directory
checksum_type: sha1/md5/sha256/sha512
register: checksum