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

Например, в моем скрипте 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, но мой вопрос в соответствии с темой - есть ли лучший метод для неинтерактивного редактирования сред и пакетов данных, как из приведенного выше списка, так и других методов?

0 ответов

Другие вопросы по тегам