Koch 11: irgendeiner Weise zu drehen, Attribute in ein ruby-hash?
Ich bin generieren eine config für meinen Dienst in der chef-Attribute. Aber irgendwann muss ich wiederum das Attribut Maische in ein einfaches ruby-hash. Diese verwendet, um gut funktionieren in Koch 10:
node.myapp.config.to_hash
Jedoch, beginnend mit Koch 11, das funktioniert nicht. Nur die top-Ebene der Attribut-Konvertierung in einen hash, dann mit verschachtelten verbleibenden Werte unveränderlich mash-Objekte. Sie zu ändern, führt zu Fehlern wie diesem:
Koch::Exceptions::ImmutableAttributeModification
------------------------------------------------ Knoten-Attribute sind schreibgeschützt, wenn Sie nicht angeben, welche Priorität zu setzen. Zu
legen Sie ein Attribut verwenden, code wie `Knoten.default["key"] = "Wert"'
Habe ich versucht, ein paar Möglichkeiten, um dieses Problem, die nicht arbeiten:
node.myapp.config.dup.to_hash
JSON.parse(node.myapp.config.to_json)
Json-parsing-hack, die scheint, wie es sollte Super funktionieren, Ergebnisse, in:
JSON::ParserError
unexpected token at '"#<Chef::Node::Attribute:0x000000020eee88>"'
Ist es, die tatsächliche zuverlässige Möglichkeit, kurz darunter eine nested-parsing-Funktion in jedem Kochbuch, konvertieren von Attributen zu einer einfachen, normalen, guten alten ruby-hash?
- Warum brauchen Sie die hash?
- ich brauche es nicht-ich könnte jeder Zeit aufhören ich will!!! aber im ernst, ich Baue eine config-Datei aus vielen unterschiedlichen Parametern, und ich brauche zu ändern, bevor Sie zu schreiben in der config-Datei. es ist wirklich hilfreich zum konvertieren der Attribute in einer hash, mutieren Sie, und verwenden Sie dann den hash.
Du musst angemeldet sein, um einen Kommentar abzugeben.
nach einem durchschlagenden Mangel der Antworten sowohl hier als auch auf der opscode chef mailing-Liste, landete ich mit den folgenden hack:
lege ich diese in den Bibliotheken, die dir in mein Kochbuch; jetzt kann ich mit-Attribut.to_hash in beiden chef 10 (der bereits richtig gearbeitet und ist unberührt von diesem monkey-patch) und chef 11. ich habe auch berichtet, dies als bug zu opscode:
, wenn Sie nicht wollen, haben zu monkey-patch Ihren chef, sprechen bis auf dieses Problem:http://tickets.opscode.com/browse/CHEF-3857
Update: monkey-patch-ticket markiert wurde geschlossen diese PRs
Ich hoffe ich bin nicht zu spät, um die Partei, sondern die Verschmelzung der node-Objekt mit einem leeren hash hat es für mich:
Ich hatte das gleiche problem und nach viel hacking rund kam mit dieser:
inspizieren, macht die Tiefe Analyse, was fehlt, von den anderen Methoden vorgeschlagen und ich am Ende mit einem hash, den ich ändern kann, und übergeben Sie herum, als nötig.
JSON.parse(hash.to_json, symbolize_names: true)
. Ziemlich böse, ist aber viel einfacher zu pflegen als komplexer Lösungen.Die obige Antwort ist ein wenig unnötig. Sie können nur dazu:
to_hash
seicht ist, werden Sie am Ende mitImmutableMash
Objekte als Werte. dieto_json
Funktion muss nicht wissen, wie man mit dieser Art von Objekt und barf. das ist der springende Punkt dieser Frage.