web-dev-qa-db-fra.com

Comment changer récursivement le propriétaire et le groupe sur un répertoire avec Chef?

le resource_directory n'a que 2 actions disponibles: create et delete

Je dois mettre à jour le propriétaire et le groupe d'un répertoire de manière récursive.

Comment je fais ça?

en utilisant un simple resource_execute?

execute "chown-data-www" do
  command "chown -R www-data:www-data /var/www/myfoler"
  user "root"
  action :run
end
19
zabumba

Vous pouvez définir l'action par défaut à néant, puis disposer de ressources qui pourraient tout gâcher, informez le fixateur de perm:

execute "chown-data-www" do
  command "chown -R www-data:www-data /var/www/myfoler"
  user "root"
  action :nothing
end

resource "that may screw up perms" do
  stuff "one two three"
  notifies :run, execute "chown-data-www"
end

avec plus d'options, vous pourriez avoir l'action suivante: exécuter, mais pas si le dossier parent est déjà la perms correcte. Vous pouvez modifier ceci pour inclure un fichier/répertoire plus problématique /, ou avec une commande de recherche similaire à this

execute "chown-data-www" do
  command "chown -R www-data:www-data /var/www/myfoler"
  user "root"
  action :run
  not_if "stat -c %U /var/www/myfolder |grep www-data"
end

Edit: correction pour refléter le commentaire ci-dessous

10
Bill Warner

Nous pourrions écrire une ressource chef qui parcoure votre hiérarchie de répertoires et crée un fichier ou une ressource de répertoire pour chaque fichier trouvé, puis la configurer pour gérer le propriétaire et le groupe de ces fichiers. Vous n'aimerez pas cela, cependant, car si vous avez mille fichiers dans ce répertoire, vous aurez mille ressources de chef et vos convergences seront lentes.

En fait, si vous le souhaitez, vous pouvez créer votre propre code qui reproduit quelque chose de similaire à celui que j'ai écrit dans ticket tickets.opscode.com/browse/CHEF-690 auquel @name faisait référence, mais je ne le ferais pas. le recommander.

Si vous essayez d'empêcher les "manipulations" et de résoudre les problèmes de corruption aléatoire d'attributs d'utilisateur et de groupe, votre solution est probablement la bonne. Vous exécuterez toujours cette commande sur chaque convergence de chef et la ressource indiquera toujours qu'elle est mise à jour, mais la commande s'exécutera aussi vite que possible (chown -R est fondamentalement convergent et idempotent, car il vérifie les permanentes avant d'essayer de les définir. ). Vous ne recevrez pas de rapports sur les permanentes fixes, ce qui est le seul inconvénient.

Si vous essayez juste de réparer les permanentes une fois lors de la création d'un serveur, vous devriez alors ajouter une condition non_if afin de vérifier que si le répertoire racine a les perms correctes, vous ne l'exécutez pas à chaque fois. Cela vous donnera un comportement idempotent et n'exécutera pas la commande à chaque exécution, mais l'inconvénient est que si l'un des fichiers de cette structure de répertoires est endommagé par quelqu'un ou quelque chose dans le futur, il ne sera pas corrigé.

Il existe un cas d'utilisation possible pour une ressource unique qui se comporte comme chown -R, puis indique ce qu'elle a corrigé (ainsi qu'un tableau des fichiers dont les permanentes ont été modifiées), ce qui serait utile pour des cas tels que les rapports SOX et PCI-DSS, mais nous ne le faisons pas. t couvrent actuellement ce cas d’utilisation.

tl; dr est que votre solution est correcte et que vous pouvez ajouter un garde not_if si vous le souhaitez 

2
lamont

S'il s'agit d'un correctif unique des autorisations, votre chemin le plus court pourrait bien être simplement ssh. (Je viens de le faire après ma propre recherche.)

knife ssh 'name:*' "Sudo chown -R $user:$group /full/path/to/directory"

knife ssh 'name:*' "Sudo chmod -R 770 /full/path/to/directory"

Si je configurais tout cela à partir de zéro, je pense que je devrais configurer le répertoire directory path et les autorisations appropriées avec une ligne (REMARQUE: appliquez explicitement les permanentes à chaque parent du chemin).

%w[ /foo /foo/bar /foo/bar/baz ].each do |path|
  directory path do
    owner 'root'
    group 'root'
    mode '0755'
  end

puis créez chaque fichier fichier en tant que cookbook_file.

2
jorfus

J'utiliserais la ressource simple répertoire avec action :create. Par documentation:

:create
Default. Create a directory. If a directory already exists (but does not match), update that directory to match

https://docs.chef.io/resource_directory.html