Jawaban:
Pertama-tama Anda dapat memeriksa apakah file tujuan ada atau tidak, lalu membuat keputusan berdasarkan keluaran dari hasilnya:
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
akan memiliki stat_result.state.exists
False (dan saat itulah tugas kedua dijalankan). Anda dapat melihat detail modul stat di sini: docs.ansible.com/ansible/stat_module.html
when: stat_result.stat.exists == False
ke when: not stat_result.stat.exists
jika Anda ingin membaca lebih natural.
The Stat modul akan melakukan hal ini serta memperoleh banyak informasi lainnya untuk file. Dari dokumentasi contoh:
- 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
Ini dapat dicapai dengan modul stat untuk melewati tugas saat file ada.
- 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
Secara umum Anda akan melakukan ini dengan modul stat . Tetapi modul perintah memiliki creates
opsi yang membuatnya sangat sederhana:
- name: touch file
command: touch /etc/file.txt
args:
creates: /etc/file.txt
Saya kira perintah sentuh Anda hanyalah sebuah contoh? Praktik terbaiknya adalah tidak memeriksa apa pun dan membiarkan yang mungkin melakukan tugasnya - dengan modul yang benar. Jadi jika Anda ingin memastikan file tersebut ada, Anda akan menggunakan modul file:
- name: make sure file exists
file:
path: /etc/file.txt
state: touch
state: file
tidak membuat file. Lihat 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
artinya dalam kasus ini? Bukankah mypath
string sederhana?
Menurut saya, melakukan banyak .stat.exists
pemeriksaan jenis ini dapat mengganggu dan rentan kesalahan . Misalnya, mereka memerlukan perhatian ekstra agar mode check ( --check
) berfungsi.
Banyak jawaban di sini yang menyarankan
Namun, terkadang ini berbau kode jadi selalu cari cara yang lebih baik untuk menggunakan Ansible, khususnya ada banyak keuntungan menggunakan modul yang benar. misalnya
- name: install ntpdate
package:
name: ntpdate
atau
- file:
path: /etc/file.txt
owner: root
group: root
mode: 0644
Tetapi jika tidak memungkinkan, gunakan satu modul, selidiki juga apakah Anda dapat mendaftar dan memeriksa hasil dari tugas sebelumnya. misalnya
# 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'
Perhatikan when:
tetapi juga creates:
agar --check
tidak error
Saya menyebutkan ini karena seringkali praktik yang kurang ideal ini datang berpasangan yaitu tidak ada paket apt / yum jadi kami harus 1) mengunduh dan 2) unzip
Semoga ini membantu
Menemukan bahwa panggilan stat
lambat dan mengumpulkan banyak info yang tidak diperlukan untuk pemeriksaan keberadaan file.
Setelah menghabiskan beberapa waktu mencari solusi, saya menemukan solusi berikut, yang bekerja lebih cepat:
- raw: test -e /path/to/something && echo true || echo false
register: file_exists
- debug: msg="Path exists"
when: file_exists == true
Anda dapat menggunakan modul Ansible stat untuk mendaftarkan file, dan ketika modul menerapkan kondisi tersebut.
- 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
**
**
Di bawah ini adalah permainan yang bisa saya gunakan untuk menghapus file ketika file tersebut ada di akhir OS.
- 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
Saya telah menggunakan kondisi bermain seperti di bawah ini
when: splunkresult.stat.exists == true --> Remove the file
Anda dapat memberikan benar / salah berdasarkan kebutuhan Anda
when: splunkresult.stat.exists == false
when: splunkresult.stat.exists == true
Jika Anda hanya ingin memastikan ada file tertentu (f.ex. karena itu harus dibuat dengan cara yang berbeda dari melalui ansible) dan gagal jika tidak, maka Anda dapat melakukan ini:
- 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
Catatan tentang jalur relatif untuk melengkapi jawaban lainnya.
Saat melakukan infrastruktur sebagai kode, saya biasanya menggunakan peran dan tugas yang menerima jalur relatif, khususnya untuk file yang ditentukan dalam peran tersebut.
Variabel khusus seperti playbook_dir dan role_path sangat berguna untuk membuat jalur absolut yang diperlukan untuk menguji keberadaan.