我的主厨库中有以下用户凭据
$ 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)`
答案 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