![Recursos personalizados de Chef 12.5: acceso a recursos en recetas](https://rvso.com/image/668776/Recursos%20personalizados%20de%20Chef%2012.5%3A%20acceso%20a%20recursos%20en%20recetas.png)
Estoy escribiendo un libro de cocina que utiliza los recursos personalizados presentes en Chef 12.5. Tengo un recurso personalizado que utiliza un recurso de plantilla y como tal tiene unnotificaque recarga el servicio asociado.
Sin embargo el servicio asociado se gestiona en la receta principal. Actualmente esto falla ya que se queja de que no hay servicio.
En versiones anteriores, cuando se usaban LWRP, esto se debía al usouse_inline_resources, y creo que podrías evitar este problema en particular NO incluyendo esta función en tu LWRP.
Ahora NO incluyo esta línea en mi recurso personalizado, pero el comportamiento está presente. ¿Hay alguna forma de desactivar este comportamiento?
Alternativamente, ¿hay alguna otra forma de "incluir" el servicio en múltiples recursos para no tener que tener exactamente el mismo código en muchos lugares?
Respuesta1
Según la respuesta de delerious010, un colega y yo pudimos encontrar una solución mejor para esta situación en particular:
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, en este ejemplo solo se administra un recurso, pero debería permitirle tener varios y solo notificar los que desee.
EDITAR: Tenga en cuenta que esto se basa en un error (https://github.com/chef/chef/issues/4669) que los desarrolladores de Chef solucionarán. Debido a que en 12.9.38 las búsquedas en la colección de recursos se realizaron para recurrir hacia contextos de ejecución externos, este código seguirá funcionando, pero ya no será necesario (y manejará correctamente múltiples subcontextos anidados donde necesita tomar un recurso en la raíz y no solo el run_context padre). La mejor solución aquí debería ser simplemente actualizar.
Respuesta2
En Chef 12.5, use_inline_resources está activado de forma predeterminada. Esto tiene el efecto de que, cada vez que se actualiza un subrecurso, se marcará que el LWRP ha cambiado. Como tal, siempre puede definir la notificación de recursos en el LWRP "principal".
O, si desea que la cláusula de notificación esté definida para todas las instancias de su LWRP, siempre puede crear la notificación directamente en el bloque de acción:
notifies_delayed(:restart, resources("service[rsyslog]"))
Sin embargo, tenga en cuenta quecualquierEl recurso modificado dentro de su LWRP provocaría que el servicio se reiniciara. Aunque es posible utilizar la llamada a recursos para definir una notifies
propiedad en el recurso secundario. No estoy del todo seguro, ya que todavía no lo he probado.
Respuesta3
En 12.9.38, la capacidad de notificar desde un proveedor de subcolección de recursos/use_inline_resources a una colección de recursos externa se agregó mediante:
https://github.com/chef/chef/commit/0ca27b6f30ccd327505bd3a44bd319fb3eba956b
Este es ahora el comportamiento predeterminado de las notificaciones, por lo que solo debería necesitar actualizar.