2017-12-19 20 views
0

バージョンファイルが存在する場合はそのファイルを読み込み、その内容を確認できます。バージョンが変更された場合、またはファイルが存在しない場合はTrueを返し、バージョンファイルが存在し、バージョンがコンテンツと一致する場合はFalseを返します。不可能 - バージョンファイルチェック

基本的には、この:


    # setup test data 
    - set_fact: 
     version_expected: "0001" 
     version_path: "/path/to/version" 
     version_owner: "root" 
     version_group: "root" 

    # this block is used to check for version changes 
    - name: check version change 
     block: 
     - name: check version file 
      stat: 
      path: "{{version_path}}" 
      register: version_file 
     - set_fact: 
      version_remote: "{{ lookup('file', version_path) | default('') }}" 
      when: version_file.stat.exists 
     - set_fact: 
      version_changed: not version_file.stat.exists or version_remote != version_expected 

    # test writing new version 
    - name: write file 
     copy: 
     dest: "{{version_path}}" 
     content: "{{version_expected}}" 
     owner: "{{version_owner}}" 
     group: "{{version_group}}" 
     when: version_changed 

私の問題がある:これはやや醜いと私の役割ではかなり冗長になりつつあります。 これを行うもっとエレガントな方法はありますか? おそらくこれ用のモジュールはありますか? (私は何も見つけませんでしたが) これについてモジュールを書くだけでいいですか?

敬具、 2d4r

EDIT:のみ "バージョンの変更を確認し、" ブロックを意味

イム、周囲のコードはデバッグ専用です。 具体的には、私はサーババイナリをダウンロードしたいと思っていますが、私の期待バージョンとバージョンファイルの内容が異なる場合に限ります。 ダウンロードが成功した場合のみ新しいバージョンをファイルに書きたいと思いますが、それは私の質問の一部ではありません。

EDIT2:

私は今ではこれを得た。このように使用

# roles/_helper/tasks/version_check.yml 

- name: check if file exists 
    stat: 
    path: "{{version_path}}" 
    register: version_file 
- name: get remote version 
    slurp: 
    src: "{{version_path}}" 
    register: version_changed 
    when: version_file.stat.exists 
# (False if versionfile exists and version is expected; True else) 
- name: set return value 
    set_fact: 
    version_changed: "{{ not version_file.stat.exists or ((version_changed.content | b64decode) is version_compare(version_expected, 'ne')) }}" 

# /roles/example/tasks/main.yml 

- include_role: 
    name: _helper 
    tasks_from: version_check 
    vars: 
    version_path: "{{file_version_path}}" 
    version_expected: "{{file_version_expected}}" 

- name: doing awesome things 
    when: version_changed 
    block: 
    - name: download server 
     [...] 
    - name: write version 
     copy: 
     dest: "{{file_version_path}}" 
     content: "{{file_version_expected}}" 

それは冗長性を殺すが、私が欲しいものはまだありません。 悲しいことに、ロールの戻り値を登録できません。

答えて

1

write fileタスクを除くすべてを削除し、条件を削除します。

これは自動的に実行されます。検索プラグインは、制御マシンでローカルに動作するよう


あなたが質問を変更した後

- name: write file 
    copy: 
    dest: "{{version_path}}" 
    content: "{{version_expected}}" 
    owner: "{{version_owner}}" 
    group: "{{version_group}}" 

は、提供された情報を与えられ、私がポイントすることができる唯一のことは、代わりに、ルックアップの slurpモジュールを使用することです。

ロジックを使用して、または組み込みのversion_compareフィルタ/テストを使用してバージョンを比較してください。

+0

返信いただきありがとうございますが、私の編集をご覧ください。ロールが失敗した場合、コピー操作はロールバックされますか?もしそうでなければ、私の問題を解決するのには役に立たないでしょう。 – 2deep4real

+0

ああ、私はルックアップで 'ローカル'の部分を見落としたと思う...私の悪い。 – 2deep4real