使用Chef Vault在chef中创建多个用户

时间:2016-08-21 19:46:41

标签: ruby chef chef-recipe cookbook

我的主厨库中有以下用户凭据

$ knife vault show testusers
user1
user2
user3

每个用户的内容如下所示:

knife vault show testusers user1
comment:  user one
id:       user1
password: secretp@ss
shell:    /bin/bash

我正在尝试编写一个循环通过testuser保险库的配方,并根据每个保险库项目的ID创建用户。这样我就可以轻松地使用新用户更新testuser保险库并重新运行配方,以便将来添加用户。

这是我迄今为止创建的食谱的副本,但它不起作用

chef_gem 'chef-vault' do
  compile_time true if respond_to?(:compile_time)
end

require 'chef-vault'

if node['testcookbook']['testusers'] == true then
    users = data_bag(node['testcookbook']['testusers'])
    users.each do |id|
        user = ChefVault::Item.load(node["testcookbook","testusers"], id)
        testusers user['id'] do
            comment user['comment']
            shell user['shell']
            password user['password']
        end
    end

有人可以告诉我这里我做错了什么吗?从我所做的大量研究来看,一切似乎都很好。

修改

我尝试了您的解决方案和以下错误消息。

Chef::Exceptions::InvalidDataBagName

------------------------------------

DataBags must have a name matching /^[\.\-[:alnum:]_]+$/, you gave ""

chef_gem 'chef-vault' do
  compile_time true if respond_to?(:compile_time)
end
require 'chef-vault'

17>>    users = data_bag(node['testcookbook']['testusers']).delete_if {|x| x.include? "_keys" }
     users.each do |id|
           user = ChefVault::Item.load(node["testcookbook","testusers"], id)
            testcookbook testusers['id'] do
                   comment testusers['comment']
                   uid testusers['uid']
                   shell testusers['shell']
                   password testusers['password']
              end 
  

[2016-08-22T19:24:58-04:00]致命:Stacktrace转储到/var/chef/cache/chef-stacktrace.out
  [2016-08-22T19:24:58-04:00]致命:如果您提交错误报告,请提供stacktrace.out文件的内容   [2016-08-22T19:24:58-04:00]错误:DataBags必须有一个名称匹配/^[.-[:alnum:]_]+$/,你给了&#34;&#34; <登记/>   [2016-08-22T19:24:58-04:00]致命:Chef :: Exceptions :: ChildConvergeError:Chef run进程退出失败(退出代码1)`

2 个答案:

答案 0 :(得分:1)

您还没有详细说明什么不起作用。我怀疑Priya是正确的,你的问题是你应该使用Vault API阅读而不是通过数据包循环。

我也注意到你还没有考虑如何删除用户......

您是否考虑过使用基于SSH的密钥身份验证,而不是使用密码?在我看来,这将是管理用户的一种非常优越的方式,因为它避免了与系统管理员共享密码的需要。 SSH公钥设计为可共享,私钥仅为用户所知。

我之所以提到这一点是因为社区users cookbook旨在通过存储在数据包中的每个用户记录来实现您想要的工作流程。这里给出了一个使用它的例子:

答案 1 :(得分:0)

恕我直言,在保险库上进行简单的数据库呼叫会列出加密密钥,这可能会导致失败。例如,

我的保险库只有一个名为“root”的项目,

$knife vault show mrigesh
root

并且,访问配方中的保险库将返回一个数组,其中保险库及其键作为单独的元素:

users = data_bag("mrigesh")
puts users
root
root_keys

因此,迭代此结果将尝试搜索名为“root_keys”的保险库,该保险库不会导致失败。

要解决,您可以执行以下操作:

node.default['testcookbook']['testusers'] = "testusers"
users = data_bag(node['testcookbook']['testusers']).delete_if {|x| x.include? "_keys" }
users.each do |id|
      user = ChefVault::Item.load(node['testcookbook']['testusers'], id)
      testusers user['id'] do
         comment user['comment']
         shell user['shell']
         password user['password']
      end

end