Ansibleにファイルが存在するかどうかを確認するにはどうすればよいですか?


128

にファイルが存在するかどうかを確認する必要があります/etc/。ファイルが存在する場合、タスクをスキップする必要があります。これが私が使用しているコードです:

- name: checking the file exists
  command: touch file.txt
  when: $(! -s /etc/file.txt)

回答:


207

最初に宛先ファイルが存在するかどうかを確認してから、その結果の出力に基づいて決定を行うことができます。

    tasks:
      - name: Check that the somefile.conf exists
        stat:
          path: /etc/file.txt
        register: stat_result

      - name: Create the file, if it doesnt exist already
        file:
          path: /etc/file.txt
          state: touch
        when: not stat_result.stat.exists

1
ディレクトリが存在しない場合はどうなりますか?
ram4nd 2016年

2
ディレクトリが存在しない場合、レジスターの値stat_resultstat_result.state.existsFalseになります(2番目のタスクが実行されるときです)。あなたはここでのstatモジュールの詳細を見ることができます:docs.ansible.com/ansible/stat_module.html
ウィル

1
いつ:stat_result.stat.existsが定義され、stat_result.stat.exists
danday74

2
これをありがとう。また、見つけた場合は書くことができます:when: stat_result.stat.exists == Falsewhen: not stat_result.stat.existsあなたはそれがより自然な読みたい場合。
racl101

1
「Foo == False」の代わりに「not Foo」を使用しますか?
Matthias Urlichs

32

STATモジュールは、などのファイルのために他の多くの情報を得るだけでなくこれを行います。サンプルドキュメントから:

- stat: path=/path/to/something
  register: p

- debug: msg="Path exists and is a directory"
  when: p.stat.isdir is defined and p.stat.isdir

最新バージョンのように見えますが、「=」、「<」、「 ">」などの代わりに「is」などの「全文比較」を使用すると警告が表示されます
Buzut

24

これは、ファイルが存在する場合にタスクをスキップするstatモジュールで実現できます。

- hosts: servers
  tasks:
  - name: Ansible check file exists.
    stat:
      path: /etc/issue
    register: p
  - debug:
      msg: "File exists..."
    when: p.stat.exists
  - debug:
      msg: "File not found"
    when: p.stat.exists == False

16

一般に、これはstatモジュールで行います。しかし、コマンドモジュールには、createsこれを非常に簡単にするオプションがあります。

- name: touch file
  command: touch /etc/file.txt
  args:
    creates: /etc/file.txt

タッチコマンドは単なる例だと思いますか?ベストプラクティスは、何もチェックしないで、適切なモジュールを使用して、ansibleにその仕事をさせることです。したがって、ファイルが存在することを確認する場合は、ファイルモジュールを使用します。

- name: make sure file exists
  file:
    path: /etc/file.txt
    state: touch

1
state: fileファイルを作成しません。docs.ansible.com/ansible/file_module.htmlを
Michael Krupp

2
この回答の最初の例は、ユーザーの質問の特定の状況、ユーザーによるコマンドモジュールの使用、およびansibleのベストプラクティスに基づいて、この質問に対する正しい回答と見なします。
apotek

2
vars:
  mypath: "/etc/file.txt"

tasks:
  - name: checking the file exists
    command: touch file.txt
    when: mypath is not exists

2
あなたはあなたの答えを説明しません、そしてwhen: mypath is not existsこの場合どういう意味ですか?mypath単純な文字列ではありませんか?
gcharbon 2018

1
Jinja2テンプレートは、パスの検証に役立ちます。Ansible Docsの
DreamUth 2018

10
これは、リモートではなく、コントローラ上のファイルをチェックすることに注意してください。
fefe 2018

2

これらの.stat.exists型チェックの多くを行うのは煩わしく、エラーが発生しやすいことがわかりました。たとえば、チェックモード(--check)を機能させるには、特別な注意が必要です。

ここに多くの答えが示唆しています

  • 取得して登録
  • レジスタ式が真のときに適用されます

ただし、これはコードのにおいである場合があるため、Ansibleを使用するより良い方法を常に探してください。特に、正しいモジュールを使用することには多くの利点があります。例えば

- name: install ntpdate
  package:
    name: ntpdate

または

- file:
    path: /etc/file.txt
    owner: root
    group: root
    mode: 0644

ただし、1つのモジュールを使用できない場合は、前のタスクの結果を登録および確認できるかどうかも調べます。例えば

# jmeter_version: 4.0 
- name: Download Jmeter archive
  get_url:
    url: "http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-{{ jmeter_version }}.tgz"
    dest: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
    checksum: sha512:eee7d68bd1f7e7b269fabaf8f09821697165518b112a979a25c5f128c4de8ca6ad12d3b20cd9380a2b53ca52762b4c4979e564a8c2ff37196692fbd217f1e343
  register: download_result

- name: Extract apache-jmeter
  unarchive:
    src: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
    dest: "/opt/jmeter/"
    remote_src: yes
    creates: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}"
  when: download_result.state == 'file'

注意when:creates:そうは--check出ていないエラー

私がこれを言及するのは、これらの理想的ではないプラクティスはしばしばペアになる、つまりapt / yumパッケージがないため、1)ダウンロードして2)解凍する必要があるためです

お役に立てれば


2

呼び出しstatが遅く、ファイルの存在チェックに必要のない多くの情報を収集することを発見しました。
解決策を探すのにしばらく時間を費やした後、私は次の解決策を発見しました。

- raw: test -e /path/to/something && echo true || echo false
  register: file_exists

- debug: msg="Path exists"
  when: file_exists == true

1
他の人がこの回答を理解できるように、回答に問題の内容とこのスニペットがどのように解決するかを説明してください
FZs

1

Ansible statモジュールを使用してファイルを登録し、いつモジュールを使用して条件を適用できます。

- name: Register file
      stat:
        path: "/tmp/test_file"
      register: file_path

- name: Create file if it doesn't exists
      file: 
        path: "/tmp/test_file"
        state: touch
      when: file_path.stat.exists == False

0

**

when条件を使用してファイルがAnsibleに存在するかどうかを確認する方法

**

以下は、ファイルがOS側に存在するときにファイルを削除するために使用したansibleプレイです。

 - name: find out /etc/init.d/splunk file exists or not'
      stat:
        path: /etc/init.d/splunk
      register: splunkresult
      tags:
        - always

    - name: 'Remove splunk from init.d file if splunk already running'
      file:
        path: /etc/init.d/splunk
        state: absent
      when: splunkresult.stat.exists == true
      ignore_errors: yes
      tags:
        - always

以下のようなプレイコンディションを使用しました

when: splunkresult.stat.exists == true --> Remove the file

あなたの要件に基づいて真/偽を与えることができます

when: splunkresult.stat.exists == false
when: splunkresult.stat.exists == true

0

特定のファイルが存在することを確認するだけの場合(たとえば、ファイルはansibleとは異なる方法で作成する必要があるため)、存在しない場合は失敗します。これを行うには、次のようにします。

- name: sanity check that /some/path/file exists
  command: stat /some/path/file
  check_mode: no # always run
  changed_when: false # doesn't change anything

0

他の答えを補完するための相対パスに関するメモ。

インフラストラクチャをコードとして実行するとき、私は通常、相対パスを受け入れるロールとタスクを使用します。これらのロールで定義されたファイルに対しては特にです。

playbook_dirやrole_pathなどの特別な変数は、存在をテストするために必要な絶対パスを作成するのに非常に役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.