Я переношу некоторые сценарии оболочки в рецепты Chef. Некоторые из этих скриптов довольно сложные, поэтому, чтобы облегчить жизнь в краткосрочной перспективе и избежать появления ошибок при переписывании всего на Chef/Ruby, я хотел бы просто запустить некоторые из них как есть. Все они хорошо написаны и идемпотентны, так что, честно говоря, спешки нет, но, конечно же, конечная цель — переписать их.
Одной из интересных особенностей Ruby является ключевое слово __END__
. /method: Строки ниже __END__
не будут выполняться. Эти строки будут доступны через специальный файловый дескриптор DATA.
Было бы здорово отправить сценарии оболочки как есть внутри рецепта после __END__
, может быть, что-то вроде следующего, которое я поместил в chef-repo/cookbooks/ruby-data-test/recipes/default.rb
:
file = Tempfile.new(File.basename(__FILE__))
file << DATA.read
bash file.path
file.unlink
__END__
echo "Hello, world"
Однако, когда я запускаю это (с chef-solo -c solo.rb --override-runlist 'recipe[ruby-data-test]'
), я получаю следующую ошибку:
[2014-10-03T17:14:56+00:00] ERROR: uninitialized constant Chef::Recipe::DATA
Я новичок в Chef, но я предполагаю, что вышесказанное связано с тем, что Chef заключает мой рецепт в класс, и есть что-то простое, не позволяющее мне получить доступ к DATA
. Поскольку он "глобальный" (?), я попытался поставить перед ним знак доллара ($DATA
), но это не удалось:
NoMethodError
-------------
undefined method `read' for nil:NilClass
Итак, вопрос: Как мне получить доступ к DATA
в моем рецепте Chef? Спасибо!
::DATA.read
- person Tejay Cardon   schedule 03.10.2014::DATA.read
, но, к сожалению, с ошибкойERROR: uninitialized constant DATA
. - person Steve Kehlet   schedule 03.10.2014DATA
недоступен в библиотеке, и указывает на как это делает Sinatra: он читает файл и вручную разбивает на__END__
. Я мог бы сделать это или просто отправить сценарий отдельно, что в любом случае может быть лучше для подсветки синтаксиса в моей среде IDE. Но все же интересно, можно ли это сделать! - person Steve Kehlet   schedule 03.10.2014