Ansible: Wie werden Verzeichnis- und Dateiberechtigungen rekursiv festgelegt?

61080
Edward Ned Harvey

In Ansible kann ich das tun:

file: dest=/foo/bar/somedir owner=root group=apache mode=0775 recurse=yes 

Der Besitzer, die Gruppe und die Berechtigungen werden für alle Verzeichnisse und Dateien in diesem Pfad rekursiv auf 0775 gesetzt. Aber ich möchte Verzeichnisse auf 0775 und Dateien auf 0664 setzen. Gibt es eine Möglichkeit, Ansable zu machen, dies zu tun?

35
Verwandte: [Alle Ordnerberechtigungen mit einem Befehl ändern] (https://unix.stackexchange.com/q/349053/23408#349063). Scott vor 6 Jahren 0

5 Antworten auf die Frage

17
Zulakis

Die Datei- / Kopiermodule von Ansible bieten Ihnen nicht die Granularität der Angabe von Berechtigungen basierend auf dem Dateityp. Daher müssen Sie dies höchstwahrscheinlich manuell tun, indem Sie folgende Schritte ausführen:

- name: Ensure directories are 0755 command: find {{ path }} -type d -exec chmod 0755 {} \;  - name: Ensure files are 0644 command: find {{ path }} -type f -exec chmod 0644 {} \; 

Dies würde dazu führen, {{ path }}dass die Berechtigungen aller Dateien oder Verzeichnisse in den angegebenen Berechtigungen rekursiert und geändert werden .

Quelle: https://stackoverflow.com/a/28782805/1306186

@luckytaxi Die Antwort von gmangin setzt die Berechtigungen von Unterverzeichnissen nicht rekursiv. Dejay Clayton vor 7 Jahren 0
ahhhh du bist richtig! Ich sah die eine Option "recurse", aber nicht die andere. luckytaxi vor 7 Jahren 0
13
Adam Chance
file: dest=/foo/bar/somedir owner=root group=apache mode=u=rwX,g=rX,o=rX recurse=yes 

setzt Verzeichnisse auf 755 und Dateien auf 644.

Geprüft. Perfekt. Vielen Dank. :-) Edward Ned Harvey vor 6 Jahren 0
Dies funktioniert nicht für Dateien. motto vor 6 Jahren 0
@Adam Chance Wo ist der Zauber? Wie unterscheidet sich die Angabe von u, g, o von der Zahl (und wo wird 644 geschrieben?) linuxbandit vor 6 Jahren 0
Der Quellcode erwähnt, dass die symbolische Handhabung von ugo derselbe ist wie die von "man chmod". - capital X hat eine spezielle Behandlung, die auf dem dir / file-Status und vorhandenen Ausführungsbits basiert. https://github.com/ansible/ansible/blob/8606fb33f0e8954b588eaecec2d99b4a120fd4ad/lib/ansible/module_utils/basic.py#L1419-L1421 Marc Tamsky vor 6 Jahren 2
9
gmangin

Wenn Sie die Moduldatei in ansible verwenden möchten, können Sie:

file: dest = / foo / bar / somedir owner = Root-Gruppe = Apache-Modus = 0644 Recurse = Ja

file: dest = / foo / bar / somedir owner = Stammgruppe = Apache-Modus = 0775

Bei dieser Methode setzen Sie zuerst die gesamte Datei (recurse = yes) auf '644' und dann / foo / bar / somedir auf '775'.

Dies ist nicht perfekt, da dadurch die Verzeichnisberechtigung jedes Mal geändert wird, wenn Sie Ihr Playbook abspielen. Aber es ist zumindest idempotent, nicht wie der Modulbefehl.

Wenn Sie den Status nicht geändert haben möchten, können Sie das Modul stat verwenden. Es werden alle Dateien und Verzeichnisse in / foo / bar / somedir aufgelistet, so dass Sie die Antwort registrieren und dann nur diese Dateien in einer Schleife ausführen.

Ihre Antwort setzt alle Unterdateien und Unterverzeichnisse auf 644, während Sie für das oberste Verzeichnis nur 775 festlegen. Erforderlich ist, dass alle * Verzeichnisse * 775 einschließlich der Unterverzeichnisse sind. Edward Ned Harvey vor 8 Jahren 6
5
Onlyjob

Ich bin nicht sicher, wie sinnvoll es wäre, Verzeichnisse auf 0775 ( rwxrwxr-x) und Dateien auf 0644 ( rw-r--r--) zu setzen: gruppenbeschreibbare Verzeichnisse, aber keine Dateien?

Wenn Sie Dateien auf 0664 ( rw-rw-r--) setzen möchten, um sicherzustellen, dass Dateien nicht ausführbar sind, während Verzeichnisse durchsuchbar sind, gibt es eine elegante Lösung, die nur einen chmodBefehl enthält:

chmod -c -R ug=rw,o=r,a-x+X "{}" 

So kann es in Ansible verwendet werden :

- name: recursive chmod example command: | chmod -c -R ug=rw,o=r,a-x+X "{}" register: chmod_status changed_when: chmod_status.stdout != "" with_items: - "/home/user/sample/dir" 

chmod -cdruckt alle Änderungen, die wir bequem verwenden können, um den Status "geändert" in Ansible aufzufüllen . Ich hoffe es macht Sinn.

3
sjas

Mods nur bei Bedarf ändern:

- name: make dirs 0755  command: find {{ your_path }} -type d ! -perm 0755 -exec chmod 0755 {} \;  - name: make files 0644  command: find {{ your_path }} -type f ! -perm 0644 -exec chmod 0644 {} \;