Ansible: So legen Sie Verzeichnis- und Dateiberechtigungen rekursiv fest

52

In Ansible kann ich dies tun:

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

Außerdem werden der Besitzer, die Gruppe und die Berechtigungen für alle Verzeichnisse und Dateien in diesem Pfad rekursiv auf 0775 festgelegt. Aber ich möchte Verzeichnisse auf 0775 und Dateien auf 0664 setzen. Gibt es eine Möglichkeit, dies ansible zu machen?

Edward Ned Harvey
quelle

Antworten:

33
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.

Adam Chance
quelle
Dies funktioniert nicht für Dateien.
Mirza
1
@Adam Chance Wo ist die Magie? Inwiefern unterscheidet sich die Angabe von u, g, o von der Angabe der Zahl (und wo steht 644?)
linuxbandit
4
Der Quellcode erwähnt, dass das symbolische ugo-Handling dasselbe ist wie das Handling von "man chmod" - Capital X hat ein spezielles Handling, das auf dem dir / file-Status und den vorhandenen Execute-Bits basiert. github.com/ansible/ansible/blob/…
Marc Tamsky
2
Mit anderen Worten, Xist xfür Verzeichnisse und nichts für Dateien. Und das ist , wie chmod, nicht ansiblebehandelt den Modus - String. Ich wünschte, ich Swürde genauso behandelt.
X-Yuri
1
Beachten Sie jedoch, dass dadurch Dateien vom Eigentümer für alle ausführbar gemacht werden .
X-Yuri
25

Die Ansible-Datei- / Kopiermodule bieten nicht die Möglichkeit, Berechtigungen basierend auf dem Dateityp festzulegen. Sie müssten dies also 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 hätte zur Folge, {{ path }}dass die Berechtigungen aller Dateien oder Verzeichnisse rekursiv durchlaufen und in die angegebenen Berechtigungen geändert werden .

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

Zulakis
quelle
@luckytaxi Die Antwort von gmangin setzt die Berechtigungen von Unterverzeichnissen nicht rekursiv.
Dejay Clayton
ahhhh du hast recht! Ich sah die eine recurseOption, aber nicht die andere.
luckytaxi
9

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

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

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

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

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

Wenn Sie den Status nicht ändern möchten, können Sie das Modul stat verwenden. Es listet alle Dateien und Verzeichnisse in / foo / bar / somedir auf, so dass Sie die Antwort registrieren und dann nur diese Dateien in einer Schleife bearbeiten können.

Gmangin
quelle
7
Ihre Antwort setzt alle Unterdateien und Unterverzeichnisse auf 644, während nur das Verzeichnis der obersten Ebene auf 775 gesetzt wird. Alle Verzeichnisse müssen 775 sein, einschließlich der Unterverzeichnisse.
Edward Ned Harvey
Dieser Vorschlag ist nicht idempotent. Wenn Sie Berechtigungen zuerst auf einen Wert und später auf einen anderen Wert festlegen, werden die Berechtigungen bei jedem Durchlauf geändert.
Kevin Keane
5

Ich bin mir 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 beabsichtigen, Dateien auf 0664 ( rw-rw-r--) zu setzen, um sicherzustellen, dass Dateien nicht ausführbar sind, während Verzeichnisse durchsucht werden können, gibt es eine elegante Lösung, die nur einen chmodBefehl umfasst:

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

So kann es in Ansible verwendet werden :

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

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

Nurjob
quelle
3

So ändern Sie Modifikationen nur bei Bedarf:

- 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 {} \;
sjas
quelle