CHEF: настроить запуск ресурса в конце при вызове другого (пользовательского) ресурса.
Я написал собственный ресурс sshd_allow_groups
что его действия изменяют некоторые атрибуты узла, и они используются при создании шаблона для /etc/sshd_config
в рецепте по умолчанию (в котором размещен пользовательский ресурс). Тем не менее, поскольку пользовательский ресурс обычно вызывается из других кулинарных книг, я не могу гарантировать, что ресурс шаблона будет вызываться после внесения изменений в атрибуты, создавая ситуацию, когда для получения желаемое изменение.
Я ищу способ активировать ресурс шаблона после вызова ресурса и выполнить его в конце (в случае, если ресурс вызывается несколько раз). notifies
не работает, потому что действие для шаблона не :nothing
, и не должно быть, потому что если для определенного узла этот ресурс не требуется, шаблон все еще должен быть написан.
мой пользовательский ресурс:
resource_name :sshd_allow_groups
property :group, String, name_property: true
default_action :append
action :append do
currently = node['tom-ssh']['allow_groups']
if currently
if !currently.include?(group)
node.normal['tom-ssh']['allow_groups'] = currently | [group]
end
else
node.normal['tom-ssh']['allow_groups'] = [group]
end
end
action :remove do
currently = node['tom-ssh']['allow_groups']
if currently && currently.include?(group)
node.normal['tom-ssh']['allow_groups'] = currently - [group]
end
end
другой рецепт должен называть это так:
sshd_allow_groups "bob" do
action :append
end
2 ответа
Пока не могу комментировать, поэтому нужно публиковать в качестве ответа... просто немного гниды, которую я нашел, пытаясь следовать примерам, которые Тенсибай дал в ответ. Непосредственный вызов вспомогательного метода не будет работать с вспомогательным методом, определенным в модулях. Вам нужно сделать экземпляры класса методов добавления / удаления. добавлять self.
перед добавлением / удалением. Тогда этот звонок будет работать:
Sshd_allow_group::Helpers.append("new_group")
Либо вы можете определить вспомогательные методы в классе для использования методов экземпляра, либо использовать помощники в классе.
В каталоге библиотек поваренной книги, в файле helpers.rb ( документ и запись в блоге):
module Sshd_allow_groups
module Helpers
def append(group)
node.normal['tom-ssh']['allow_groups'] = node['tom-ssh']['allow_groups'] | [group]
end
def remove(group)
node.normal['tom-ssh']['allow_groups'] = node['tom-ssh']['allow_groups'] - [group]
end
end
end
В вашем рецепте назовите это как:
Sshd_allow_group::Helpers.append("new_group")
Или, если вы абсолютно уверены (и такое должно переименовать методы), вы можете включить ваши вспомогательные методы в DSL рецепта:
::Chef::Recipe.send(:include, sshd_allow_groups::Helpers)
Я немного упростил ваш код, так как не чувствую необходимости в дополнительных проверках, но вы все равно можете получить исключение, если tom-ssh
атрибут не существует.
Я бы попытался уйти от node.normal
так как он остается на узле, даже если вы удалите рецепт, добавив группу позже. Подробнее об атрибутах здесь