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 так как он остается на узле, даже если вы удалите рецепт, добавив группу позже. Подробнее об атрибутах здесь

Другие вопросы по тегам