it-swarm.com.de

Wie überprüfe ich, ob eine Datei in Ansible existiert?

Ich muss prüfen, ob eine Datei in /etc/ Existiert. Wenn die Datei existiert, muss ich die Aufgabe überspringen. Hier ist der Code, den ich benutze:

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

Wenn der file.txt Existiert, muss ich die Aufgabe überspringen.

83
E Dine Sh

Sie können zunächst prüfen, ob die Zieldatei vorhanden ist oder nicht, und dann eine Entscheidung anhand der Ausgabe des Ergebnisses treffen.

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: stat_result.stat.exists == False 
136
Arbab Nazar

Das stat Modul erledigt dies ebenso wie viele andere Informationen für Dateien. Aus der Beispieldokumentation:

- 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
23
Bruce P

Dies kann mit dem stat-Modul erreicht werden, um die Aufgabe zu überspringen, wenn eine Datei vorhanden ist.

- 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
18
Rajeshkanna

Im Allgemeinen würden Sie dies mit dem stat-Modul tun. Aber das Befehlsmodul hat die Option creates, was dies sehr einfach macht:

- name: touch file
  command: touch /etc/file.txt
  args:
    creates: /etc/file.txt

Ich denke, Ihr Touch-Befehl ist nur ein Beispiel? Best Practice wäre, gar nichts zu überprüfen und ansible seinen Job machen zu lassen - mit dem richtigen Modul. Wenn Sie also sicherstellen möchten, dass die Datei vorhanden ist, verwenden Sie das Dateimodul:

- name: make sure file exists
  file:
    path: /etc/file.txt
    state: touch
12
udondan
vars:
  mypath: "/etc/file.txt"

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

Ich finde es kann ärgerlich und fehleranfällig sein, viele dieser .stat.exists Typprüfungen. Zum Beispiel benötigen sie besondere Sorgfalt, um den Überprüfungsmodus (--check) Arbeiten.

Viele Antworten hier schlagen vor

  • holen und registrieren
  • anwenden, wenn der Registerausdruck wahr ist

Manchmal ist dies jedoch ein Codegeruch. Suchen Sie daher immer nach besseren Verwendungsmöglichkeiten für Ansible. Insbesondere die Verwendung des richtigen Moduls bietet viele Vorteile. z.B.

- name: install ntpdate
  package:
    name: ntpdate

oder

- file:
    path: /etc/file.txt
    owner: root
    group: root
    mode: 0644

Wenn es jedoch nicht möglich ist, ein Modul zu verwenden, prüfen Sie auch, ob Sie das Ergebnis einer vorherigen Aufgabe registrieren und überprüfen können. z.B.

# 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'

Beachten Sie das when: aber auch das creates: damit --check versagt nicht

Ich erwähne dies, weil diese weniger als idealen Praktiken oft paarweise vorkommen, d. H. Kein Apt/Yum-Paket, sodass wir 1) herunterladen und 2) entpacken müssen

Hoffe das hilft

2
KCD