Как рекурсивно изменить владельца и группу в каталоге с помощью 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
Ответы
Ответ 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