Ansible'da bir dosya olup olmadığı nasıl kontrol edilir?


128

İç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:


209

Ö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

1
Ya dizin yoksa?
ram4nd

2
Dizin yoksa, kayıt defterinde stat_resultbir stat_result.state.existsFalse 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
Will

1
ne zaman: stat_result.stat.exists tanımlanır ve stat_result.stat.exists
danday74

2
Bunun için teşekkürler. Öğrenirse Ayrıca yazabilirsiniz: when: stat_result.stat.exists == Falseiçin when: not stat_result.stat.existsdaha doğal okumak için isterseniz.
racl101

1
Lütfen "Foo == False" yerine "Foo değil" mi kullanırsınız?
Matthias Urlichs

32

İ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

Görünüşe göre en son sürümlerde, "=", "<", ">" yerine "eşittir" vb. "Tam metin karşılaştırmaları" kullanılırken bir uyarı var.
Buzut

24

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

16

Genel olarak bunu stat modülüyle yaparsınız . Ama komuta modülü vardır createsbu ç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

1
state: filedosya oluşturmaz. Bkz. Docs.ansible.com/ansible/file_module.html
Michael Krupp

2
Bu yanıttaki ilk örneği, kullanıcının sorusunun belirli koşullarına, kullanıcının komut modülünü kullanımına ve yanıtlanabilir en iyi uygulamalara dayalı olarak bu soru için doğru yanıtı olarak değerlendireceğim.
apotek

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

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

2
Cevabını açıklamıyorsun ve when: mypath is not existsbu durumda ne anlama geliyor? mypathBasit bir dizi değil mi?
gcharbon

1
Jinja2 şablonu, yolu doğrulamak için burada yardımcı olur. Ansible
Docs'ta

10
Bunun uzaktan kumandadaki dosyaları kontrol ettiğini unutmayın.
fefe

2

Bu .stat.existstü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

  • al ve kaydol
  • kayıt ifadesi doğru olduğunda uygula

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 --checkdış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


2

Çağrının statyavaş 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

1
Başkalarının bu yanıtı anlamasına yardımcı olmak için lütfen cevabınızda sorunun ne olduğunu ve bu pasajın bunu nasıl çözeceğini açıklayın
FZs

1

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

0

**

Ansible'da bir dosyanın mevcut olup olmadığı, ne zaman koşuluyla kontrol edilir

**

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

0

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

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.