我的厨师金库中有以下用户凭证
$ 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/厨师/缓存/厨师-stacktrace.out 2016-08-22T19:24:58-04:00致命:如果您提交错误报告,请提供stacktrace.out文件的内容。 2016-08-22T19:24:58-04:00错误: DataBags必须有一个与/^匹配的名称[.-:alnum:_]+$/,您给了"“ 2016-08-22T19:24:58-04:00致命:厨师::例外:儿童汇合错误:厨师运行进程未成功退出(退出代码1)
发布于 2016-08-22 21:24:44
你还没有给出什么不起作用的细节。我怀疑Priya是正确的,您的问题是,您应该使用保险库API,而不是循环通过数据包。
我还注意到你还没有考虑如何删除用户.
您是否考虑过使用基于SSH的密钥身份验证,而不是使用密码?在我看来,这将是管理用户的一种更好的方法,因为它避免了与系统管理员共享密码的需要。SSH公钥设计为可与仅为用户所知的私钥共享。
我之所以提到这一点,是因为社区用户食谱的设计目的是通过存储在一个数据包中的每个用户记录来实现您想要的工作流。这里给出了一个使用它的例子:
发布于 2016-08-22 02:05:55
IMHO在金库上进行简单的数据库调用,也会列出可能导致失败的加密密钥。例如,
我的金库只有一个叫做“根”的东西,
$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
endhttps://stackoverflow.com/questions/39068254
复制相似问题