Ansible: Comment définir de manière récursive les autorisations de répertoire et de fichier

52

En ansible, je peux faire ceci:

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

Et il définit de manière récursive le propriétaire, le groupe et les autorisations sur 0775 dans tous les répertoires et fichiers de ce chemin. Mais je veux définir les répertoires sur 0775 et les fichiers sur 0664. Existe-t-il un moyen de le rendre compatible?

Edward Ned Harvey
la source

Réponses:

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

définira les répertoires sur 755 et les fichiers sur 644.

Adam Chance
la source
cela ne fonctionne pas pour les fichiers.
mirza
1
@Adam Chance Où est la magie? En quoi spécifier u, g, o le rend différent du nombre (et où est écrit 644?)
linuxbandit
4
Le code source mentionne que la gestion symbolique de ugo est la même que celle de "man chmod" - capital X dispose d’une gestion spéciale basée sur le statut dir / fichier et les bits d’exécution existants. github.com/ansible/ansible/blob/…
Marc Tamsky
2
En d'autres termes, Xc'est xpour les répertoires, et rien pour les fichiers. Et c'est comment chmod, ne ansibletraite pas la chaîne de mode. Je souhaite Sserait traité de même.
x-yuri le
1
Mais notez que cela rend les fichiers exécutables par le propriétaire exécutable par tous .
x-yuri le
25

Les modules de copie / fichier Ansible ne vous donnent pas la granularité de spécifier des autorisations en fonction du type de fichier. Vous devrez probablement le faire manuellement en procédant comme suit:

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

Celles-ci auraient pour effet de revenir en arrière {{ path }}et de modifier les autorisations de chaque fichier ou répertoire en fonction des autorisations spécifiées.

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

Zulakis
la source
@luckytaxi, la réponse fournie par gmangin ne définit pas de manière récursive les autorisations des sous-répertoires.
Dejay Clayton
ahhhh vous avez raison! J'ai vu une recurseoption mais pas l'autre.
luckytaxi
9

Si vous souhaitez utiliser le fichier de module dans ansible, vous pouvez:

fichier: dest = / foo / bar / somedir propriétaire = groupe racine = apache mode = 0644 recurse = yes

fichier: dest = / foo / bar / somedir propriétaire = groupe racine = apache mode = 0775

Avec cette méthode, vous définissez tout d'abord le fichier (recurse = yes) sur '644', puis sur / foo / bar / somedir sur '775'.

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

Si vous ne voulez pas avoir le statut 'changé', vous pouvez utiliser le module stat. Il listera tous les fichiers et le répertoire dans / foo / bar / somedir afin que vous enregistriez la réponse et ensuite fassiez une boucle sur ces fichiers uniquement.

Gmangin
la source
7
Votre réponse définira tous les sous-fichiers et sous-répertoires sur 644, tandis que seul le répertoire de niveau supérieur sera défini sur 775. Il est nécessaire que tous les répertoires soient au nombre de 775, y compris les sous-répertoires.
Edward Ned Harvey
Cette suggestion n'est pas idempotente. Le fait de définir d'abord les autorisations sur une valeur, puis sur une autre, signifie que les autorisations seront modifiées à chaque exécution.
Kevin Keane
5

Je ne sais pas à quel point il serait judicieux de définir les répertoires sur 0775 ( rwxrwxr-x) et les fichiers sur 0644 ( rw-r--r--): les répertoires inscriptibles par groupe, mais pas les fichiers?

Si vous vouliez définir les fichiers à 0664 ( rw-rw-r--) pour vous assurer que les fichiers ne sont pas exécutables alors que les répertoires sont traversables, il existe une solution élégante impliquant une seule chmodcommande:

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 -caffiche toutes les modifications que nous pouvons facilement utiliser pour renseigner le statut "modifié" dans Ansible . J'espère que cela a du sens.

Onlyjob
la source
3

Pour changer les mods seulement quand cela est nécessaire:

- 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
la source