我正在尝试将设备的响应转换为 yaml 格式。我尝试使用with_together,似乎它是我能得到的最接近所需的输出。我还尝试使用 Jinja2 模板,但在将响应中的数据解析为 Jinja2 时遇到问题。似乎我缺少另一个循环来迭代前缀。
任务:
- 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 }}"
Run Code Online (Sandbox Code Playgroud)
前缀_响应:
[
{
"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"
}
]
Run Code Online (Sandbox Code Playgroud)
当前回报:
- prefix_list_name: RFC_1918
prefix:
- 10.0.0.0/8
- prefix_list_name: test2
prefix:
- 1.1.1.1/32
Run Code Online (Sandbox Code Playgroud)
期望回报:
- 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
Run Code Online (Sandbox Code Playgroud)
创建一个字典并在下面的模板中使用它
- template:
src: output.yaml.j2
dest: output.yaml
vars:
prefix_response_dict: "{{ prefix_response.gathered|
items2dict(key_name='name',
value_name='address_prefixes') }}"
Run Code Online (Sandbox Code Playgroud)
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 %}
Run Code Online (Sandbox Code Playgroud)
给出
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
Run Code Online (Sandbox Code Playgroud)
如果要创建结构,请先将名称转换为大写
prefix_response_keys: "{{ prefix_response.gathered|
map(attribute='name')|
map('upper')|
map('community.general.dict_kv', 'name')|list }}"
Run Code Online (Sandbox Code Playgroud)
给出
prefix_response_keys:
- name: TEST1
- name: TEST2
Run Code Online (Sandbox Code Playgroud)
然后,更新列表中的属性名称
prefix_response_uppr: "{{ prefix_response.gathered|
zip(prefix_response_keys)|
map('combine')|list }}"
Run Code Online (Sandbox Code Playgroud)
给出
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
Run Code Online (Sandbox Code Playgroud)
您想要的预期结果是上面的列表,其中属性名称已更改。只有两个属性(name和address_prefixes),因此,让我们将其转换为字典
prefix_response_dict: "{{ prefix_response_uppr|
items2dict(key_name='name',
value_name='address_prefixes') }}"
Run Code Online (Sandbox Code Playgroud)
给出
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
Run Code Online (Sandbox Code Playgroud)
然后,我们将其转换回列表并更改属性的名称
prefix_response_list: "{{ prefix_response_dict|
dict2items(key_name='prefix_list_name',
value_name='prefix') }}"
Run Code Online (Sandbox Code Playgroud)
给出
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
Run Code Online (Sandbox Code Playgroud)
现在,将其写入文件。使用过滤器to_nice_yaml格式化 YAML 输出
shell> cat output.yaml.j2
{{ prefix_response_list|to_nice_yaml }}
Run Code Online (Sandbox Code Playgroud)
适当地放置变量的声明。例如下面的任务
- 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') }}"
Run Code Online (Sandbox Code Playgroud)
将创建文件
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1497 次 |
| 最近记录: |