İçinde bir dosya olup olmadığını kontrol etmeliyim /etc/
. Dosya mevcutsa, görevi atlamam gerekir. İşte kullandığım kod:
- name: checking the file exists
command: touch file.txt
when: $(! -s /etc/file.txt)
İçinde bir dosya olup olmadığını kontrol etmeliyim /etc/
. Dosya mevcutsa, görevi atlamam gerekir. İşte kullandığım kod:
- name: checking the file exists
command: touch file.txt
when: $(! -s /etc/file.txt)
Yanıtlar:
Önce hedef dosyanın var olup olmadığını kontrol edebilir ve ardından sonucunun çıktısına göre bir karar verebilirsiniz:
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
bir stat_result.state.exists
False olacaktır (ve bu, ikinci görevin çalıştığı zamandır). Burada istatistik modülünün detaylarını görebilirsiniz: docs.ansible.com/ansible/stat_module.html
when: stat_result.stat.exists == False
için when: not stat_result.stat.exists
daha doğal okumak için isterseniz.
İstatistik modülü gibi dosyalar için diğer birçok bilgi elde yanı yapacağız. Örnek belgelerden:
- 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
Bu, dosya mevcut olduğunda görevi atlamak için stat modülüyle gerçekleştirilebilir.
- 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
Genel olarak bunu stat modülüyle yaparsınız . Ama komuta modülü vardır creates
bu çok basit hale getirir seçeneği:
- name: touch file
command: touch /etc/file.txt
args:
creates: /etc/file.txt
Sanırım dokunmatik komutunuz sadece bir örnek mi? En iyi uygulama hiçbir şeyi kontrol etmemek ve ansible'ın işini doğru modülle yapmasına izin vermektir. Dolayısıyla, dosyanın var olduğundan emin olmak istiyorsanız, dosya modülünü kullanmalısınız:
- name: make sure file exists
file:
path: /etc/file.txt
state: touch
state: file
dosya oluşturmaz. Bkz. 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
bu durumda ne anlama geliyor? mypath
Basit bir dizi değil mi?
Bu .stat.exists
tür kontrollerin çoğunu yapmanın can sıkıcı ve hataya açık olabileceğini düşünüyorum . Örneğin, check mode ( --check
) işlevinin çalışması için ekstra özen gerektirirler .
Buradaki birçok cevap öneriyor
Bununla birlikte, bazen bu bir kod kokusudur, bu nedenle her zaman Ansible'ı kullanmanın daha iyi yollarını arayın, özellikle doğru modülü kullanmanın birçok avantajı vardır. Örneğin
- name: install ntpdate
package:
name: ntpdate
veya
- file:
path: /etc/file.txt
owner: root
group: root
mode: 0644
Ancak mümkün olmadığında, bir modül kullanın, ayrıca bir önceki görevin sonucunu kaydedip kontrol edip edemeyeceğinizi araştırın. Örneğin
# 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'
Not when:
aynı zamanda creates:
öylesine --check
dışarı hata vermez
Bunu söylüyorum çünkü bu idealden daha az uygulamalar çiftler halinde geliyor, yani apt / yum paketi yok, bu yüzden 1) indirmeli ve 2) sıkıştırmalı
Bu yardımcı olur umarım
Çağrının stat
yavaş olduğunu ve dosya varlığını kontrol etmek için gerekli olmayan birçok bilgiyi topladığını keşfetti.
Çözüm aramak için biraz zaman harcadıktan sonra, çok daha hızlı çalışan aşağıdaki çözümü keşfettim:
- raw: test -e /path/to/something && echo true || echo false
register: file_exists
- debug: msg="Path exists"
when: file_exists == true
Ansible stat modülünü dosyayı kaydetmek için ve modülün koşulu ne zaman uygulayacağını kullanabilirsiniz.
- 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
**
**
Aşağıda, dosya işletim sisteminin sonunda mevcut olduğunda dosyayı kaldırmak için kullandığım yanıtlanabilir oynatım var.
- 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
Oyun koşullarını aşağıdaki gibi kullandım
when: splunkresult.stat.exists == true --> Remove the file
ihtiyacınıza göre doğru / yanlış verebilirsiniz
when: splunkresult.stat.exists == false
when: splunkresult.stat.exists == true
Yalnızca belirli bir dosyanın var olduğundan emin olmak istiyorsanız (f.ex. çünkü yanıt verilenden farklı bir şekilde oluşturulmalıdır) ve yoksa başarısız olursa, bunu yapabilirsiniz:
- 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
Diğer cevapları tamamlayacak göreceli yollarla ilgili bir not.
Altyapıyı kod olarak yaparken, özellikle bu rollerde tanımlanan dosyalar için, genellikle göreli yolları kabul eden roller ve görevler kullanıyorum.
Playbook_dir ve role_path gibi özel değişkenler , varoluşu test etmek için gereken mutlak yolları oluşturmak için çok kullanışlıdır.