【发布时间】:2016-09-18 11:46:39
【问题描述】:
动机:节点会尝试从数据包中获取一个key,如果key不存在则生成一个。当您扩展集群并且必须为其共享密码时,这很方便。
请注意,不会同时创建任何节点,因此将避免竞争条件。
厨师文档中有一部分与配方中的create and edit 数据包项相关,但没有与创建新的加密数据包项相关的内容。
任何人都可以阐明如何做到这一点吗?
【问题讨论】:
标签: ruby chef-infra
动机:节点会尝试从数据包中获取一个key,如果key不存在则生成一个。当您扩展集群并且必须为其共享密码时,这很方便。
请注意,不会同时创建任何节点,因此将避免竞争条件。
厨师文档中有一部分与配方中的create and edit 数据包项相关,但没有与创建新的加密数据包项相关的内容。
任何人都可以阐明如何做到这一点吗?
【问题讨论】:
标签: ruby chef-infra
为接下来的召唤提前道歉。你能解释一下你想要做什么吗?也许有更好的方法来完成它。加密数据包远非完整的安全解决方案。他们的弱点在于缺乏密钥管理。
所以答案是 Ruby 源代码完全由它的 gem 记录。此处描述了加密的数据包项:
但是……
来自您提供的documentation link:
创建和编辑数据包或数据包项的内容 不推荐从食谱中。推荐的更新方法 数据包或数据包项是使用刀和刀数据包 子命令。
如果必须从食谱中执行此操作,请注意 以下:
- 如果两个操作同时尝试更新数据包的内容,最后一次写入的尝试将是更新数据包的操作 数据包的内容。这种情况会导致数据丢失,所以 组织应采取措施确保只有一名厨师客户 一次更新数据包。
- 在使用开源 Chef 服务器时更改节点中的数据包需要授予节点的 API 客户端管理员权限。 在大多数情况下,这是不可取的。
对 Chef 服务器的更新不是事务性的,因此从 Chef 客户端更新某些内容是一个非常糟糕的主意,因为可能会有多个节点执行相同的操作。
第二个警告是关于特权...再次建议您以最少的超能力操作您的厨师客户。为厨师管理员或在厨师工作站上运行的脚本保留这些。
【讨论】:
试试这个:
secret = Chef::EncryptedDataBagItem.load_secret(Chef::Config[:encrypted_data_bag_secret])
data = { "id" => "mysecret", "secret" => "stuff" }
encrypted_data_hash = Chef::EncryptedDataBagItem.encrypt_data_bag_item(data, secret)
databag_item = Chef::DataBagItem.new
databag_item.data_bag("secrets")
databag_item.raw_data = encrypted_data_hash
databag_item.save
【讨论】: