【问题标题】:Creating multiple users in chef using Chef Vault使用 Chef Vault 在 Chef 中创建多个用户
【发布时间】:2016-12-28 08:08:23
【问题描述】:

我的厨师保险库中有以下用户凭据

$ 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] 致命:堆栈跟踪转储到 /var/chef/cache/chef-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] 致命:Chef::Exceptions::ChildConvergeError:Chef 运行进程未成功退出(退出代码 1)`

【问题讨论】:

    标签: ruby chef-infra chef-recipe cookbook


    【解决方案1】:

    恕我直言,对保管库进行简单的数据包调用也会列出可能导致失败的加密密钥。例如,

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

    $knife vault show mrigesh
    root
    

    而且,在配方中访问 vault 将返回一个数组,其中 vault 及其键作为单独的元素:

    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
    

    【讨论】:

    • 感谢 Mrigesh-我已经编辑了帖子以显示我在尝试您的解决方案时遇到的错误。
    • 我不确定,您要做什么。这里“node['testcookbook']['testusers']”作为布尔值工作:“if node['testcookbook']['testusers'] == true” 然后你把它当作数据包名称:data_bag(node[' testcookbook']['testusers']) 导致错误。
    • 我实际上正在尝试创建一个配方,该配方将根据我的保管库中的项目数量创建用户。换句话说,如果我有 5 个项目(user1、user2、user3、user4、user5),在 testusers 保险库中,配方应该能够循环通过该保险库并根据每个保险库项目中存储的信息创建用户。我根据您的建议做了一些额外的更改,但现在我陷入了错误:第 17 行的参数数量错误(2 比 1),即 user = ChefVault::Item.load(node["testcookbook","testusers"], id)。
    • 看起来像我的格式问题,你只是复制和粘贴它。 ;) 更新了答案。
    • 感谢 Mrigesh 的帮助。我修复了格式。不幸的是,我现在收到一个错误:没有资源或方法名为 'testusers' for `Chef::Recipe "default'。不知道为什么它这么说,因为变量 node.default['testcookbook']['testusers'] = " testusers" 已定义。
    【解决方案2】:

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

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


    您是否考虑过使用基于 SSH 的密钥身份验证,而不是使用密码?在我看来,这将是管理用户的一种更好的方法,因为它避免了与系统管理员共享密码的需要。 SSH 公钥旨在与只有用户知道的私钥共享。

    我提到这一点是因为社区users cookbook 旨在实现您所需的工作流程,每个用户记录都存储在数据包中。这里给出了它的使用示例:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多