79 votes

Ansible : Comment définir récursivement les permissions des répertoires et des fichiers

Dans ansible, je peux faire ça :

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

Et il définit récursivement le propriétaire, le groupe et les permissions à 0775 sur tous les répertoires et fichiers dans ce chemin. Mais je veux définir les répertoires à 0775, et les fichiers à 0664. Existe-t-il un moyen de faire en sorte qu'ansible fasse cela ?

81voto

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

mettra les répertoires à 755, et les fichiers à 644.

33voto

Zulakis Points 1504

Les modules Ansible file/copy ne vous donnent pas la granularité nécessaire pour de spécifier les permissions en fonction du type de fichier. faire cela manuellement en faisant quelque chose de ce genre :

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

Ceux-ci auraient pour effet de récurrence à travers {{ path }} et changer les permissions de chaque fichier ou répertoire en fonction des spécifiées.

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

12voto

gmangin Points 137

Si vous voulez utiliser le fichier du module dans ansible, vous pouvez le faire :

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

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

Avec cette méthode, vous définissez d'abord tous les fichiers (recurse=yes) à '644' et ensuite vous définissez /foo/bar/somedir à '775'.

Ce n'est pas parfait car cela changera la permission de votre répertoire à chaque fois que vous jouerez votre playbook. Mais au moins c'est idempotent, pas comme la commande module.

Si vous ne voulez pas avoir un statut "modifié", vous pouvez utiliser le module stat. Il listera tous les fichiers et répertoires dans /foo/bar/somedir pour que vous puissiez enregistrer la réponse et ensuite faire une boucle sur ces fichiers seulement.

6voto

Alex Gulin Points 21

Je ne suis pas sûr qu'il soit judicieux de définir les répertoires à 0775 ( rwxrwxr-x ) et des fichiers au 0644 ( rw-r--r-- ) : répertoires inscriptibles par groupe mais pas les fichiers ?

Si vous vouliez définir les fichiers à 0664 ( rw-rw-r-- ) pour s'assurer que les fichiers ne sont pas exécutables alors que les répertoires sont traversables, il existe une solution élégante qui n'implique qu'un seul chmod commandement :

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

Voici comment il peut être utilisé dans 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 -c imprime tous les changements que nous pouvons commodément utiliser pour remplir le statut "changé" dans Ansible . J'espère que cela a un sens.

5voto

Steven Degutis Points 315

Ne changer de mods qu'en cas de besoin :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X