2016-04-06 9 views
6

私はansible playbookからダウンロードする必要があるサーバー上にいくつかのファイルがありますが、接続には中断の可能性が高いため、ダウンロード後に整合性をチェックしたいと思います。 サーバからフェッチされたmd5ファイルを使用して、md5のファイルの整合性をチェックするエレガントな方法はありますか?

  • ストア拡張子.md5を持つファイルとしてサーバー上のこれらのファイルのMD5をvarsのよう

    1. ストアansibleでこれらのファイルのMD5:

      は、私は2つのアプローチを検討しています。このようなペアは、file.extensionfile.extension.md5のようになります。

    最初ののアプローチでは、md5sを安全な状態に保つためのオーバーヘッドが発生します。だから誰かが新しいファイルを追加するたびに、彼は正しい場所にmd5を追加することを確認する必要があります。

    しかし、利点として、get_urlアクションと組み合わされたチェックを使用して、checksum=md5のアクションがこれに対応しています。例えば:

    action: get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf checksum=md5:66dffb5228a211e61d6d7ef4a86f5758 
    

    アプローチは、よりエレガントで狭く責任です。誰かが新しいファイルをサーバーに追加すると、彼は.md5も必ず追加して、無防備なプレイブックを使う必要はありません。

    checksumアプローチを使用してファイルからmd5を突き合わせる方法はありますか?

  • 答えて

    11

    ますもししますサーバー上のファイルにチェックサムを格納する方法を使用したい場合は、get_urlチェックサム引数を使用して検証することができます。

    をダウンロードしてください。MD5ファイルおよびVARにそれを読む:

    - set_fact: 
        md5_value: "{{ lookup('file', '/etc/myfile.md5') }}" 
    

    そして、あなたは、ファイルをダウンロードするときに、GET_URLするmd5_valueの内容を渡します

    - get_url: 
        url: http://example.com 
        dest: /my/dest/file 
        checksum: "md5:{{ md5_value }}" 
        force: true 
    

    注へのパスを指定することが不可欠であることファイルはdestです。これをディレクトリに設定すると(ファイル名はurl)、動作が大きく変わります。

    force:trueが必要なことにも注意してください。これにより、実行するたびに新しいファイルがダウンロードされます。チェックサムは、ファイルのダウンロード時にのみトリガされます。ファイルがすでにホスト上に存在する場合、既存のファイルの合計を検証するのは面倒ではありませんが、これは望ましくない可能性があります。

    ファイルがすでに存在するかどうかを確認し、合計が何であるかを確認し、強制的にパラメーターを条件付きで設定できるようになるたびに、ダウンロードを避けるには。

    また
    - 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') }}" 
    

    、あなたが実際に実際にホストにファイルをダウンロードすることなく、右のURLから和の値を取得することができ、Webサーバーのいくつかの並べ替えから合計/アーティファクトを引いている場合。ここでの成果物とそれらの合計をホストするネクサスサーバーを使用した例です。

    - 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 
    

    これはMD5ファイルをダウンロードするにはGET_URLを使用し、それからの読み取りにルックアップを使用しての代わりに使用することができます。 STATモジュールと

    1

    エレガントな解決策は、ansible自体によって提供される以下の3つのモジュールを使用する

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

      MD5値を抽出するためにSTATモジュールを使用し、可変

    2. に登録http://docs.ansible.com/ansible/copy_module.html

      コピーモジュールを使用してサーバーからファイルをコピーしているときに、 gisterこの条件モジュール別の変数

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

      使用されているMD5の戻り値は、上記の2つの変数を比較して、ファイルが正しくコピーされているかどうかの結果を印刷するかどうか

    1

    - stat: 
        path: "path/to/your/file" 
        register: your_file_info 
    
    - debug: 
        var: your_file_info.stat.md5 
    
    0

    は別の解決策は、(ansible-2.3.1.0でテスト)URLルックアップを使用することです:

    - name: Download 
        get_url: 
        url: "http://localhost/file" 
        dest: "/tmp/file" 
        checksum: "md5:{{ lookup('url', 'http://localhost/file.md5') }}" 
    
    関連する問題