Chef infra Chef-从脚本(不使用编辑器)以非交互方式编辑属性或数据包的任何最佳实践
我想存储一个构建版本号,以后可以在配方中使用它来解析“源”行中msi的路径。此版本特定于某个环境。我还不确定是使用环境属性还是数据包,但无论哪种方式,我都希望能够从脚本中更新属性或数据包项(我有一个调用各种AWS和刀子函数的主powershell脚本) 但是,默认情况下,基本的“刀子环境编辑…”或“刀子数据包编辑…”会调用编辑器手动编辑脚本无法执行的定义 我一直在寻找解决方案,并遇到了以下建议,但是否有任何公认的“最佳实践”或替代方案Chef infra Chef-从脚本(不使用编辑器)以非交互方式编辑属性或数据包的任何最佳实践,chef-infra,non-interactive,Chef Infra,Non Interactive,我想存储一个构建版本号,以后可以在配方中使用它来解析“源”行中msi的路径。此版本特定于某个环境。我还不确定是使用环境属性还是数据包,但无论哪种方式,我都希望能够从脚本中更新属性或数据包项(我有一个调用各种AWS和刀子函数的主powershell脚本) 但是,默认情况下,基本的“刀子环境编辑…”或“刀子数据包编辑…”会调用编辑器手动编辑脚本无法执行的定义 我一直在寻找解决方案,并遇到了以下建议,但是否有任何公认的“最佳实践”或替代方案 使用“刀子环境显示…”将环境或数据包定义转储为json文件
- 使用“刀子环境显示…”将环境或数据包定义转储为json文件,并使用标准搜索/替换工具替换json文件中的值,然后使用“刀子环境从文件编辑…”选项
- 使用名为via knife exec-E的定制ruby代码(如中所建议)
$rubycode= @"
require 'net/http'
require 'chef/rest'
require 'chef/config'
require 'chef/data_bag'
require 'chef/data_bag_item'
bagname = 'myapps'
appname = 'foo'
version = '1.0.0'
#Use the same config as knife uses
Chef::Config.from_file(File.join(ENV['USERPROFILE'], '.chef', 'knife.rb'))
#Load data bag item, or create it if it doesn't exist yet
begin
item = Chef::DataBagItem.load(bagname, appname)
rescue Net::HTTPServerException => e
if e.response.code == "404" then
puts("INFO: Creating a new data bag item")
item = Chef::DataBagItem.new
item.data_bag(bagname)
item['id'] = appname
else
puts("ERROR: Received an HTTPException of type " + e.response.code)
raise
end
end
item['version'] = version
item.save
"@#
knife exec -E $rubycode
- 调用chef服务器api,如中所述
# A POST call to /environments creates a new environment. The request body should contain the JSON representation of the environment.
$environment_desc = @"
{
"name": "regtest",
"description": "",
"cookbook_versions": {},
"json_class": "Chef::Environment",
"chef_type": "environment",
"override_attributes": {}
}
"@
knife exec -E "api.post('/environments',$environment_desc)"