Ansible: come impostare in modo ricorsivo le autorizzazioni per directory e file


52

In ansible, posso fare questo:

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

E imposta in modo ricorsivo il proprietario, il gruppo e le autorizzazioni su 0775 su tutte le directory e i file in quel percorso. Ma voglio impostare le directory su 0775 e i file su 0664. C'è un modo per rendere ansible farlo?


Risposte:


34
file: dest=/foo/bar/somedir owner=root group=apache mode=u=rwX,g=rX,o=rX recurse=yes

imposterà le directory su 755 e i file su 644.


questo non funziona per i file.
mirza,

1
@Adam Chance Dov'è la magia? In che modo specificare u, g, o lo rende diverso dal numero (e dove è scritto 644?)
linuxbandit,

4
Il codice sorgente menziona che la gestione simbolica dell'ugo è la stessa della gestione di "man chmod" - la capitale X ha una gestione speciale basata sullo stato di dir / file e sui bit di esecuzione esistenti. github.com/ansible/ansible/blob/…
Marc Tamsky,

2
In altre parole, Xè xper le directory e niente per i file. Ed è così chmod, non ansibletratta la stringa di modalità. Vorrei Sche fosse trattato allo stesso modo.
x-yuri,

1
Ma si noti che rende i file eseguibili dal proprietario eseguibili da tutti .
x-yuri,

25

I moduli file / copia Ansible non ti danno la granularità di specificare le autorizzazioni in base al tipo di file, quindi molto probabilmente dovrai farlo manualmente facendo qualcosa del genere:

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

Ciò avrebbe l'effetto di ricorrere {{ path }}e modificare le autorizzazioni di ogni file o directory con le autorizzazioni specificate.

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


@luckytaxi la risposta fornita da gmangin non imposta in modo ricorsivo i permessi delle sottodirectory.
Dejay Clayton,

ahhhh hai ragione! ho visto recurseun'opzione ma non l'altra.
luckytaxi,

9

Se si desidera utilizzare il file del modulo in ansible, è possibile:

file: dest = / foo / bar / somedir proprietario = gruppo radice = modalità apache = 0644 recurse = yes

file: dest = / foo / bar / somedir proprietario = gruppo radice = modalità apache = 0775

Con questo metodo si imposta prima tutto il file (recurse = yes) su '644' e poi si imposta / foo / bar / somedir su '775'.

Questo non è perfetto perché cambierà l'autorizzazione alla tua directory ogni volta che giochi al tuo playbook. Ma almeno è idempotente, non come il comando del modulo.

Se non si desidera avere lo stato "modificato", è possibile utilizzare la stat del modulo. Elencherà tutti i file e le directory in / foo / bar / somedir in modo da registrare la risposta e quindi fare un ciclo solo su quei file.


7
La risposta imposterà tutti i file secondari e le sottodirectory su 644, impostando solo la directory di livello superiore su 775. È necessario che tutte le directory siano 775, comprese le sottodirectory.
Edward Ned Harvey,

Questo suggerimento non è idempotente. L'impostazione delle autorizzazioni prima su un valore, e successivamente su un altro, significa che le autorizzazioni verranno modificate ad ogni esecuzione.
Kevin Keane,

5

Non sono sicuro di quanto abbia senso impostare le directory su 0775 ( rwxrwxr-x) e i file su 0644 ( rw-r--r--): directory scrivibili in gruppo ma non file?

Se intendevi impostare i file su 0664 ( rw-rw-r--) per garantire che i file non siano eseguibili mentre le directory sono percorribili, esiste una soluzione elegante che prevede un solo chmodcomando:

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

Ecco come può essere utilizzato in Ansible :

- 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 -cstampa tutte le modifiche che possiamo usare comodamente per popolare lo stato "modificato" in Ansible . Spero abbia senso.


3

Per modificare le mod solo quando necessario:

- 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 {} \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.