Ресурс точки останова
Эта страница сгенерирована из исходного кода Chef Infra Client. Чтобы предложить изменение, отредактируйте файл breakpoint.rb и отправьте запрос на добавление изменений в репозиторий Chef Infra Client.
Используйте ресурс 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- Добавить точку останова для использования с chef-shell (по умолчанию)
:nothing- Этот блок ресурса не выполняет никаких действий, пока не будет уведомлен другим ресурсом для выполнения действия. После уведомления этот блок ресурса либо выполняется немедленно, либо помещается в очередь для выполнения в конце выполнения Chef Infra Client.
Свойства
Этот ресурс не имеет свойств.
Отладка рецептов с помощью chef-shell
chef-shell — это инструмент для отладки рецептов, позволяющий использовать точки останова в рецептах. chef-shell запускается как сессия Interactive Ruby (IRb). chef-shell поддерживает синтаксис файлов рецептов и атрибутов, а также интерактивные функции отладки.Режимы
chef-shell — это инструмент, запускаемый с помощью сессии Interactive Ruby (IRb). chef-shell в настоящее время поддерживает синтаксис файлов рецептов и атрибутов, а также интерактивные функции отладки. chef-shell имеет три режима работы:
| Режим | Описание |
|---|---|
| Автономный | По умолчанию. Никакие кулинарные книги не загружаются, и список выполнения пуст. |
| Solo | 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 загружается в автономном режиме и не подключается к серверу 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 > default[: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/