Chef - любая лучшая практика для редактирования атрибутов или пакетов данных неинтерактивно из сценария (без использования редактора)
Я хочу сохранить номер версии сборки, который позже можно будет использовать в рецепте для определения пути к msi в строке "source". Эта версия относится к конкретной среде. Я не знаю, использовать ли атрибут среды или пакет данных, но в любом случае я хочу иметь возможность обновить атрибут или элемент пакета данных из сценария (у меня есть мастер-сценарий powershell, вызывающий различные функции AWS и нож),
Однако базовое "редактирование среды ножа.." или "редактирование мешка данных ножа" по умолчанию вызывает редактор, который вручную редактирует определение, которое невозможно выполнить из сценария.
Я искал решения и наткнулся на следующие предложения, но есть ли принятая "лучшая практика" или альтернативы?
Скопируйте определения среды или пакетов данных в файлы json с помощью "ножа среды шоу..." и замените значения в файлах json с помощью стандартных инструментов поиска / замены, а затем используйте опцию "нож среды редактирования из файла..".
Используйте пользовательский рубиновый код, который вызывается с помощью knife exec -E (как это предлагается в http://www.getchef.com/blog/2014/01/23/attributes-or-data-bags-what-should-i-use/).
Кроме того, я нахожу сложным заставить его работать из скрипта powershell: в случае попытки создать пакет данных, если я задаю код ruby как переменную через here-doc и вызываю "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
- Вызов API сервера chef, как описано в http://docs.opscode.com/knife_exec.html
Например, в моем скрипте powershell, чтобы создать среду, я пытаюсь это (я еще не обновлял attibute в существующей среде):
# 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)"
Я получаю следующую ошибку, которая, я подозреваю, может быть связана с анализом powershell
ОШИБКА: SyntaxError: -E Аргумент: синтаксическая ошибка, неожиданный конец $, ожидание '}' api.post('/environment',{
Я понимаю, что некоторые из ошибок вполне могут быть связаны с синтаксическим анализом powershell, но мой вопрос в соответствии с темой - есть ли лучший метод для неинтерактивного редактирования сред и пакетов данных, как из приведенного выше списка, так и других методов?