Ресурс службы
Эта страница сгенерирована из исходного кода Chef Infra Client. Чтобы предложить изменение, отредактируйте файл service.rb и отправьте запрос на вытягивание в репозиторий Chef Infra Client.
Используйте ресурс service для управления службой.
Синтаксис
Полный синтаксис всех свойств, доступных для ресурса service:
service 'name' do
init_command String
options Array, String
parameters Hash
pattern String
priority Integer, String, Hash
reload_command String, false
restart_command String, false
run_levels Array
service_name String # default value: 'name' unless specified
start_command String, false
status_command String, false
stop_command String, false
supports Hash # default value: {"restart"=>nil, "reload"=>nil, "status"=>nil}
timeout Integer # default value: 900
user String
action Symbol # defaults to :nothing if not specified
endгде:
-
service— это ресурс. -
name— это имя блока ресурса. -
actionопределяет шаги, которые Chef Infra Client предпримет для приведения узла в желаемое состояние. -
init_command,options,parameters,pattern,priority,reload_command,restart_command,run_levels,service_name,start_command,status_command,stop_command,supports,timeout, иuser— доступные свойства этого ресурса.
Действия
Ресурс service имеет следующие действия:
:disable- Отключить службу. Это действие эквивалентно типу запуска
Disabledна платформе Microsoft Windows. Это действие не поддерживается при использовании System Resource Controller (SRC) на платформе AIX, так как System Resource Controller (SRC) не имеет стандартного механизма для включения и отключения служб при загрузке системы. :enable- Включить службу при загрузке. Это действие эквивалентно типу запуска
Automaticна платформе Microsoft Windows. Это действие не поддерживается при использовании System Resource Controller (SRC) на платформе AIX, так как System Resource Controller (SRC) не имеет стандартного механизма для включения и отключения служб при загрузке системы. :nothing- Этот блок ресурса не действует, пока не получит уведомление от другого ресурса о необходимости выполнения действия. После получения уведомления этот блок ресурса либо выполняется немедленно, либо помещается в очередь для выполнения в конце выполнения Chef Infra Client.
:reload- Перезагрузить конфигурацию этой службы.
:restart- Перезапустить службу.
:start- Запустить службу и держать ее работающей до остановки или отключения.
:stop- Остановить службу.
Свойства
Ресурс service имеет следующие свойства:
-
init_command - Тип Ruby: Строка
Путь к скрипту init, связанному со службой. Используйте
init_commandдля предотвращения необходимости указания переопределений для свойствstart_command,stop_command, иrestart_command. Если это свойство не указано, Chef Infra Client будет использовать команду init по умолчанию для используемого поставщика услуг.
-
options - Тип Ruby: Массив, Строка
Только платформа Solaris. Параметры для передачи команде службы. Подробности возможных параметров см. в руководстве
svcadm.
-
parameters - Тип Ruby: Хэш
Только Upstart: Хэш параметров для передачи команде службы для использования в определении службы.
-
pattern - Тип Ruby: Строка | Значение по умолчанию:
The value provided to 'service_name' or the resource block's nameШаблон для поиска в таблице процессов.
-
priority - Тип Ruby: Целое число, Строка, Хэш
Только платформа Debian. Относительный приоритет программы для упорядочения запуска и завершения. Может быть целым числом или хэшем. Целое число используется для определения уровней запуска; уровни остановки затем 100-целое число. Хэш используется для определения значений для определенных уровней запуска. Например,
{ 2 => [:start, 20], 3 => [:stop, 55] }задаст приоритет 20 для уровня запуска 2 и приоритет 55 для уровня запуска 3.
-
reload_command - Тип Ruby: Строка, false
Команда для перезагрузки конфигурации службы.
-
restart_command - Тип Ruby: Строка, false
Команда для перезапуска службы.
-
run_levels - Тип Ruby: Массив
Только платформы RHEL: Специфические уровни запуска, в которых будет работать служба.
-
service_name - Тип Ruby: Строка | Значение по умолчанию:
The resource block's nameНеобязательное свойство для установки имени службы, если оно отличается от имени блока ресурса.
-
start_command - Тип Ruby: Строка, false
Команда для запуска службы.
-
status_command - Тип Ruby: Строка, false
Команда для проверки состояния выполнения службы.
-
stop_command - Тип Ruby: Строка, false
Команда для остановки службы.
-
supports - Тип Ruby: Хэш | Значение по умолчанию:
{"restart" => nil, "reload" => nil, "status" => nil}Список свойств, которые управляют тем, как Chef Infra Client пытается управлять службой:
:restart,:reload,:status. Для:restart, скрипт init или другой поставщик услуг могут использовать команду перезапуска; если:restartне указан, Chef Infra Client пытается остановить, а затем запустить службу. Для:reload, скрипт init или другой поставщик услуг могут использовать команду перезагрузки. Для:status, скрипт init или другой поставщик услуг могут использовать команду состояния для определения, работает ли служба; если:statusне указан, Chef Infra Client пытается сопоставитьservice_nameс таблицей процессов как регулярное выражение, если шаблон не указан как свойство параметра. Значение по умолчанию:{ restart: false, reload: false, status: false }для всех платформ (кроме семейства платформ Red Hat, для которого значение по умолчанию{ restart: false, reload: false, status: true }.)
-
timeout - Тип Ruby: Целое число | Значение по умолчанию:
900Время ожидания в секундах до истечения срока.
-
user - Тип Ruby: Строка
Только systemd: Имя пользователя для запуска службы.
Новое в Chef Client 12.21
Общие функциональные возможности ресурсов
Ресурсы Chef включают общие свойства, уведомления и защитные механизмы ресурсов.
Общие свойства
Следующие свойства общие для всех ресурсов:
compile_time-
Тип Ruby: true, false | Значение по умолчанию:
falseУправление фазой, в которой ресурс выполняется на узле. Установите в true, чтобы запустить во время построения коллекции ресурсов (
compile phase). Установите в false, чтобы запустить во время конфигурирования узла Chef Infra Client (converge phase). ignore_failure-
Тип Ruby: true, false, :quiet | Значение по умолчанию:
falseПродолжать выполнение рецепта, если ресурс завершается сбоем по любой причине.
:quietне будет отображать полный стек исключений, и рецепт будет продолжен, если ресурс завершится сбоем. retries-
Тип Ruby: Целое число | Значение по умолчанию:
0Количество попыток перехватить исключения и повторить ресурс.
retry_delay-
Тип Ruby: Целое число | Значение по умолчанию:
2Задержка в секундах между попытками повтора.
sensitive-
Тип Ruby: true, false | Значение по умолчанию:
falseОбеспечить, чтобы конфиденциальные данные ресурсов не регистрировались Chef Infra Client.
Уведомления
-
notifies -
Тип Ruby: Символ, 'Chef::Resource[Строка]'
Ресурс может уведомить другой ресурс о выполнении действия при изменении его состояния. Укажите
'resource[name]', действие, которое должен предпринять:actionресурс, и:timerдля этого действия. Ресурс может уведомлять несколько ресурсов; для каждого уведомляемого ресурса используйте инструкциюnotifies.Если указанный ресурс не существует, возникает ошибка. В отличие от этого,
subscribesне завершится ошибкой, если исходный ресурс не найден.
Таймер определяет момент во время выполнения Chef Infra Client, в который выполняется уведомление. Доступны следующие таймеры:
:before-
Указывает, что действие над уведомленным ресурсом должно быть выполнено перед обработкой блока ресурса, в котором находится уведомление.
:delayed-
По умолчанию. Указывает, что уведомление должно быть помещено в очередь и затем выполнено в конце выполнения Chef Infra Client.
-
:immediate,:immediately -
Указывает, что уведомление должно быть выполнено немедленно, по каждому уведомленному ресурсу.
Синтаксис для notifies:
notifies :action, 'resource[name]', :timer
-
subscribes -
Тип Ruby: Символ, 'Chef::Resource[Строка]'
Ресурс может прослушивать другой ресурс и выполнять действие, если состояние прослушиваемого ресурса изменится. Укажите 'resource[name]', действие, которое должно быть выполнено, и :action для этого действия.
Обратите внимание, что subscribes не применяет указанное действие к ресурсу, который он прослушивает — например:
file '/etc/nginx/ssl/example.crt' do
mode '0600'
owner 'root'
end
service 'nginx' do
subscribes :reload, 'file[/etc/nginx/ssl/example.crt]', :immediately
end
В этом случае свойство subscribes перезагружает службу nginx всякий раз, когда обновляется ее сертификат, расположенный по адресу /etc/nginx/ssl/example.crt. subscribes не вносит никаких изменений в сам сертификат, а просто отслеживает изменения в файле и выполняет действие :reload для своего ресурса (в данном примере nginx) при обнаружении изменений.
Если другой ресурс не существует, подписка не будет генерировать ошибку. Противопоставьте это более строгим семантикам notifies, которые сгенерируют ошибку, если другой ресурс не существует.
Таймер определяет момент во время выполнения Chef Infra Client, в котором выполняется уведомление. Доступны следующие таймеры:
:before-
Указывает, что действие над уведомлённым ресурсом должно быть выполнено до обработки блока ресурсов, в котором расположено уведомление.
:delayed-
По умолчанию. Указывает, что уведомление должно быть помещено в очередь и затем выполнено в конце выполнения Chef Infra Client.
-
:immediate,:immediately -
Указывает, что уведомление должно быть выполнено немедленно, по каждому уведомлённому ресурсу.
Синтаксис для subscribes:
subscribes :action, 'resource[name]', :timer
Защиты
Свойство защиты может использоваться для оценки состояния узла во время фазы выполнения Chef Infra Client. Основываясь на результатах этой оценки, свойство защиты затем сообщает Chef Infra Client, следует ли продолжить выполнение ресурса. Свойство защиты принимает либо строковое значение, либо значение блока Ruby:
- Строка выполняется как команда оболочки. Если команда возвращает
0, защита применяется. Если команда возвращает любое другое значение, то свойство защиты не применяется. Строковые защиты в powershell_script выполняют команды Windows PowerShell и могут возвращатьtrueв дополнение к0. - Блок выполняется как код Ruby, который должен вернуть либо
trueлибоfalse. Если блок возвращаетtrue, свойство защиты применяется. Если блок возвращаетfalse, свойство защиты не применяется.
Свойство защиты полезно для обеспечения идемпотентности ресурса, позволяя этому ресурсу проверять желаемое состояние по мере выполнения, а затем, если желаемое состояние присутствует, Chef Infra Client ничего не делает.
СвойстваСледующие свойства могут использоваться для определения защиты, которая оценивается во время фазы выполнения Chef Infra Client:
not_if-
Предотвращает выполнение ресурса, когда условие возвращает
true. only_if-
Разрешает выполнение ресурса только в том случае, если условие возвращает
true.
Примеры
Следующие примеры демонстрируют различные подходы к использованию ресурса service в рецептах:
Запустить службу
service 'example_service' do
action :start
end
Запустить службу, включить её
service 'example_service' do
supports status: true, restart: true, reload: true
action [ :enable, :start ]
end
Использовать шаблон
service 'samba' do
pattern 'smbd'
action [:enable, :start]
end
Использовать общее действие :nothing
service 'memcached' do
action :nothing
end
Использовать атрибут retries
service 'apache' do
action [ :enable, :start ]
retries 3
end
Управление службой в зависимости от платформы узла
service 'example_service' do
if redhat?
service_name 'redhat_name'
else
service_name 'other_name'
end
supports restart: true
action [ :enable, :start ]
end
Перезагрузить службу с помощью шаблона
Для перезагрузки службы, основанной на шаблоне, используйте ресурсы template и service вместе в одном рецепте, подобно следующему:
template '/tmp/somefile' do
mode '0755'
source 'somefile.erb'
end
service 'apache' do
action :enable
subscribes :reload, 'template[/tmp/somefile]', :immediately
end
где уведомление subscribes используется для перезагрузки службы всякий раз, когда шаблон изменяется.
Включить службу после перезагрузки или перезапуска
service 'apache' do
supports restart: true, reload: true
action :enable
end
Установка IP-адреса с помощью переменных и шаблона
Следующий пример показывает, как ресурс template может использоваться в рецепте для объединения настроек, хранящихся в файле атрибутов, переменных в рецепте и шаблона для установки IP-адресов, используемых службой Nginx. Файл атрибутов содержит следующее:
default['nginx']['dir'] = '/etc/nginx'
Затем рецепт выполняет следующие действия:
- Объявить две переменные в начале рецепта, одну для удаленного IP-адреса и другую для разрешенного IP-адреса
- Использовать ресурс service для перезапуска и перезагрузки службы Nginx
- Загрузить шаблон с именем
authorized_ip.erbиз каталога/templates, который используется для установки значений IP-адресов на основе переменных, указанных в рецепте
node.default['nginx']['remote_ip_var'] = 'remote_addr'
node.default['nginx']['authorized_ips'] = ['127.0.0.1/32']
service 'nginx' do
supports :status => true, :restart => true, :reload => true
end
template 'authorized_ip' do
path "#{node['nginx']['dir']}/authorized_ip"
source 'modules/authorized_ip.erb'
owner 'root'
group 'root'
mode '0755'
variables(
:remote_ip_var => node['nginx']['remote_ip_var'],
:authorized_ips => node['nginx']['authorized_ips']
)
notifies :reload, 'service[nginx]', :immediately
end
где свойство variables сообщает шаблону использовать переменные, установленные в начале рецепта, а свойство source используется для вызова файла шаблона, расположенного в каталоге /templates кулинарной книги. Файл шаблона похож на:
geo $<%= @remote_ip_var %> $authorized_ip {
default no;
<% @authorized_ips.each do |ip| %>
<%= "#{ip} yes;" %>
<% end %>
}
Использовать таймер cron для управления службой
Следующий пример показывает, как установить приложение crond с помощью двух ресурсов и переменной:
# the following code sample comes from the ``cron`` cookbook:
# https://github.com/chef-cookbooks/cron
cron_package = case node['platform']
when 'redhat', 'centos', 'scientific', 'fedora', 'amazon'
node['platform_version'].to_f >= 6.0 ? 'cronie' : 'vixie-cron'
else
'cron'
end
package cron_package do
action :install
end
service 'crond' do
case node['platform']
when 'redhat', 'centos', 'scientific', 'fedora', 'amazon'
service_name 'crond'
when 'debian', 'ubuntu', 'suse'
service_name 'cron'
end
action [:start, :enable]
end
где
-
cron_package- это переменная, используемая для идентификации платформ, применяемых к пакетам установки - ресурс package использует переменную
cron_packageдля определения способа установки приложения crond на различных узлах (с различными платформами) - ресурс service включает приложение crond на узлах с Red Hat, CentOS, Red Hat Enterprise Linux, Fedora или Amazon Web Services (AWS), и службу cron на узлах, работающих на Debian, Ubuntu или openSUSE
Перезапустить службу, а затем уведомить другую службу
Следующий пример показывает, как запустить службу с именем example_service и немедленно уведомить службу Nginx о перезапуске.
service 'example_service' do
action :start
notifies :restart, 'service[nginx]', :immediately
end
Перезапустить одну службу перед перезапуском другой
Этот пример использует уведомление :before для перезапуска службы php-fpm перед перезапуском nginx:
service 'nginx' do
action :restart
notifies :restart, 'service[php-fpm]', :before
end
С уведомлением :before действие, указанное для ресурса nginx, не будет выполнено до тех пор, пока действие не будет выполнено над уведомлённым ресурсом (php-fpm).
Остановить службу, сделать что-то и затем перезапустить её
Следующий пример показывает, как использовать ресурсы execute, service и mount вместе, чтобы гарантировать, что узел, работающий на Amazon EC2, запускает MySQL. Этот пример делает следующее:
- Проверяет, есть ли на узле Amazon EC2 MySQL
- Если на узле есть MySQL, останавливает MySQL
- Устанавливает MySQL
- Подключается к узлу
- Перезапускает MySQL
# the following code sample comes from the ``server_ec2``
# recipe in the following cookbook:
# https://github.com/chef-cookbooks/mysql
if (node.attribute?('ec2') && ! FileTest.directory?(node['mysql']['ec2_path']))
service 'mysql' do
action :stop
end
execute 'install-mysql' do
command "mv #{node['mysql']['data_dir']}#{node['mysql']['ec2_path']}"
not_if do FileTest.directory?(node['mysql']['ec2_path']) end
end
[node['mysql']['ec2_path'], node['mysql']['data_dir']].each do |dir|
directory dir do
owner 'mysql'
group 'mysql'
end
end
mount node['mysql']['data_dir'] do
device node['mysql']['ec2_path']
fstype 'none'
options 'bind,rw'
action [:mount, :enable]
end
service 'mysql' do
action :start
end
end
где
- два ресурса service используются для остановки, а затем перезапуска службы MySQL
- ресурс execute используется для установки MySQL
- ресурс mount используется для подключения к узлу и включения MySQL
Управление службой с помощью ресурса execute
Предупреждение
Это пример того, чего делать НЕ следует. Используйте ресурс service для управления службой, а не ресурс execute.
Сделайте что-то вроде этого:
service 'tomcat' do
action :start
end
а НЕ что-то вроде этого:
execute 'start-tomcat' do
command '/etc/init.d/tomcat6 start'
action :run
end
Нет причин использовать ресурс execute для управления службой, поскольку ресурс service предоставляет свойство start_command напрямую, что даёт рецепту полный контроль над выданной командой гораздо более чистым и прямым способом.
Включить службу на AIX с помощью команды mkitab
Ресурс service не поддерживает использование действий :enable и :disable с ресурсами, управляемыми с помощью System Resource Controller (SRC). Это связано с тем, что у System Resource Controller (SRC) нет стандартного механизма для включения и выключения служб при загрузке системы.
Один из подходов для включения или выключения служб, управляемых System Resource Controller (SRC), заключается в использовании ресурса execute для вызова mkitab, а затем использование этой команды для включения или выключения службы.
Следующий пример показывает, как установить службу:
execute "install #{node['chef_client']['svc_name']} in SRC" do
command "mkssys -s #{node['chef_client']['svc_name']} -p #{node['chef_client']['bin']} -u root
-S
-n 15
-f 9
-o #{node['chef_client']['log_dir']}/client.log
-e #{node['chef_client']['log_dir']}/client.log -a '
-i #{node['chef_client']['interval']} -s #{node['chef_client']['splay']}'"
not_if "lssrc -s #{node['chef_client']['svc_name']}"
action :run
end
а затем включить её с помощью команды mkitab:
execute "enable #{node['chef_client']['svc_name']}" do
command "mkitab '#{node['chef_client']['svc_name']}:2:once:/usr/bin/startsrc
-s #{node['chef_client']['svc_name']} > /dev/console 2>&1'"
not_if "lsitab #{node['chef_client']['svc_name']}"
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/service/