Estoy tratando de convertir una respuesta de un dispositivo al formato yaml. Intenté usar with_together
, parece que es lo más cerca que puedo llegar al resultado deseado. También probé con la plantilla Jinja2, aunque tengo problemas para analizar los datos de la respuesta en Jinja2. Parece que me falta otro ciclo para iterar sobre los prefijos.
Tareas:
- name: Gather Junos prefix-lists
junipernetworks.junos.junos_prefix_lists:
state: gathered
register: prefix_response
- name: parse info
set_fact:
prefix_name: "{{ prefix_response | to_json | from_json | json_query(prefix_name_query) }}"
prefix: "{{ prefix_response | to_json | from_json | json_query(prefix_query) }}"
vars:
prefix_name_query: 'gathered[].name'
prefix_query: 'gathered[]."address_prefixes"'
- name: Write to file
ansible.builtin.lineinfile:
path: "output.yaml"
state: present
line: |
- prefix_list_name: {{ item.0 }}
prefix:
- {{ item.1 }}
with_together:
- "{{ prefix_name }}"
- "{{ prefix }}"
prefijo_respuesta:
[
{
"address_prefixes": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16"
],
"name": "test1"
},
{
"address_prefixes": [
"1.1.1.1/32",
"2.2.2.2/32",
"3.3.3.3/32"
],
"name": "test2"
}
]
Rentabilidad actual:
- prefix_list_name: RFC_1918
prefix:
- 10.0.0.0/8
- prefix_list_name: test2
prefix:
- 1.1.1.1/32
Retorno deseado:
- prefix_list_name: TEST1
prefix:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- prefix_list_name: TEST2
prefix:
- 1.1.1.1/32
- 2.2.2.2/32
- 3.3.3.3/32
Solución del problema
Cree un diccionario y utilícelo en la plantilla a continuación
- template:
src: output.yaml.j2
dest: output.yaml
vars:
prefix_response_dict: "{{ prefix_response.gathered|
items2dict(key_name='name',
value_name='address_prefixes') }}"
shell> cat output.yaml.j2
{% for k,v in prefix_response_dict.items() %}
- prefix_list_name: {{ k|upper }}
prefix:
{{ v|to_nice_yaml|indent(4) }}
{%- endfor %}
da
shell> cat output.yaml
- prefix_list_name: TEST1
prefix:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- prefix_list_name: TEST2
prefix:
- 1.1.1.1/32
- 2.2.2.2/32
- 3.3.3.3/32
Si desea crear la estructura, primero convierta los nombres a mayúsculas.
prefix_response_keys: "{{ prefix_response.gathered|
map(attribute='name')|
map('upper')|
map('community.general.dict_kv', 'name')|list }}"
da
prefix_response_keys:
- name: TEST1
- name: TEST2
Luego, actualice el nombre del atributo en la lista
prefix_response_uppr: "{{ prefix_response.gathered|
zip(prefix_response_keys)|
map('combine')|list }}"
da
prefix_response_uppr:
- address_prefixes:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
name: TEST1
- address_prefixes:
- 1.1.1.1/32
- 2.2.2.2/32
- 3.3.3.3/32
name: TEST2
El resultado esperado, lo que desea, es la lista anterior con nombres modificados de los atributos. Solo hay dos atributos ( name y address_prefixes ), por lo tanto, convirtámoslo en un diccionario.
prefix_response_dict: "{{ prefix_response_uppr|
items2dict(key_name='name',
value_name='address_prefixes') }}"
da
prefix_response_dict:
TEST1:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
TEST2:
- 1.1.1.1/32
- 2.2.2.2/32
- 3.3.3.3/32
Luego, volvamos a convertirlo en una lista y cambiemos los nombres de los atributos.
prefix_response_list: "{{ prefix_response_dict|
dict2items(key_name='prefix_list_name',
value_name='prefix') }}"
da
prefix_response_list:
- prefix:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
prefix_list_name: TEST1
- prefix:
- 1.1.1.1/32
- 2.2.2.2/32
- 3.3.3.3/32
prefix_list_name: TEST2
Ahora, escríbalo en un archivo. Use el filtro to_nice_yaml para formatear la salida YAML
shell> cat output.yaml.j2
{{ prefix_response_list|to_nice_yaml }}
Ponga las declaraciones de las variables según corresponda. Por ejemplo, la siguiente tarea
- template:
src: output.yaml.j2
dest: output.yaml
vars:
prefix_response_keys: "{{ prefix_response.gathered|
map(attribute='name')|
map('upper')|
map('community.general.dict_kv', 'name')|list }}"
prefix_response_uppr: "{{ prefix_response.gathered|
zip(prefix_response_keys)|
map('combine')|list }}"
prefix_response_dict: "{{ prefix_response_uppr|
items2dict(key_name='name',
value_name='address_prefixes') }}"
prefix_response_list: "{{ prefix_response_dict|
dict2items(key_name='prefix_list_name',
value_name='prefix') }}"
creará el archivo
shell> cat output.yaml
- prefix:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
prefix_list_name: TEST1
- prefix:
- 1.1.1.1/32
- 2.2.2.2/32
- 3.3.3.3/32
prefix_list_name: TEST2
No hay comentarios.:
Publicar un comentario