54
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ansible でファイルがある場合のみ実行したい場合のベストプラクティス

Last updated at Posted at 2016-01-27

ファイルが存在する場合にのみ実行する方法はいくつかあるかと思いますが、
個人的にベストと思える方法を紹介します。

◆ファイルがローカルにある場合

ローカルにある設定ファイル等で動作を変えたい場合や、ローカルに対してプロビジョニングしたい場合の方法です:

tasks
- debug: msg="{{item}}"  # 実行したいコマンド
  with_first_found:
    - files: これがあれば実行したいというパス
      skip: true

これで、ファイルがあれば実行され、無ければスキップされます。

なお、次のようにすると、優先順位順にファイルを探すこともできます:

tasks
- debug: msg="{{item}}"  # 実行したいコマンド
  with_first_found:
    - files:
        - これがあれば実行したいというパス1
        - これがあれば実行したいというパス2
        - これがあれば実行したいというパス3
      skip: true

また、skip: true を取り除けば、いずれのファイルもない場合にエラーにできます。

namutaka さんから2.x以降の仕様変更についてご指摘があり、反映させていただきました。ありがとうございました。)

◆ファイルがリモートにある場合

プロビジョニング先のサーバにあるファイルの有無で動作を変えたい場合の方法です:

tasks
- stat: path=これがあれば実行したいというパス
  register: stat
- debug: msg="file is found"  # 実行したいコマンド
  when: stat.stat.exists

なお、次のようにすると、優先順位順にファイルを探すこともできます:

tasks
- shell: |
         ls これがあれば実行したいというパス1 || \
         ls これがあれば実行したいというパス2 || \
         ls これがあれば実行したいというパス3
  register: register
  changed_when: false
  failed_when: false
- debug: msg="{{register.stdout}}"  # 実行したいコマンド
  when: register.stdout  # ファイルが無かったらスキップ

また、failed_when: falsewhen: register.stdout を取り除けば、いずれのファイルもない場合にエラーにできます。

なお、 ngyuki さんのコメントを受けて、修正させて頂きました。

どなたか、さらに良い方法をご存知でしたら、ぜひコメント下さい!

54
57
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?