Подтвердить что ты не робот

Как рекурсивно изменить владельца и группу в каталоге с помощью Chef?

resource_directory имеет только 2 доступных действия: create и delete

Мне нужно обновить владельца и группу каталога рекурсивно.

Как это сделать?

используя простой resource_execute?

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

Ответ 1

Вы можете установить действие по умолчанию в ничто, а затем иметь ресурсы, которые могут испортить ситуацию, уведомив об этом средство для исправления ошибок:

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

с большим количеством опций вы можете выполнить действие: запустить, но не в том случае, если в родительской папке уже указаны правильные параметры. Вы можете изменить это, чтобы включить более глубокий/проблемный файл/каталог, или с помощью команды поиска, аналогичной 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) = "www-data" ]'
end

Изменение: исправить, чтобы отразить комментарий ниже

Ответ 2

Мы могли бы написать ресурс chef, который выполняет итерацию через вашу иерархию каталогов и создает ресурс файла или каталога для каждого найденного файла, а затем настраивает его для управления владельцем и группой в этих файлах. Однако вам это не понравится, поскольку, если у вас есть тысяча файлов в этом каталоге, вы получите тысячи ресурсов шеф-повара, и ваши сходимости будут медленными.

Если вы хотите, на самом деле, можете перевернуть свой собственный код, который сделает что-то вроде того, что я написал в билете tickets.opscode.com/browse/CHEF-690 который @name ссылается, но я бы не рекомендовал его.

Если вы пытаетесь предотвратить "фальсификацию" и исправить случайное повреждение атрибутов пользователей и групп, ваше решение, вероятно, правильно. Вы всегда будете выполнять эту команду при каждой конвергенции повара, и ресурс всегда будет отображаться как обновленный, но команда будет выполняться как можно быстрее (chown -R в основном конвергентный и идемпотентный, когда он проверяет perms, прежде чем пытаться установить perms). Вы не получите отчет о фиксированных perms, что является единственным недостатком.

Если вы просто пытаетесь исправить perms один раз при создании сервера, тогда вы должны бросить там условное условие not_if, чтобы проверить, что если корневой каталог имеет правильные perms, вы не запускаете его каждый раз. Это даст вам идемпотентное поведение и не будет выполнять команду при каждом запуске, но недостаток явно заключается в том, что если один из файлов в этой структуре каталогов имеет свои perms, искаженные кем-то или чем-то в будущем, то он не будет исправлен.

Здесь существует возможный прецедент для одного ресурса, который ведет себя как chown -R, а затем сообщает, что он исправил (и массив файлов с измененными perms), что было бы полезно для таких случаев, как SOX и PCI-DSS, но мы в настоящее время не рассматриваем этот вариант использования.

tl; dr - то, что ваше решение в порядке, и вы можете добавить защитник not_if, если вам нравится

Ответ 3

Если это как одноразовый для исправления разрешений, вашим самым коротким путем может быть только нож ssh. (Я только что сделал это после того, как оказался в моем собственном поиске.)

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

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

Если бы я настраивал это с нуля, мне кажется, мне нужно настроить directory путь и правильные разрешения с одной строкой (ПРИМЕЧАНИЕ: явно применяйте perms для каждого родителя в пути)

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

а затем создайте каждый file как файл cookbook_file.

Ответ 4

fooobar.com/questions/277223/...

Ответ удовлетворил мою потребность, но есть проблема с командой grep, даже если пользователь - apache2 или apach, код выхода grep будет 0, но мне нужно, чтобы пользователь был точно apache (Apache пользователь веб-сервера на CentOS 7.7).

Вот мой рецепт:

node["apache"]["sites"].each do |sitename, data|
  document_root = "/content/sites/#{sitename}"

  directory document_root do
    action :create
    mode "0755"
    recursive true
    owner "apache"
    group "apache"
  end

  execute "chown_to_apache_user" do
    command "chown -R apache:apache /content"
    user "root"
    action :run
    not_if '[ $(stat -c %U /content/) = "apache" ]'
  end

  template "/etc/httpd/conf.d/#{sitename}.conf" do
    source "vhost.erb"
    mode "0644"
    variables(
      :document_root => document_root,
      :port => data["port"],
      :domain => data["domain"]
    )
    notifies :restart, "service[httpd]"
  end

end

Для сравнения:

enter image description here

P.S.: также проверить group:

node["apache"]["sites"].each do |sitename, data|
  document_root = "/content/sites/#{sitename}"

  directory document_root do
    action :create
    mode "0755"
    recursive true
    owner "apache"
    group "apache"
  end

  execute "chown_to_apache_user" do
    command "chown -R apache:apache /content"
    user "root"
    action :run
    not_if '[ $(stat -c %U /content/) = "apache" ] && [ $(stat -c %G /content/) = "apache" ]'
  end

  template "/etc/httpd/conf.d/#{sitename}.conf" do
    source "vhost.erb"
    mode "0644"
    variables(
      :document_root => document_root,
      :port => data["port"],
      :domain => data["domain"]
    )
    notifies :restart, "service[httpd]"
  end

end

Ответ 5

Я бы использовал простой ресурс каталог с action :create. По документации:

: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