ファイルが存在する場合にのみ実行する方法はいくつかあるかと思いますが、
個人的にベストと思える方法を紹介します。
◆ファイルがローカルにある場合
ローカルにある設定ファイル等で動作を変えたい場合や、ローカルに対してプロビジョニングしたい場合の方法です:
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: false
と when: register.stdout
を取り除けば、いずれのファイルもない場合にエラーにできます。
◆
なお、 ngyuki さんのコメントを受けて、修正させて頂きました。
どなたか、さらに良い方法をご存知でしたら、ぜひコメント下さい!