Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

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

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 さんのコメントを受けて、修正させて頂きました。

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした