如何将ruby-block中的哈希密码传递给用户资源

时间:2014-09-30 19:26:38

标签: ruby-on-rails ruby chef chef-recipe cookbook

我正在尝试实现一个通过读取属性文件中的密码来创建用户的食谱(非散列密码ex:root @ 123)

为此,我的食谱如下:

  1. 属性文件的内容(attributes / attr.rb)

    default['my']['instance']['users'] = [
      {uid: 1004,user_name:'m1',homedir:'/home/m1',password:'root@111'}
      {uid: 1003,user_name:'m2',homedir:'/home/m2',password:'root@222'},
      {uid: 1002, user_name:'m3',homedir:'/home/m3',password:'root@333'}
    ]
    
  2. 食谱

    password_hash=''
    node['my']['instance']['users'].each do |each_user|
        ruby_block "Generating hash password" do
            block do
                require 'digest/sha2'
                password=each_user['password']
                salt=rand(36**8).to_s(36)
                shadow_hash=password.crypt("$6$" + salt)
                password_hash=shadow_hash
            end
        end
    
        user each_user['user_name'] do
            password "#{password_hash}"
            home each_user['homedir']
            system true
            action :create
            manage_home true
            uid each_user['uid']
        end
    end
    
  3. 执行食谱后,相应地创建了相应的用户,但密码被设置为空白。

    看起来我尝试在用户资源的密码属性中访问的变量不正确。

    请让我如何解决这个问题。

    注意:在我的情况下,我不想使用数据库。

3 个答案:

答案 0 :(得分:1)

您不需要将该代码放在ruby_block中,只需将其置于正常循环中即可。

答案 1 :(得分:0)

我认为使用ruby_bloque是一种很好的做法。您只需通知提供者更改变量。 例如

password_hash=''
node['my']['instance']['users'].each do |each_user|
    ruby_block "Generating hash password" do
        block do
            require 'digest/sha2'
            password=each_user['password']
            salt=rand(36**8).to_s(36)
            shadow_hash=password.crypt("$6$" + salt)
            password_hash=shadow_hash
            user_resource = resources("user[#{each_user['user_name']}]")
            user_resource.password password_hash
        end
    end

    user each_user['user_name'] do
        password "#{password_hash}"
        home each_user['homedir']
        system true
        action :create
        manage_home true
        uid each_user['uid']
    end
end
抱歉我的英语。 最好的问候。

答案 2 :(得分:0)

password_hash变量是ruby块的本地范围,因此无法在用户块中访问。您实际上可以将所有ruby用于直接创建哈希到用户块中。