Ich schreibe ein Kochbuch, das die benutzerdefinierten Ressourcen von Chef 12.5 verwendet. Ich habe eine benutzerdefinierte Ressource, die eine Vorlagenressource verwendet und als solche einebenachrichtigtdas den zugehörigen Dienst neu lädt.
Der zugehörige Dienst wird jedoch im Hauptrezept verwaltet. Derzeit schlägt dies fehl, da bemängelt wird, dass kein Dienst vorhanden ist.
In früheren Versionen wurde dies bei der Verwendung von LWRPs durch die Verwendung verursachtInline-Ressourcen verwenden, und ich glaube, Sie könnten dieses spezielle Problem umgehen, indem Sie diese Funktion NICHT in Ihr LWRP aufnehmen.
Jetzt füge ich diese Zeile NICHT in meine benutzerdefinierte Ressource ein, aber das Verhalten ist vorhanden. Gibt es eine Möglichkeit, dieses Verhalten abzuschalten?
Gibt es alternativ eine andere Möglichkeit, den Dienst in mehrere Ressourcen „einzubinden“, sodass ich nicht an vielen, vielen Stellen genau denselben Code verwenden muss?
Antwort1
Basierend auf der Antwort von delerious010 konnten ich und ein Kollege eine bessere Lösung für diese spezielle Situation finden:
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
In diesem Beispiel wird offensichtlich nur eine einzige Ressource verwaltet, Sie sollten aber mehrere haben und nur die benachrichtigen können, die Sie möchten.
EDIT: Beachten Sie, dass dies auf einem Fehler beruht (https://github.com/chef/chef/issues/4669), das die Chef-Entwickler beheben werden. Da in 12.9.38 Suchvorgänge in der Ressourcensammlung so durchgeführt wurden, dass sie nach oben zu äußeren Run_Contexts rekursiv waren, wird dieser Code zwar noch funktionieren, aber nicht mehr erforderlich sein (und wird mehrfach verschachtelte Subkontexte korrekt verarbeiten, bei denen Sie eine Ressource in der Wurzel und nicht nur im übergeordneten Run_Context abrufen müssen). Die beste Lösung hier sollte einfach ein Upgrade sein.
Antwort2
In Chef 12.5 ist use_inline_resources standardmäßig aktiviert. Dies hat zur Folge, dass jedes Mal, wenn eine untergeordnete Ressource aktualisiert wird, das LWRP als geändert gekennzeichnet wird. Daher können Sie die Ressourcenbenachrichtigung immer auf dem „übergeordneten“ LWRP definieren.
Wenn Sie möchten, dass die Benachrichtigungsklausel für alle Instanzen Ihres LWRP definiert wird, können Sie die Benachrichtigung jederzeit direkt im Aktionsblock erstellen:
notifies_delayed(:restart, resources("service[rsyslog]"))
Bedenken Sie jedoch, dassbeliebigEine in Ihrem LWRP geänderte Ressource würde einen Neustart des Dienstes verursachen. Es ist jedoch möglich, den Aufruf von Ressourcen zu verwenden, um eine notifies
Eigenschaft für die untergeordnete Ressource zu definieren. Ich bin mir nicht ganz sicher, da ich das noch nicht getestet habe.
Antwort3
In 12.9.38 wurde die Möglichkeit zur Benachrichtigung von einem untergeordneten Ressourcensammlungs-/Use_Inline_Resources-Anbieter an eine äußere Ressourcensammlung wie folgt hinzugefügt:
https://github.com/chef/chef/commit/0ca27b6f30ccd327505bd3a44bd319fb3eba956b
Dies ist nun das Standardverhalten von Benachrichtigungen, Sie müssen daher nur ein Upgrade durchführen.