Attribute im Rezept überschreiben

Angenommen, ich habe ein Standardattribut in einem Kochbuch:

default.nginx_upstreams = {
    'service1' => ['service1.server.com'],
    'service2' => ['service2.server.com'],
}

Dann wird es geändert und in Rollen und Umgebungen überschrieben, bis es endlich zu meinem Rezept kommt. Dort berechne ich einige zusätzliche Dienste, die ich dem Attribut hinzufügen möchte. Wenn ich so etwas mache:

node.nginx_upstreams.merge! {'service3' => ['service3.server.com']}

Wenn ich dann versuche, das Attribut in meiner Vorlage zu verwenden, erhalte ich eineundefined method 'each' for nil:NilClass in meiner Vorlage, wenn ich versuche, zu tun

<% node.nginx_upstreams.each do |name, servers| %>

Außerdem bekomme ich auch eineWARN: Setting attributes without specifying a precedence is deprecated and will be removed in Chef 11.0. Die hilfreiche Warnung sagt mir, wie man Attribute mit normaler Priorität setzt (anscheinend mitnode.set["key"] = "value", sagt mir aber nicht, wie Standard- oder Überschreibungsattribute angegeben werden sollen.

Ich kann dieses Problem umgehen, indem ich Folgendes mache:

upstreams = node.nginx_upstreams.to_hash
upstreams.merge! {'service3' => ['service3.server.com']}

template "nginx_config" do
    variables({:upstreams=>upstreams})
end

aber das fühlt sich an wie ein Hack. Ich kann keine Dokumentation zu findennode.set() darüber hinausdiese SeiteDies zeigt auch an, dass Sie im Rezept sowohl normale als auch Überschreibungsattribute festlegen können, sagt aber nicht, wie.

Also ... wie setzt man Attribute (die zusammen mit allem anderen tief verwoben werden) im Rezept richtig ein? Was macht dienode.set() Aufruf tatsächlich tun, und kann ich ihm den Vorrang mitteilen, bei dem ich zusammenführen möchte?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage