wake-up-neo.net

Wie erstelle ich eine leere Datei mit Ansible?

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?

86
dokaspar

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.

136
René Pijl

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.

32
ceejayoz

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.

24
Leynos

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"}}
11
AllBlackt

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.

9
jalmasi

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" }}'
3
Andrew Richards

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

3
Ravi Kulkarni

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
0
Roch Bourdon

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"
0
Dmitry Balashov