web-dev-qa-db-ja.com

サーバーからフェッチされたmd5ファイルを使用してansibleでmd5のファイルの整合性を確認するエレガントな方法はありますか?

サーバーにansible playbookからダウンロードする必要のあるファイルがいくつかありますが、接続が中断する可能性が高いため、ダウンロード後にそれらの整合性を確認したいと思います。

私は2つのアプローチを考えています:

  1. それらのファイルのmd5をvarsとしてansibleに保存します
  2. それらのファイルのmd5を、拡張子.md5が付いたファイルとしてサーバーに保存します。このようなペアは、file.extensionfile.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と一致させる方法はありますか?

10

サーバー上のファイルにチェックサムを保存する方法を使いたい場合は、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ファイルをダウンロードし、ルックアップを使用してそこから読み取る代わりに使用できます。

19
barnesm999

エレガントなソリューションは、ansible自体によって提供される以下の3つのモジュールを使用します

  1. http://docs.ansible.com/ansible/stat_module.html

    statモジュールを使用してmd5値を抽出し、変数に登録します

  2. http://docs.ansible.com/ansible/copy_module.html

    コピーモジュールを使用してサーバーからファイルをコピーするときに、md5の戻り値を別の変数に登録します。

  3. http://docs.ansible.com/ansible/playbooks_conditionals.html

    この条件付きモジュールを使用して、上記の2つの変数を比較し、ファイルが正しくコピーされたかどうかに関係なく結果を出力します

2

Statモジュールで:

- stat:
    path: "path/to/your/file"
  register: your_file_info

- debug:
    var: your_file_info.stat.md5
2
modle13

別の解決策は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') }}"
0
alius.miles

https://pypi.org/project/checksumdir の助けを借りてansibleモジュールを書いた

モジュールが見つかります ここ

例:

- get_checksum: 
    path: path/to/directory
    checksum_type: sha1/md5/sha256/sha512
  register: checksum
0
Rahul