在厨师食谱中将用户写入 .htpasswd

Write users to .htpasswd in chef recipe

在 chef-solo / vagrant 调用的厨师食谱中,我试图从用户对象编写一个 .htpasswd 文件。 我这样指定 vagrantfile 中的用户...

  chef.json = {
      :apache => {
          ...
          :my_users => {
              :john => "test",
              :matt => "test2"
          }
          ...

目前我的主厨食谱是这样的:

file "/etc/apache2/.htpasswd" do
  content "john:n5MfEoHOIQkKg"
  owner "#{node['apache']['user']}"
  group "#{node['apache']['group']}"
  mode '0644'
  action :create
end

如您所见,我在其中硬编码了 John 的凭据 - 但是,我不是 Ruby 开发人员,我在这里缺少一些非常基本的知识...

如何将 node['apache']['my_users'] 属性(在 chef.json 中定义)中的所有用户凭据循环写入文件 创建密码每个明文密码的哈希值?

注意:我试图避免为这个简单的文件使用模板。

htpasswd 手册页看起来像是对密码使用 MD5 散列。

也许您可以 generate md5 hashes 在食谱的 Ruby 代码中?

我使用 the LWRP Charlie suggested 完成了这项工作。

第一步是将用户的定义修改为适当的数组:

chef.json = {
    :apache => {
        ...
        :my_users => [ 
            { :username => "john", :password => "test1" },
            { :username => "matt", :password => "test2" }
        ]
        ...

我包括 htpasswd 对元数据和 bershelf 的依赖。 然后在我的食谱中,我使用 htpasswd 调用在循环中创建用户:

node[:apache][:my_users].each do |user|
  htpasswd "/etc/apache2/.htpasswd" do
    user user['username']
    password user['password']
  end
end

您可以使用本机方式,它需要 htpasswd 安装:

execute 'set password' do
  sensitive true
  command "htpasswd -cb /etc/htpasswd.users #{user} #{password}"
  creates '/etc/htpasswd.users'
end

file '/etc/htpasswd.users' do
  owner 'www-data'
  group 'www-data'
  mode 0o600
end