Ich habe einen Anwendungsfall, wo ich Schlüssel auswählen muss: Wert-Paare aus einer neuen YAML-Datei. Überprüfen Sie, ob dieser Schlüssel in der alten YAML-Datei vorhanden ist und ob er den Wert kopiert und in der neuen YAML-Datei festlegt.
Wenn der Schlüssel nicht in der alten Datei vorhanden ist, fragen Sie den Benutzer.Kopieren von Inhalt von einem YAML zu einem anderen YAML nach dem Vergleich der Schlüssel
Code:
copyfile('all.isv', '/home/ubuntu/tmp/deploy/all')
with open("/home/ubuntu/ansible-environments/aws/lp/all", 'r') as f1:
try:
oldvars = yaml.load(f1)
with open("/home/ubuntu/tmp/deploy/all", 'rw') as f2:
newvars = yaml.load(f2)
for key,value in newvars.items():
print key, ":", value
if key in f1:
value = oldvars.items(value)
print key,value
f2.write(value)
else:
value = raw_input("Enter the value ")
Es funktioniert nicht. Nicht in der Lage zu verstehen, wie Sie den Schlüssel in der alten Datei überprüfen und den Wert für diesen Schlüssel in die neue Datei schreiben.
Neue Datei:
# Enter the release and build you wish to deploy
release: "4.0"
build: "4_0_178"
ems_release: "4.0"
ems_build: "4_0_982"
build_type: "gold_master"
# The name prefix is synonymous with the stack (i.e. pdx02-cloud-prod)
name_prefix: syd01-devops-test
# The deployment type is one of: [ test | trial | dev | prod ]
deployment_type: test
# deployment_url is typically the same value as deployment type unless it is a premium deployment.
# In that case deployment_type is set to prod and deployment_url is either dev, trial or test
deployment_url: "{{ deployment_type }}"
some_new_var: hello
Alte Datei:
# Enter the release and build you wish to deploy
release: "4.0"
build: "4_0_178"
ems_release: "4.0"
ems_build: "4_0_999"
build_type: test_build
# The name prefix is synonymous with the stack (i.e. pdx02-cloud-prod)
name_prefix: syd01-devops-deepali
# The deployment type is one of: [ test | trial | dev | prod ]
deployment_type: trial
# deployment_url is typically the same value as deployment type unless it is a premium deployment.
# In that case deployment_type is set to prod and deployment_url is either dev, trial or test
deployment_url: "{{ deployment_type }}"
Erwartet: Datei erzeugt zwei Dateien mit (alten und neuen)
# Enter the release and build you wish to deploy
release: "4.0"
build: "4_0_178"
ems_release: "4.0"
ems_build: "4_0_999"
build_type: test_build
# The name prefix is synonymous with the stack (i.e. pdx02-cloud-prod)
name_prefix: syd01-devops-deepali
# The deployment type is one of: [ test | trial | dev | prod ]
deployment_type: trial
# deployment_url is typically the same value as deployment type unless it is a premium deployment.
# In that case deployment_type is set to prod and deployment_url is either dev, trial or test
deployment_url: "{{ deployment_type }}"
some_new_var: Value provided by user as input
Es werden nur die Schlüsselwerte ausgegeben, aber die Formatierung, Reihenfolge und Kommentare aus der Datei werden entfernt. Es wirft nur die neuen vars ab. Also wie schreibe ich einfach die neuen Werte für den Schlüssel und behalte die Formatierung/.content. –
@DeepaliMittal Ihre Spezifikation sagt nichts über Schlüssel aus, die sich in der alten Datei befinden, aber nicht in der neuen. Was willst du mit ihnen machen? Vielleicht können Sie Ihre Frage mit zwei Beispiel-Eingabedateien und der erwarteten Ausgabe aktualisieren. Ich aktualisierte auch die Frage, also behält es die Bestellung bei/behält Anmerkungen – Anthon
Dank. Aber dieser Code behält auch das Format nicht bei. Die Ausgabe, die ich mit diesem Code erhalte, ist etwa so: ordereddict ([('release', '4.0'), ('build', '4_0_178'), ('ems_release', '4.0 '), (' ems_build ',' 4_0_982 '), (' build_type ',' gold_master '), (' name_prefix ',' syd01-devops-deepali ')]) "Auch ich habe mit Dateien aktualisiert. Was ich will ist die Datei sollte gleich bleiben, aber die Werte für verschiedene Schlüssel sollte durch Bezugnahme auf alte Datei oder Benutzer geändert werden –