Recursos personalizados do Chef 12.5 - Acessando recursos em receitas

Recursos personalizados do Chef 12.5 - Acessando recursos em receitas

Estou escrevendo um livro de receitas que usa os recursos personalizados presentes no Chef 12.5. Eu tenho um recurso personalizado que usa um recurso de modelo e, como tal, possui umnotificaque recarrega o serviço associado.

Porém o serviço associado é gerenciado na receita principal. Atualmente isso falha porque reclama que não há serviço.

Nas versões anteriores, ao usar LWRPs, isso era causado pelo usouse_inline_resources, e acredito que você poderia contornar esse problema específico NÃO incluindo essa função em seu LWRP.

Agora NÃO estou incluindo esta linha em meu recurso personalizado, mas o comportamento está presente. Existe alguma maneira de desativar esse comportamento?

Alternativamente, existe alguma outra maneira de "incluir" o serviço em vários recursos para que eu não precise ter exatamente o mesmo código em muitos lugares?

Responder1

Com base na resposta de delerious010, eu e um colega conseguimos encontrar uma solução melhor para esta situação específica:

action :create do
  global_nginx = resources('service[nginx]')

  template "/etc/nginx/conf.d/#{name.tr(' ', '_')}.conf" do
    cookbook 'nginx_server'
    source 'server_block.conf.erb'
    owner 'root'
    group 'root'
    mode '0644'
    variables(
      listen: listen,
      server_name: real_server_name,
      root: root,
      index: index,
      config: config
    )
    notifies :reload, global_nginx, :delayed
  end
end

Obviamente, este exemplo tem apenas um recurso sendo gerenciado, mas deve permitir que você tenha vários e notifique apenas aqueles que deseja.

EDIT: Observe que isso depende de um bug (https://github.com/chef/chef/issues/4669) que o Chef Developers irá corrigir. Como em 12.9.38 as pesquisas na coleção de recursos foram feitas para recorrer para cima, para run_contexts externos, esse código ainda funcionará, mas não será mais necessário (e manipulará corretamente subcontextos aninhados múltiplos onde você precisa capturar um recurso na raiz e não apenas o run_context pai). A melhor solução aqui deve ser apenas atualizar.

Responder2

No Chef 12.5, use_inline_resources está ativado por padrão. Isto tem o efeito de que, sempre que um sub-recurso for atualizado, o LWRP será sinalizado como tendo sido alterado. Dessa forma, você sempre pode definir a notificação de recurso no LWRP "pai".

Ou, se desejar que a cláusula notitis seja definida para todas as instâncias do seu LWRP, você pode criar a notificação diretamente no bloco de ação:

notifies_delayed(:restart, resources("service[rsyslog]"))

No entanto, tenha em mente quequalquerrecurso modificado em seu LWRP faria com que o serviço fosse reiniciado. Embora possa ser possível usar a chamada para recursos para definir uma notifiespropriedade no recurso filho. Não tenho certeza, pois ainda não testei isso.

Responder3

Em 12.9.38, a capacidade de notificar de um provedor sub-resource-collection/use_inline_resources para um resource_collection externo foi adicionada por:

https://github.com/chef/chef/commit/0ca27b6f30ccd327505bd3a44bd319fb3eba956b

Este agora é o comportamento padrão das notificações, então você só precisará atualizar.

informação relacionada