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
デフォルトのアクションを何も設定しないと、問題を引き起こす可能性のあるリソースがperm fixerに通知されます。
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
より多くのオプションを使用すると、アクション:runを実行できますが、親フォルダーがすでに正しい権限である場合はできません。これを変更して、より深い/問題のあるファイル/ディレクトリを含めるか、または this のようなfindコマンドを使用します。
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
編集:以下のコメントを反映するように修正
https://stackoverflow.com/a/28283020/1182292
答えは私のニーズを満たしましたが、ユーザーがApache2
またはgrep
であっても、apach
コマンドに問題があります。grep終了コードは0
になりますが、私は必要でしたユーザーは正確にApache
(CentOS 7.7のApache Webサーバーユーザー)である必要があります。
これが私のレシピです:
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
比較のために:
PS: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
ディレクトリ階層を反復処理し、検出したすべてのファイルに対してファイルまたはディレクトリリソースを作成するchefリソースを記述し、それらのファイルの所有者とグループを管理するように設定できます。ただし、そのディレクトリに1,000個のファイルがある場合、1000個のchefリソースが取得され、収束が遅くなるため、これは気に入らないでしょう。
あなたが望むなら、実際には、私がチケットで書いたもののような何かをするあなた自身のコードをロールする tickets.opscode.com/browse/CHEF-69 @nameが参照したが、私はそれをお勧めしません。
「改ざん」を防止し、ユーザーとグループの属性のランダムな破損を修正しようとしている場合、ソリューションはおそらく正しいです。すべてのchef収束で常にそのコマンドを実行し、リソースは常に更新されているように表示されますが、コマンドは可能な限り高速に実行されます(chown -Rは基本的に収束してべき等であり、permsを設定する前にpermsをチェックします。 )。唯一の欠点である固定パーマに関するレポートは返されません。
サーバーの構築時にパーマを一度修正するだけの場合は、そこにnot_if条件をスローして、ルートディレクトリに適切なパーマがあるかどうかを毎回実行しないことを確認する必要があります。これにより、べき等の動作が得られ、実行ごとにコマンドが実行されるわけではありませんが、そのディレクトリ構造の下にあるファイルの1つが将来、誰かまたは何かによってパーマが壊された場合、修正されないという欠点があります。
ここでは、chown -Rのように動作し、修正されたもの(およびpermsが変更されたファイルの配列)を報告する単一のリソースの使用例が考えられます。これは、SOXおよびPCI-DSSレポートのような場合に役立ちますが、現在、そのユースケースをカバーしています。
tl; drは、ソリューションが問題なく、必要に応じてnot_ifガードを追加できることです。
これが許可を修正するための1回限りのものである場合、最短のパスは単に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 パスと適切な権限を1行で設定する必要があると思います(注:パスの各親に権限を明示的に適用してください)
%w[ /foo /foo/bar /foo/bar/baz ].each do |path|
directory path do
owner 'root'
group 'root'
mode '0755'
end
次に、個々の file をcookbook_fileとして作成します。
私はaction :create
でプレーンリソースdirectoryを使用します。ドキュメントごと:
:create
Default. Create a directory. If a directory already exists (but does not match), update that directory to match