Ansible: Cómo establecer recursivamente permisos de directorio y archivo

52

En ansible, puedo hacer esto:

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

Y establece recursivamente el propietario, el grupo y los permisos en 0775 en todos los directorios y archivos en esa ruta. Pero quiero establecer directorios en 0775 y archivos en 0664. ¿Hay alguna forma de hacer que ansible haga esto?

Edward Ned Harvey
fuente

Respuestas:

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

establecerá directorios en 755 y archivos en 644.

Adam Chance
fuente
Esto no funciona para los archivos.
mirza
1
@ Adam Chance ¿Dónde está la magia? ¿Cómo se especifica u, g, o hacen que sea diferente del número (y donde es escrito 644?)
linuxbandit
44
El código fuente menciona que el manejo simbólico de ugo es el mismo que el manejo de "man chmod": el capital X tiene un manejo especial basado en el estado del archivo / directorio y los bits de ejecución existentes. github.com/ansible/ansible/blob/…
Marc Tamsky
2
En otras palabras, Xes xpara directorios, y nada para archivos. Y así es como chmod, no ansibletrata la cadena de modo. Desearía Sser tratado de la misma manera.
x-yuri
1
Pero hacer la nota, que hace que los archivos ejecutables por el propietario ejecutable por todos .
x-yuri
25

Los módulos de archivo / copia de Ansible no le brindan la granularidad de especificar permisos basados ​​en el tipo de archivo, por lo que lo más probable es que necesite hacer esto manualmente haciendo algo en este sentido:

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

Estos tendrían el efecto de recurrir {{ path }}y cambiar los permisos de cada archivo o directorio a los permisos especificados.

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

Zulakis
fuente
@luckytaxi, la respuesta proporcionada por gmangin no establece de forma recursiva los permisos de los subdirectorios.
Dejay Clayton
ahhhh tienes razón! Vi la una recurseopción pero no la otra.
luckytaxi
9

Si desea utilizar el archivo del módulo en ansible, puede:

file: dest = / foo / bar / somedir propietario = grupo raíz = modo apache = 0644 recurse = yes

file: dest = / foo / bar / somedir propietario = grupo raíz = modo apache = 0775

Con este método, primero establece todo el archivo (recurse = yes) en '644' y luego establece / foo / bar / somedir en '775'.

Esto no es perfecto porque cambiará el permiso de tu directorio cada vez que juegues tu libro de jugadas. Pero al menos es idempotente, no como el comando del módulo.

Si no desea que el estado 'haya cambiado', puede usar la estadística del módulo. Enumerará todos los archivos y el directorio en / foo / bar / somedir para que registre la respuesta y luego haga un bucle solo en esos archivos.

Gmangin
fuente
77
Su respuesta establecerá todos los subfiles y subdirectorios en 644, mientras configura solo el directorio de nivel superior en 775. La necesidad es que todos los directorios sean 775, incluidos los subdirectorios.
Edward Ned Harvey
Esta sugerencia no es idempotente. Establecer permisos primero en un valor, y luego en otro, significa que los permisos cambiarán en cada ejecución.
Kevin Keane
5

No estoy seguro de qué sentido tendría establecer directorios en 0775 ( rwxrwxr-x) y archivos en 0644 ( rw-r--r--): directorios de escritura grupal pero no archivos.

Si desea establecer archivos en 0664 ( rw-rw-r--) para asegurarse de que los archivos no sean ejecutables mientras los directorios son transitables, entonces hay una solución elegante que involucra solo un chmodcomando:

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

Así es como se puede usar en 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 -cimprime todos los cambios que podemos usar convenientemente para completar el estado "modificado" en Ansible . Espero que tenga sentido.

Solo trabajo
fuente
3

Para cambiar solo las modificaciones cuando sea necesario:

- 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
fuente