Ресурс службы
Эта страница сгенерирована из исходного кода Chef.Ссылка на исходный код Chef. Чтобы предложить изменение, отредактируйте файл service.rb и отправьте запрос на вытягивание в репозиторий Chef.
Используйте ресурс 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_commandдля предотвращения необходимости указывать переопределения для свойствstart_command,stop_command, иrestart_command. Если это свойство не указано, Chef Infra Client будет использовать команду инициализации по умолчанию для используемого поставщика служб.
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] }установит приоритет двадцать для уровня выполнения два и приоритет пятьдесят пять для уровня выполнения три.
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, скрипт инициализации или другой поставщик служб могут использовать команду перезапуска; если:restartне указано, Chef Infra Client пытается остановить, а затем запустить службу. Для:reload, скрипт инициализации или другой поставщик служб могут использовать команду перезагрузки. Для:status, скрипт инициализации или другой поставщик служб могут использовать команду статуса для определения того, работает ли служба; если: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 InfraClient.
Уведомления
notifies-
Тип в Ruby: Символ, 'Chef::Resource[String]'
Ресурс может уведомить другой ресурс о действии при изменении его состояния. Укажите
'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[String]'
Ресурс может прослушивать другой ресурс и выполнять действие, если состояние прослушиваемого ресурса изменится. Укажите 'resource[name]', :action действие, которое нужно выполнить, а затем :timer для этого действия.
Обратите внимание, что 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 вместе для обеспечения работы MySQL на узле Amazon EC2. Этот пример делает следующее:
- Проверяет наличие MySQL на узле Amazon EC2
- Если 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/