Ресурс точки останова
Эта страница сгенерирована из исходного кода Chef. Чтобы предложить изменение, отредактируйте файл breakpoint.rb и отправьте запрос на вытягивание в репозиторий Chef.
Используйте ресурс breakpoint для добавления точек останова в рецепты. Запустите chef-shell в режиме Chef Infra Client, а затем используйте эти точки останова для отладки рецептов. Точки останова игнорируются chef-client во время фактического выполнения chef-client. Тем не менее, точки останова обычно используются для отладки рецептов только при выполнении в непроизводственной среде, после чего они удаляются из этих рецептов перед загрузкой родительского кулинарного сборника в сервер Chef.
Новое в Chef Infra Client 12.0.
Синтаксис
Полный синтаксис для всех доступных свойств ресурса breakpoint:
breakpoint 'name' do
action Symbol # defaults to :break if not specified
endгде:
-
breakpoint— это ресурс. -
name— это имя, присвоенное блоку ресурса. -
actionопределяет шаги, которые Chef Infra Client предпримет для приведения узла в желаемое состояние.
Действия
Ресурс breakpoint имеет следующие действия:
:break:nothing- Этот блок ресурса не действует, пока не будет уведомлен другим ресурсом о действии. После уведомления этот блок ресурса либо выполняется немедленно, либо помещается в очередь для выполнения в конце выполнения Chef Infra Client.
Свойства
Этот ресурс не имеет свойств.
Отладка рецептов с помощью chef-shell
chef-shell — это инструмент отладки рецептов, который позволяет использовать точки останова в рецептах. chef-shell работает как сессия Interactive Ruby (IRb). chef-shell поддерживает синтаксис файлов рецептов и атрибутов, а также функции интерактивной отладки.Режимы
chef-shell — это инструмент, работающий в сессии Interactive Ruby (IRb). В настоящее время chef-shell поддерживает синтаксис файлов рецептов и атрибутов, а также функции интерактивной отладки. chef-shell имеет три режима работы:
| Режим | Описание |
|---|---|
| Отдельный | По умолчанию. Никакие кулинарные сборники не загружаются, и список запусков пуст. |
| Соло | chef-shell действует как клиент Chef Solo. Он пытается загрузить файл конфигурации chef-solo по адресу ~/.chef/config.rb и любые переданные JSON-атрибуты. Если JSON-атрибуты задают список запусков, он будет учтён. Кулинарные сборники будут загружаться так же, как chef-solo загружает их. Режим chef-solo активируется с помощью опции командной строки -s или --solo, а JSON-атрибуты указываются так же, как и для chef-solo, с помощью -j /path/to/chef-solo.json. |
| Клиент | chef-shell действует как клиент Chef Infra Client. Во время запуска он считывает файл конфигурации Chef Infra Client из ~/.chef/client.rb и обращается к серверу Chef Infra для получения списка запусков, атрибутов и кулинарных сборников узла. Режим Chef Infra Client активируется с помощью опций -z или --client. Вы также можете указать файл конфигурации с помощью -c CONFIG и URL-адрес сервера с помощью -S SERVER_URL. |
Настройка
chef-shell определяет, какой файл конфигурации загрузить, в зависимости от следующего:
- Если файл конфигурации указан с помощью опции
-c, chef-shell будет использовать указанный файл конфигурации - Если задан NAMED_CONF, chef-shell загрузит ~/.chef/NAMED_CONF/chef_shell.rb
- Если NAMED_CONF не задан, chef-shell загрузит ~/.chef/chef_shell.rb, если он существует
- Если chef_shell.rb не найден, chef-shell переходит к загрузке:
- /etc/chef/client.rb, если задана опция -z.
- /etc/chef/solo.rb, если задана опция –solo-legacy-mode.
- .chef/config.rb, если задана опция -s.
- .chef/knife.rb, если задана опция -s.
chef-shell.rb
Файл chef-shell.rb можно использовать для настройки chef-shell аналогично тому, как файл client.rb используется для настройки Chef Infra Client. Например, чтобы настроить chef-shell для аутентификации на сервере Chef Infra, скопируйте настройки node_name, client_key, и chef_server_url из файла config.rb:
node_name 'your-knife-clientname'
client_key File.expand_path('~/.chef/my-client.pem')
chef_server_url 'https://api.opscode.com/organizations/myorg'
а затем добавьте их в файл chef-shell.rb. Другие возможности настройки включают отключение плагинов Ohai (что ускорит запуск chef-shell) или включение произвольного Ruby-кода в файл chef-shell.rb.
Выполнение как Chef Infra Client
По умолчанию chef-shell загружается в режиме standalone и не подключается к серверу Chef Infra. chef-shell можно запустить как клиент Chef Infra для проверки функциональности, доступной только при подключении Chef Infra Client к серверу Chef Infra, такой как поиск или доступ к данным, хранящимся в пакетах данных.
chef-shell может использовать те же учетные данные, что и knife, при подключении к серверу Chef Infra. Убедитесь, что настройки в chef-shell.rb совпадают с настройками в config.rb, а затем используйте опцию -z в командной строке. Например:
chef-shell -z
Управление
Когда chef-shell настроен для доступа к серверу Chef Infra, chef-shell может перечислять, отображать, искать и редактировать кулинарные сборники, клиентов, узлы, роли, среды, файлы политик и пакеты данных.
Синтаксис управления объектами на сервере Chef Infra:
chef-shell -z named_configuration
Где:
-
named_configuration— это существующий файл конфигурации в~/.chef/named_configuration/chef_shell.rb, например,production,staging, илиtest.
После входа в chef-shell команды могут быть выполнены над объектами следующим образом:
chef (preprod) > items.command
Где:
-
items— это тип элемента для поиска:cookbooks,clients,nodes,roles,environmentsили пакет данных. -
command— это команда:list,show,find, илиedit.
Например, чтобы вывести список всех узлов в конфигурации под названием «preprod», введите:
chef (preprod) > nodes.list
Результат будет похож на:
=> [node[i-f09a939b], node[i-049a936f], node[i-eaaaa581], node[i-9154b1fb],
node[i-6a213101], node[i-c2687aa9], node[i-7abeaa11], node[i-4eb8ac25],
node[i-9a2030f1], node[i-a06875cb], node[i-145f457f], node[i-e032398b],
node[i-dc8c98b7], node[i-6afdf401], node[i-f49b119c], node[i-5abfab31],
node[i-78b8ac13], node[i-d99678b3], node[i-02322269], node[i-feb4a695],
node[i-9e2232f5], node[i-6e213105], node[i-cdde3ba7], node[i-e8bfb083],
node[i-743c2c1f], node[i-2eaca345], node[i-aa7f74c1], node[i-72fdf419],
node[i-140e1e7f], node[i-f9d43193], node[i-bd2dc8d7], node[i-8e7f70e5],
node[i-78f2e213], node[i-962232fd], node[i-4c322227], node[i-922232f9],
node[i-c02728ab], node[i-f06c7b9b]]
Команда list может принимать блок кода, который будет применяться (но не сохраняться) к каждому объекту, возвращённому сервером. Например:
chef (preprod) > nodes.list {|n| puts "#{n.name}: #{n.run_list}" }
Результат будет похож на:
=> i-f09a939b: role[lb], role[preprod], recipe[aws]
i-049a936f: role[lb], role[preprod], recipe[aws]
i-9154b1fb: recipe[erlang], role[base], role[couchdb], role[preprod],
i-6a213101: role[chef], role[preprod]
# more...
Команда show может использоваться для отображения конкретного узла. Например:
chef (preprod) > load_balancer = nodes.show('i-f09a939b')
Результат будет похож на:
=> node[i-f09a939b]
Или:
chef (preprod) > load_balancer.ec2.public_hostname
Результат будет похож на:
=> "ec2-111-22-333-44.compute-1.amazonaws.com"
Команда find может использоваться для поиска на сервере Chef Infra из chef-shell. Например:
chef (preprod) > pp nodes.find(:ec2_public_hostname => 'ec2*')
Вы также можете форматировать результаты с помощью блока кода. Например:
chef (preprod) > pp nodes.find(:ec2_public_hostname => 'ec2*') {|n| n.ec2.ami_id } and nil
Результат будет похож на:
=> ["ami-f8927a91",
"ami-f8927a91",
"ami-a89870c1",
"ami-a89870c1",
"ami-a89870c1",
"ami-a89870c1",
"ami-a89870c1"
# and more...
Или:
chef (preprod) > amis = nodes.find(:ec2_public_hostname => 'ec2*') {|n| n.ec2.ami_id }
chef (preprod) > puts amis.uniq.sort
Результат будет похож на:
=> ami-4b4ba522
ami-a89870c1
ami-eef61587
ami-f8927a91
Использование точек останова
chef-shell позволяет изменять текущую позицию в списке запусков во время выполнения Chef Infra Client. Добавьте точки останова в рецепт, чтобы использовать эту функциональность.Прохождение по списку запусков
Чтобы изучить использование breakpoint для ручного прохождения по выполнению Chef Infra Client, создайте простой рецепт в chef-shell:
chef > recipe_mode
chef:recipe > echo off
chef:recipe > file "/tmp/before-breakpoint"
chef:recipe > breakpoint "foo"
chef:recipe > file "/tmp/after-breakpoint"
а затем запустите Chef Infra Client:
chef:recipe > run_chef
[Fri, 15 Jan 2020 14:17:49 -0800] DEBUG: Processing file[/tmp/before-breakpoint]
[Fri, 15 Jan 2020 14:17:49 -0800] DEBUG: file[/tmp/before-breakpoint] using Chef::Provider::File
[Fri, 15 Jan 2020 14:17:49 -0800] INFO: Creating file[/tmp/before-breakpoint] at /tmp/before-breakpoint
[Fri, 15 Jan 2020 14:17:49 -0800] DEBUG: Processing [./bin/../lib/chef/mixin/recipe_definition_dsl_core.rb:56:in 'new']
[Fri, 15 Jan 2020 14:17:49 -0800] DEBUG: [./bin/../lib/chef/mixin/recipe_definition_dsl_core.rb:56:in 'new'] using Chef::Provider::Breakpoint
Chef Infra Client выполнил первый ресурс до точки останова (file[/tmp/before-breakpoint]), но затем остановился после выполнения. Chef Infra Client пытался назвать точку останова по её позиции в исходном файле, но Chef Infra Client запутался, потому что ресурс был введён интерактивно. Отсюда chef-shell может возобновить прерванное выполнение Chef Infra Client:
chef:recipe > chef_run.resume
[Fri, 15 Jan 2020 14:27:08 -0800] INFO: Creating file[/tmp/after-breakpoint] at /tmp/after-breakpoint
Быстрый просмотр каталога /tmp показывает, что были созданы следующие файлы:
after-breakpoint
before-breakpoint
Можно перемотать и пройтись по выполнению Chef Infra Client:
chef:recipe > Chef::Log.level = :debug # debug logging won't turn on automatically in this case
=> :debug
chef:recipe > chef_run.rewind
=> 0
chef:recipe > chef_run.step
[Fri, 15 Jan 2020 14:40:52 -0800] DEBUG: Processing file[/tmp/before-breakpoint]
[Fri, 15 Jan 2020 14:40:52 -0800] DEBUG: file[/tmp/before-breakpoint] using Chef::Provider::File
=> 1
chef:recipe > chef_run.step
[Fri, 15 Jan 2020 14:40:54 -0800] DEBUG: Processing [./bin/../lib/chef/mixin/recipe_definition_dsl_core.rb:56:in 'new']
[Fri, 15 Jan 2020 14:40:54 -0800] DEBUG: [./bin/../lib/chef/mixin/recipe_definition_dsl_core.rb:56:in 'new'] using Chef::Provider::Breakpoint
=> 2
chef:recipe > chef_run.step
[Fri, 15 Jan 2020 14:40:56 -0800] DEBUG: Processing file[/tmp/after-breakpoint]
[Fri, 15 Jan 2020 14:40:56 -0800] DEBUG: file[/tmp/after-breakpoint] using Chef::Provider::File
=> 3
Из вывода показан перемотанный список запусков, но при повторном выполнении ресурсов они будут повторять свои проверки существования файлов. Если они существуют, Chef Infra Client пропустит создание. Если файлы удалены, то:
chef:recipe > ls("/tmp").grep(/breakpoint/).each {|f| rm "/tmp/#{f}" }
=> ["after-breakpoint", "before-breakpoint"]
Перемотайте и возобновите выполнение Chef Infra Client, чтобы получить ожидаемые результаты:
chef:recipe > chef_run.rewind
chef:recipe > chef_run.resume
[Fri, 15 Jan 2020 14:48:56 -0800] DEBUG: Processing file[/tmp/before-breakpoint]
[Fri, 15 Jan 2020 14:48:56 -0800] DEBUG: file[/tmp/before-breakpoint] using Chef::Provider::File
[Fri, 15 Jan 2020 14:48:56 -0800] INFO: Creating file[/tmp/before-breakpoint] at /tmp/before-breakpoint
[Fri, 15 Jan 2020 14:48:56 -0800] DEBUG: Processing [./bin/../lib/chef/mixin/recipe_definition_dsl_core.rb:56:in 'new']
[Fri, 15 Jan 2020 14:48:56 -0800] DEBUG: [./bin/../lib/chef/mixin/recipe_definition_dsl_core.rb:56:in 'new'] using Chef::Provider::Breakpoint
chef:recipe > chef_run.resume
[Fri, 15 Jan 2020 14:49:20 -0800] DEBUG: Processing file[/tmp/after-breakpoint]
[Fri, 15 Jan 2020 14:49:20 -0800] DEBUG: file[/tmp/after-breakpoint] using Chef::Provider::File
[Fri, 15 Jan 2020 14:49:20 -0800] INFO: Creating file[/tmp/after-breakpoint] at /tmp/after-breakpoint
Отладка существующего рецепта
chef-shell можно использовать для отладки существующих рецептов. Рецепт сначала нужно добавить в список запусков для узла, чтобы он кэшировался при запуске chef-shell и затем использовался для отладки. chef-shell сообщит, какие рецепты кэшируются при запуске:
loading configuration: none (standalone session)
Session type: standalone
Loading.............done.
Welcome to the chef-shell 15.8.23
For usage see https://docs.chef.io/chef_shell.html
run `help' for help, `exit' or ^D to quit.
chef (15.8.23)>
Чтобы загрузить только один рецепт из списка запусков, перейдите в рецепт и используйте команду include_recipe. Например:
chef > recipe_mode
chef:recipe > include_recipe "getting-started"
=> [#< Chef::Recipe:0x10256f9e8 @cookbook_name="getting-started",
... output truncated ...
Чтобы загрузить все рецепты из списка запусков, используйте код, подобный следующему:
node.run_list.expand(node.chef_environment).recipes.each do |r|
include_recipe r
end
После загрузки рецептов, которые будут отлаживаться, используйте команду run_chef для их выполнения.
Расширенная отладка
В chef-shell можно получить подробную отладку, используя функцию отслеживания в Interactive Ruby (IRb). chef-shell предоставляет ярлык для включения и выключения отслеживания. Например:
chef > tracing on
tracing is on
=> nil
chef >
и:
chef > tracing off
#0:(irb):2:Object:-: tracing off
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:109:Shell::Extensions::ObjectCoreExtensions:>: def off
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:110:Shell::Extensions::ObjectCoreExtensions:-: :off
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:111:Shell::Extensions::ObjectCoreExtensions:<: end
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:272:main:>: def tracing(on_or_off)
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:273:main:-: conf.use_tracer = on_or_off.on_off_to_bool
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:162:Shell::Extensions::Symbol:>: def on_off_to_bool
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:163:Shell::Extensions::Symbol:-: to_s.on_off_to_bool
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:149:Shell::Extensions::String:>: def on_off_to_bool
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:150:Shell::Extensions::String:-: case self
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:154:Shell::Extensions::String:-: false
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:158:Shell::Extensions::String:<: end
#0:/opt/chef-workstation/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/shell/ext.rb:164:Shell::Extensions::Symbol:<: end
tracing is off
=> nil
chef >
Примеры отладки
Следующие примеры показывают, как использовать chef-shell.
"Привет, мир"
Этот пример демонстрирует, как запустить chef-shell в автономном режиме. (Для режимов chef-solo или Chef Infra Client необходимо запустить chef-shell с параметрами командной строки -s или -z, а затем учесть необходимые параметры конфигурации.)
Если Chef Infra Client установлен с помощью RubyGems или менеджера пакетов, chef-shell должен быть уже установлен. Если Chef Infra Client запущен из git-клона, он будет расположен в chef/bin/chef shell. Чтобы запустить chef-shell, просто запустите его без параметров. Вы увидите сообщение об загрузке, затем баннер, а затем приглашение chef-shell:
bin/chef-shell
loading configuration: none (standalone session)
Session type: standalone
Loading.............done.
Welcome to the chef-shell 15.8.23
For usage see https://docs.chef.io/chef_shell.html
run `help' for help, `exit' or ^D to quit.
chef (15.8.23)>
(Используйте команду help, чтобы получить список поддерживаемых команд.) Используйте команду recipe_mode, чтобы переключиться в контекст рецепта:
chef > recipe_mode
chef:recipe_mode >
Ввод оценивается в том же контексте, что и рецепты. Создайте ресурс файла:
chef:recipe_mode > file "/tmp/ohai2u_shef"
=> #< Chef::Resource::File:0x1b691ac
@enclosing_provider=nil,
@resource_name=:file,
@before=nil,
@supports={},
@backup=5,
@allowed_actions=[:nothing, :create, :delete, :touch, :create_if_missing],
@only_if=nil,
@noop=nil,
@collection=#< Chef::ResourceCollection:0x1b9926c
@insert_after_idx=nil,
@resources_by_name={"file[/tmp/ohai2u_shef]"=>0},
@resources=[#< Chef::Resource::File:0x1b691ac ...>]>,
@updated=false,
@provider=nil,
@node=< Chef::Node:0xdeeaae
@name="eigenstate.local">,
@recipe_name=nil,
@not_if=nil,
@name="/tmp/ohai2u_shef",
@action="create",
@path="/tmp/ohai2u_shef",
@source_line="/Users/username/ruby/chef/chef/(irb#1) line 1",
@params={},
@actions={},
@cookbook_name=nil,
@ignore_failure=false>
(Предыдущий пример был отформатирован для отображения.) На данном этапе chef-shell создал ресурс и поместил его в список запуска, но еще не создал файл. Для запуска Chef Infra Client используйте команду run_chef.
chef:recipe_mode > run_chef
[Fri, 15 Jan 2020 10:42:47 -0800] DEBUG: Processing file[/tmp/ohai2u_shef]
[Fri, 15 Jan 2020 10:42:47 -0800] DEBUG: file[/tmp/ohai2u_shef] using Chef::Provider::File
[Fri, 15 Jan 2020 10:42:47 -0800] INFO: Creating file[/tmp/ohai2u_shef] at /tmp/ohai2u_shef
=> true
chef-shell также может переключиться на тот же контекст, что и файлы атрибутов. Установите атрибут с помощью следующего синтаксиса:
chef:recipe_mode > attributes_mode
chef:attributes > set[:hello] = "ohai2u-again"
=> "ohai2u-again"
chef:attributes >
Вернитесь в контекст recipe_mode и используйте атрибуты:
chef:attributes > recipe_mode
=> :attributes
chef:recipe_mode > file "/tmp/#{node.hello}"
Теперь запустите Chef Infra Client снова:
chef:recipe_mode > run_chef
[Fri, 15 Jan 2020 10:53:22 -0800] DEBUG: Processing file[/tmp/ohai2u_shef]
[Fri, 15 Jan 2020 10:53:22 -0800] DEBUG: file[/tmp/ohai2u_shef] using Chef::Provider::File
[Fri, 15 Jan 2020 10:53:22 -0800] DEBUG: Processing file[/tmp/ohai2u-again]
[Fri, 15 Jan 2020 10:53:22 -0800] DEBUG: file[/tmp/ohai2u-again] using Chef::Provider::File
[Fri, 15 Jan 2020 10:53:22 -0800] INFO: Creating file[/tmp/ohai2u-again] at /tmp/ohai2u-again
=> true
chef:recipe_mode >
Поскольку первый ресурс (file[/tmp/ohai2u_shef]) все еще в списке запуска, он выполняется снова. И поскольку этот файл уже существует, Chef Infra Client не пытается его повторно создать. Наконец, файлы были созданы с помощью метода ls.
chef:recipe_mode > ls("/tmp").grep(/ohai/)
=> ["ohai2u-again", "ohai2u_shef"]
Shell Tutorial
Получение конкретных узлов
Чтобы получить список узлов, используя рецепт с именем postfix, используйте search(:node,"recipe:postfix"). Чтобы получить список узлов, используя подрецепт с именем delivery, используйте chef-shell. Например:
search(:node, 'recipes:postfix\:\:delivery')
Примечание
Одинарные (' ‘) и двойные (" “) кавычки важны. Это связано с тем, что обратная косая черта () должна быть включена в строку, вместо того, чтобы Ruby интерпретировал её как символ экранирования.
Примеры
Следующие примеры демонстрируют различные подходы к использованию ресурса breakpoint в рецептах:
Рецепт без точки останова
yum_key node['yum']['elrepo']['key'] do
url node['yum']['elrepo']['key_url']
action :add
end
yum_repository 'elrepo' do
description 'ELRepo.org Community Enterprise Linux Extras Repository'
key node['yum']['elrepo']['key']
mirrorlist node['yum']['elrepo']['url']
includepkgs node['yum']['elrepo']['includepkgs']
exclude node['yum']['elrepo']['exclude']
action :create
end
Тот же рецепт с точками останова
В следующем примере имя каждой точки останова — произвольная строка.
breakpoint "before yum_key node['yum']['repo_name']['key']" do
action :break
end
yum_key node['yum']['repo_name']['key'] do
url node['yum']['repo_name']['key_url']
action :add
end
breakpoint "after yum_key node['yum']['repo_name']['key']" do
action :break
end
breakpoint "before yum_repository 'repo_name'" do
action :break
end
yum_repository 'repo_name' do
description 'description'
key node['yum']['repo_name']['key']
mirrorlist node['yum']['repo_name']['url']
includepkgs node['yum']['repo_name']['includepkgs']
exclude node['yum']['repo_name']['exclude']
action :create
end
breakpoint "after yum_repository 'repo_name'" do
action :break
end
В предыдущих примерах имена используются для указания, находится ли точка останова до или после ресурса, а также для указания, какой ресурс она предшествует или следует за ним.
© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/resources/breakpoint/