Я использую python, чтобы попасть в API-интерфейс мастера, чтобы собрать некоторые факты обо всех узлах, о которых знает бригадир. К сожалению, нет get-all-hosts-фактов (или что-то подобное) в API-интерфейсе v1, поэтому мне нужно пройти через все хосты и получить информацию. Это привело меня к раздражающей проблеме. Каждый вызов данного хоста вернуть объект JSON выглядеть примерно так:Запись нескольких объектов JSON как одного объекта в один файл с помощью python
{
"host1.com": {
"apt_update_last_success": "1452187711",
"architecture": "amd64",
"augeasversion": "1.2.0",
"bios_release_date": "06/03/2015",
"bios_vendor": "Dell Inc."
}
}
Это совершенно нормально, проблема возникает, когда я добавляю информацию следующего хозяина. Затем я получаю JSON-файл, который выглядит примерно так:
{
"host1.com": {
"apt_update_last_success": "1452187711",
"architecture": "amd64",
"augeasversion": "1.2.0",
"bios_release_date": "06/03/2015",
"bios_vendor": "Dell Inc."
}
}{
"host2.com": {
"apt_update_last_success": "1452703454",
"architecture": "amd64",
"augeasversion": "1.2.0",
"bios_release_date": "06/03/2015",
"bios_vendor": "Dell Inc."
}
}
Вот код, который делает это:
for i in hosts_data:
log.info("Gathering host facts for host: {}".format(i['host']['name']))
try:
facts = requests.get(foreman_host+api+"hosts/{}/facts".format(i['host']['id']), auth=(username, password))
if hosts.status_code != 200:
log.error("Unable to connect to Foreman! Got retcode '{}' and error message '{}'"
.format(hosts.status_code, hosts.text))
sys.exit(1)
except requests.exceptions.RequestException as e:
log.error(e)
facts_data = json.loads(facts.text)
log.debug(facts_data)
with open(results_file, 'a') as f:
f.write(json.dumps(facts_data, sort_keys=True, indent=4))
Вот что мне нужно файл выглядеть следующим образом:
{
"host1.com": {
"apt_update_last_success": "1452187711",
"architecture": "amd64",
"augeasversion": "1.2.0",
"bios_release_date": "06/03/2015",
"bios_vendor": "Dell Inc."
},
"host2.com": {
"apt_update_last_success": "1452703454",
"architecture": "amd64",
"augeasversion": "1.2.0",
"bios_release_date": "06/03/2015",
"bios_vendor": "Dell Inc."
}
}
Спасибо! Я сейчас дам это. –
Работал как шарм! Спасибо @pault –
Np. Единственное, что нужно знать, это то, что 'dict.update()' заменяет содержимое, если ключ уже существует (например, в вашем случае, если 'hosts_data' содержит дубликаты). – pault