web-dev-qa-db-ja.com

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
21
zabumba

デフォルトのアクションを何も設定しないと、問題を引き起こす可能性のあるリソースが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

編集:以下のコメントを反映するように修正

12
Bill Warner

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

比較のために:

enter image description here

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
2
Amin Khoshnood

ディレクトリ階層を反復処理し、検出したすべてのファイルに対してファイルまたはディレクトリリソースを作成する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ガードを追加できることです。

2
lamont

これが許可を修正するための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として作成します。

2
jorfus

私はaction :createでプレーンリソースdirectoryを使用します。ドキュメントごと:

: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