Bagaimana cara memeriksa apakah file ada di Ansible?


128

Saya harus memeriksa apakah ada file di /etc/. Jika file tersebut ada maka saya harus melewatkan tugas tersebut. Ini kode yang saya gunakan:

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

Jawaban:


208

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

1
Bagaimana jika direktori tidak ada?
ram4nd

2
Jika direktori tidak ada, maka register stat_resultakan memiliki stat_result.state.existsFalse (dan saat itulah tugas kedua dijalankan). Anda dapat melihat detail modul stat di sini: docs.ansible.com/ansible/stat_module.html
Akankah

1
ketika: stat_result.stat.exists ditentukan dan stat_result.stat.exists
danday74

2
Terima kasih untuk ini. Juga, jika ketahuan Anda dapat menulis: when: stat_result.stat.exists == Falseke when: not stat_result.stat.existsjika Anda ingin membaca lebih natural.
racl101

1
Maukah Anda menggunakan "bukan Foo" daripada "Foo == False"?
Matthias Urlichs

32

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

Sepertinya di versi terbaru, ada peringatan saat menggunakan "perbandingan teks lengkap" seperti "adalah" dll, bukan "=", "<", ">" dll.
Buzut

24

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

16

Secara umum Anda akan melakukan ini dengan modul stat . Tetapi modul perintah memiliki createsopsi 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

1
state: filetidak membuat file. Lihat docs.ansible.com/ansible/file_module.html
Michael Krupp

2
Saya akan menganggap contoh pertama dalam jawaban ini sebagai jawaban yang benar untuk pertanyaan ini, berdasarkan keadaan khusus pertanyaan pengguna, penggunaan modul perintah oleh pengguna, dan praktik terbaik yang mungkin.
apotek

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

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

2
Anda tidak menjelaskan jawaban Anda, dan apa when: mypath is not existsartinya dalam kasus ini? Bukankah mypathstring sederhana?
gcharbon

1
Template Jinja2 membantu di sini untuk memvalidasi jalur. Contoh lainnya ada di Ansible Docs
DreamUth

10
Perhatikan ini memeriksa file pada pengontrol, bukan remote.
fefe

2

Menurut saya, melakukan banyak .stat.existspemeriksaan jenis ini dapat mengganggu dan rentan kesalahan . Misalnya, mereka memerlukan perhatian ekstra agar mode check ( --check) berfungsi.

Banyak jawaban di sini yang menyarankan

  • dapatkan dan daftar
  • terapkan jika ekspresi register benar

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 --checktidak 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


2

Menemukan bahwa panggilan statlambat 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

1
Harap jelaskan dalam jawaban Anda, apa masalahnya, dan bagaimana cuplikan ini akan menyelesaikannya, untuk membantu orang lain memahami jawaban ini
FZs

1

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

0

**

Bagaimana memeriksa apakah sebuah file ada di Ansible using when condition

**

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

0

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

0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.