Chef - как написать пользовательский ресурс, содержащий DSL для выполнения

Я написал шеф-повару definition, который отправляет сообщения на наш чат-сервер.

Поскольку определения больше не рекомендуются, как я могу переписать это как ресурс? Меня особенно интересует, как использовать «событийные» способы запуска кода.

Файл chat\definitions\post.rb :

define :chat_post do

  chat_url = 'https://chat.our.company/hooks/abcdef1234567890'
  message = params[:name]

  execute "echo" do
    command "curl -m 5 -i -X POST -d \"payload={"text": "#{message}"\" #{chat_url}"
    ignore_failure true
  end
end

Код вызова в рецепте:

artifacts.each do |artifactItem|
  # deploy stuff
  # ...

  chat_post "#{node['hostname']}: Deployed #{artifact_name}-#{version}"
end

Теперь я прочитал документацию шеф-повара и попробовал разные вещи (точнее: Module, library и resource) и прочитал документацию о настраиваемые ресурсы шеф-повара, но безуспешно.

Может кто-нибудь помочь мне: как преобразовать этот код в resource, если это правильный способ сделать это (шеф-повар 12.6+)?

я был бы рад узнать

  • где в поваренной книге находится ресурс рецепта (chat/recipes или еще куда?)
  • как должен выглядеть код (преобразование из моего определения выше)
  • как называется новый код (из другого рецепта) и нужны ли там какие-то включения

person vikingsteve    schedule 14.09.2016    source источник


Ответы (1)


Из документа custom_resource должно получиться что-то вроде этого (не проверено):

in chat/resources/message.rb:

property :chat_url, String, default: 'https://chat.our.company/hooks/abcdef1234567890'
property :message, String, name_property: true

action :send
  execute "echo #{message}" do
    command "curl -m 5 -i -X POST -d \"payload={"text": "#{message}"\" #{chat_url}"
    ignore_failure true
  end
end

А теперь в другой кулинарной книге:

artifacts.each do |artifactItem|
  # prepare the message:

  chat_message "#{node['hostname']}: Deployed #{artifact_name}-#{version}" do
    action :nothing
  end

  # deploy stuff
  # dummy code follow
  deploy artifactItem['artifact_name'] do
    source "whatever_url/#{artifactItem}
    notifies :send,"chat_message[#{node['hostname']}: Deployed #{artifactItem["artifact_name"]}-#{artifactItem['artifact_name']}]"
  end
end

По умолчанию уведомления откладываются, поэтому ресурс chat_message сработает только в конце выполнения.

вы развертываете поваренную книгу, придется depends в chat поваренной книге, чтобы иметь возможность вызывать ее custom_resource.

person Tensibai    schedule 14.09.2016
comment
Чудесно, спасибо! вещь name_property была очень аккуратной. Я могу как-нибудь купить тебе пива? Это мне очень помогло. - person vikingsteve; 12.10.2016
comment
Спасибо, рад, что помогло ;) - person Tensibai; 12.10.2016
comment
Кстати, если ресурс имеет только одно действие, кажется, вам не нужно указывать :send в notifies - person vikingsteve; 12.10.2016
comment
Да, но я считаю хорошей практикой всегда указывать действие. И это не сломает все, если вы добавите второе действие к ресурсу (скажем, send_SMS, например - person Tensibai; 12.10.2016