Was ist der einfachste Weg, eine leere Datei mit Ansible zu erstellen? Ich weiß, dass ich eine leere Datei im Verzeichnis files
speichern und dann auf den Remote-Host kopieren kann, aber ich finde das etwas unbefriedigend.
Eine andere Möglichkeit ist das Berühren einer Datei auf dem Remote-Host:
- name: create fake 'nologin' Shell
file: path=/etc/nologin state=touch owner=root group=sys mode=0555
Die Datei wird jedoch jedes Mal berührt und erscheint als gelbe Linie im Protokoll, was ebenfalls unbefriedigend ist ...
Gibt es eine bessere Lösung für dieses einfache Problem?
Die Dokumentation des Dateimoduls sagt aus
Wenn
state=file
, wird die Datei NICHT erstellt, wenn sie nicht vorhanden ist. Wenn Sie dieses Verhalten wünschen, lesen Sie das Kopier- oder Vorlagenmodul.
Daher verwenden wir das Kopiermodul und verwenden force=no
, um eine neue leere Datei nur zu erstellen, wenn die Datei noch nicht vorhanden ist (wenn die Datei vorhanden ist, bleibt ihr Inhalt erhalten).
- name: ensure file exists
copy:
content: ""
dest: /etc/nologin
force: no
group: sys
owner: root
mode: 0555
Dies ist eine deklarative und elegante Lösung.
So etwas (das Modul stat
zuerst verwendet, um Daten darüber zu sammeln und dann unter Verwendung einer Bedingung zu filtern) sollte funktionieren:
- stat: path=/etc/nologin
register: p
- name: create fake 'nologin' Shell
file: path=/etc/nologin state=touch owner=root group=sys mode=0555
when: p.stat.exists is defined and not p.stat.exists
Alternativ können Sie die changed_when
-Funktionalität nutzen.
Eine weitere Option mit dem Befehlsmodul:
- name: Create file
command: touch /path/to/file
args:
creates: /path/to/file
Das Argument "create" stellt sicher, dass diese Aktion nicht ausgeführt wird, wenn die Datei vorhanden ist.
Aufbauend auf der akzeptierten Antwort, wenn Sie möchten, dass die Datei bei jedem Durchlauf auf Berechtigungen geprüft wird, und diese entsprechend geändert werden, wenn die Datei vorhanden ist, oder einfach die Datei erstellen, falls sie nicht existiert, können Sie Folgendes verwenden:
- stat: path=/etc/nologin
register: p
- name: create fake 'nologin' Shell
file: path=/etc/nologin
owner=root
group=sys
mode=0555
state={{ "file" if p.stat.exists else "touch"}}
file: path=/etc/nologin state=touch
Volles Äquivalent von touch (neu in 1.4 und höher) - Verwenden Sie stat, wenn Sie den Zeitstempel der Datei nicht ändern möchten.
Es stellt sich heraus, dass ich nicht genug Ruf habe, um dies als Kommentar zu bezeichnen, was ein geeigneterer Ort dafür wäre:
Re. Antwort von AllBlackt: Wenn Sie das mehrzeilige Format von Ansible bevorzugen, müssen Sie die Anführungszeichen für state
anpassen.
- stat:
path: "/etc/nologin"
register: p
- name: create fake 'nologin' Shell
file:
path: "/etc/nologin"
owner: root
group: sys
mode: 0555
state: '{{ "file" if p.stat.exists else "touch" }}'
das Dateimodul bietet die Möglichkeit, Dateien zu berühren, ohne die Zeit zu ändern.
- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
mode: u+rw,g-wx,o-rwx
modification_time: preserve
access_time: preserve
Referenz: https://docs.ansible.com/ansible/latest/modules/file_module.html
Eine Kombination aus zwei Antworten mit einem Twist. Der Code wird als geändert erkannt, wenn die Datei erstellt oder die Berechtigung aktualisiert wird.
- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
mode: 0644
modification_time: preserve
access_time: preserve
changed_when: >
p.diff.before.state == "absent" or
p.diff.before.mode|default("0644") != "0644"
und eine Version, die auch den Eigentümer und die Gruppe korrigiert und als geändert erkennt, wenn diese korrigiert werden:
- name: Touch again the same file, but dont change times this makes the task idempotent
file:
path: /etc/foo.conf
state: touch
state: touch
mode: 0644
owner: root
group: root
modification_time: preserve
access_time: preserve
register: p
changed_when: >
p.diff.before.state == "absent" or
p.diff.before.mode|default("0644") != "0644" or
p.diff.before.owner|default(0) != 0 or
p.diff.before.group|default(0) != 0
Um eine Datei auf dem Remote-Computer mit dem Ad-hoc-Befehl zu erstellen
ansible client -m file -a"dest=/tmp/file state=touch"
Bitte korrigieren Sie mich, wenn ich falsch liege
Geändert, wenn die Datei nicht existiert. Erstellen Sie eine leere Datei.
- name: create fake 'nologin' Shell
file:
path: /etc/nologin
state: touch
register: p
changed_when: p.diff.before.state == "absent"