回答:
最初に宛先ファイルが存在するかどうかを確認してから、その結果の出力に基づいて決定を行うことができます。
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
stat_result
はstat_result.state.exists
Falseになります(2番目のタスクが実行されるときです)。あなたはここでのstatモジュールの詳細を見ることができます:docs.ansible.com/ansible/stat_module.html
when: stat_result.stat.exists == False
にwhen: not stat_result.stat.exists
あなたはそれがより自然な読みたい場合。
一般に、これは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
state: file
ファイルを作成しません。docs.ansible.com/ansible/file_module.htmlを
vars:
mypath: "/etc/file.txt"
tasks:
- name: checking the file exists
command: touch file.txt
when: mypath is not exists
when: mypath is not exists
この場合どういう意味ですか?mypath
単純な文字列ではありませんか?
これらの.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)解凍する必要があるためです
お役に立てれば
呼び出しstat
が遅く、ファイルの存在チェックに必要のない多くの情報を収集することを発見しました。
解決策を探すのにしばらく時間を費やした後、私は次の解決策を発見しました。
- raw: test -e /path/to/something && echo true || echo false
register: file_exists
- debug: msg="Path exists"
when: file_exists == true
**
**
以下は、ファイルが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
特定のファイルが存在することを確認するだけの場合(たとえば、ファイルは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