Antworten:
Sie können zuerst überprüfen, ob die Zieldatei vorhanden ist oder nicht, und dann basierend auf der Ausgabe des Ergebnisses eine Entscheidung 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: not stat_result.stat.exists
stat_result
Wert stat_result.state.exists
False (und dann wird die zweite Task ausgeführt). Sie können Details des stat-Moduls hier sehen: docs.ansible.com/ansible/stat_module.html
when: stat_result.stat.exists == False
an, when: not stat_result.stat.exists
wenn Sie möchten, dass es natürlicher liest.
Das stat- Modul erledigt dies und erhält 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
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
Im Allgemeinen würden Sie dies mit dem stat-Modul tun . Das Befehlsmodul hat jedoch die creates
Option, die 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? Die beste Vorgehensweise wäre, überhaupt nichts zu überprüfen und ansible seine Arbeit 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
state: file
erstellt keine Dateien. Siehe 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
das in diesem Fall? Ist das nicht mypath
eine einfache Zeichenfolge?
Ich finde es ärgerlich und fehleranfällig, viele dieser .stat.exists
Typprüfungen durchzuführen. Zum Beispiel benötigen sie besondere Sorgfalt, damit check mode ( --check
) funktioniert.
Viele Antworten hier schlagen vor
Manchmal ist dies jedoch ein Codegeruch. Suchen Sie daher immer nach besseren Möglichkeiten, Ansible zu verwenden. 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 sich registrieren und das Ergebnis einer vorherigen Aufgabe ü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:
so --check
kein Fehler aus
Ich erwähne dies, weil diese weniger als idealen Praktiken oft paarweise auftreten, dh kein apt / yum-Paket, so dass wir 1) herunterladen und 2) entpacken müssen
Hoffe das hilft
Es wurde festgestellt, dass das Aufrufen stat
langsam ist und viele Informationen sammelt, die für die Überprüfung der Dateiexistenz nicht erforderlich sind.
Nachdem ich einige Zeit nach einer Lösung gesucht hatte, entdeckte ich folgende Lösung, die viel schneller funktioniert:
- raw: test -e /path/to/something && echo true || echo false
register: file_exists
- debug: msg="Path exists"
when: file_exists == true
Sie können das Ansible stat- Modul verwenden, um die Datei zu registrieren, und das wann-Modul, um die Bedingung anzuwenden.
- 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
** **.
** **.
Unten ist die Ansible-Wiedergabe, die ich verwendet habe, um die Datei zu entfernen, wenn die Datei auf dem Betriebssystemende vorhanden ist.
- 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
Ich habe die Spielbedingungen wie unten verwendet
when: splunkresult.stat.exists == true --> Remove the file
Sie können je nach Anforderung wahr / falsch angeben
when: splunkresult.stat.exists == false
when: splunkresult.stat.exists == true
Wenn Sie nur sicherstellen möchten, dass eine bestimmte Datei vorhanden ist (z. B. weil sie anders als über ansible erstellt werden soll) und wenn dies nicht der Fall ist, können Sie Folgendes tun:
- 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
Ein Hinweis zu relativen Pfaden als Ergänzung zu den anderen Antworten.
Wenn ich Infrastruktur als Code verwende, verwende ich normalerweise Rollen und Aufgaben, die relative Pfade akzeptieren, insbesondere für Dateien, die in diesen Rollen definiert sind.
Spezielle Variablen wie playbook_dir und role_path sind sehr nützlich, um die absoluten Pfade zu erstellen, die zum Testen der Existenz erforderlich sind.