#json #ansible
Вопрос:
У меня есть json, исходящий из такого API, как этот —
{
"Clusters": {
"cluster_name": "cluster1",
"desired_configs": {
"ams-env": {
"tag": "15646576543547354",
"version": 2
},
"ams-grafana-env": {
"tag": "156765743275788",
"version": 2
},
"ams-grafana-ini": {
"tag": "987657435754385457",
"version": 2
}
}
}
}
И мне нужно разобрать его с помощью ansible. Проблема в том, что переменная, которая будет передана, — это часть с дефисами.
Я могу напечатать имя тега debug: var
, но я не могу превратить его в факт, и я также не могу заставить его печатать, когда я использую debug: msg
Это игра — я хотел бы взять «тег» для того config_name
, что передается во время выполнения, и создать новый var, который будет передан в более поздние задачи
- name: Parsing Json
hosts: localhost
connection: local
tags: setup_infra
vars:
- config_name: ams-env
tasks:
- name: access fact
set_fact:
access_auths: "{{ lookup('file', 'ambari.json') | from_json }}"
- name: This works
debug:
var: access_auths.Clusters.desired_configs['{{ config_name }}'].tag
- name: This does not work
set_fact:
new_config: "{{ access_auths.Clusters.desired_configs['{{ config_name }}'].tag }}"
- name: Debug 0.3
debug:
var: new_config
Заранее спасибо за любую помощь
Ответ №1:
Эта проблема возникает из-за вложенности {{
разделителей jinja. config_name
Установленный вами параметр var уже является текстом "ams-env"
, поэтому нам также не нужно его снова цитировать.
Следующие задачи должны работать:
- debug:
msg: "tag is {{ access_auths['Clusters']['desired_configs'][config_name]['tag'] }}"
- set_fact:
new_config: "{{ access_auths['Clusters']['desired_configs'][config_name]['tag'] }}"
Комментарии:
1. Я знал, что это будет просто, но я просто не мог найти правильный синтаксис — большое спасибо за вашу помощь