Chef infra Chef-从脚本(不使用编辑器)以非交互方式编辑属性或数据包的任何最佳实践

Chef infra Chef-从脚本(不使用编辑器)以非交互方式编辑属性或数据包的任何最佳实践,chef-infra,non-interactive,Chef Infra,Non Interactive,我想存储一个构建版本号,以后可以在配方中使用它来解析“源”行中msi的路径。此版本特定于某个环境。我还不确定是使用环境属性还是数据包,但无论哪种方式,我都希望能够从脚本中更新属性或数据包项(我有一个调用各种AWS和刀子函数的主powershell脚本) 但是,默认情况下,基本的“刀子环境编辑…”或“刀子数据包编辑…”会调用编辑器手动编辑脚本无法执行的定义 我一直在寻找解决方案,并遇到了以下建议,但是否有任何公认的“最佳实践”或替代方案 使用“刀子环境显示…”将环境或数据包定义转储为json文件

我想存储一个构建版本号,以后可以在配方中使用它来解析“源”行中msi的路径。此版本特定于某个环境。我还不确定是使用环境属性还是数据包,但无论哪种方式,我都希望能够从脚本中更新属性或数据包项(我有一个调用各种AWS和刀子函数的主powershell脚本)

但是,默认情况下,基本的“刀子环境编辑…”或“刀子数据包编辑…”会调用编辑器手动编辑脚本无法执行的定义

我一直在寻找解决方案,并遇到了以下建议,但是否有任何公认的“最佳实践”或替代方案

  • 使用“刀子环境显示…”将环境或数据包定义转储为json文件,并使用标准搜索/替换工具替换json文件中的值,然后使用“刀子环境从文件编辑…”选项

  • 使用名为via knife exec-E的定制ruby代码(如中所建议)

顺便说一句,我发现从powershell脚本运行这个脚本很棘手:在尝试创建数据包的情况下,如果我通过here doc将ruby代码设置为变量并调用“knife exec-E$rubycode”,它不会报告错误,但也不会创建数据包

$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,如中所述
例如,在我的powershell脚本中,要创建环境,我正在尝试以下方法(我还没有在现有环境中更新attibute):

我发现以下错误,我怀疑可能与powershell解析有关

错误:SyntaxError:-E参数:语法错误,意外的$end, 应为“}”api.post(“/environments”{

我意识到一些错误可能是由于powershell解析造成的,但我的问题是根据主题-是否有一种最佳实践方法可以非交互地编辑环境和数据包,无论是从上面的列表还是其他一些方法?

您可以使用
# 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)"