#json #list #variables #ansible
#json #Список #переменные #ansible
Вопрос:
Я запускаю задачу, которая фиксирует состояние интерфейса для нескольких устройств, а в некоторых случаях и для более чем одного интерфейса, но я могу одновременно извлекать только одну stdout_lines, но мне нужно получить все stdout_lines для хостов, на которых выполняется команда. У меня есть код задачи для доступа к соответствующим stdout_lines списка, но не ко всем из них.
- name: Execute IOS command to check port state up/down before configuration
ios_command:
commands:
- "show ip int brief | in {{item}}"
loop: "{{ports}}"
register: PortUpDown
- name: print port state up/down
debug:
#msg: "{{item.0 | to_nice_yaml}}"
#msg: "{{item.1 | to_nice_yaml}}"
msg: "{{item}}"
loop:
#- "{{PortUpDown.results.0.stdout_lines}}"
#- "{{PortUpDown.results.1.stdout_lines}}"
- "{{PortUpDown.results}}"
register: PortUpDown
- name: print var that capture port state up/down
debug:
var: PortUpDown
Как вы можете видеть, я прокомментировал элементы, к которым я обращался во время тестирования. Что я в конечном счете хочу, так это иметь возможность доступа к 0,1,2,3 и т.д. без необходимости объявлять это, потому что в начале скрипта я не буду знать, будет ли это просто один интерфейс или несколько интерфейсов в списке, которые я собираюсь получить состояние порта.
Результат таков.
ok: [hub1] => {
"PortUpDown": {
"changed": false,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"item": [
{
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": null,
"commands": [
"show ip int brief | in Ethernet1/1"
],
"host": null,
"interval": 1,
"match": "all",
"password": null,
"port": null,
"provider": null,
"retries": 10,
"ssh_keyfile": null,
"timeout": null,
"username": null,
"wait_for": null
}
},
"item": "Ethernet1/1",
"stdout": [
"Ethernet1/1 unassigned YES NVRAM up up"
],
"stdout_lines": [
[
"Ethernet1/1 unassigned YES NVRAM up up"
]
]
},
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": null,
"commands": [
"show ip int brief | in Ethernet2/1"
],
"host": null,
"interval": 1,
"match": "all",
"password": null,
"port": null,
"provider": null,
"retries": 10,
"ssh_keyfile": null,
"timeout": null,
"username": null,
"wait_for": null
}
},
"item": "Ethernet2/1",
"stdout": [
"Ethernet2/1 unassigned YES NVRAM administratively down down"
],
"stdout_lines": [
[
"Ethernet2/1 unassigned YES NVRAM administratively down down"
]
]
}
],
"msg": [
{
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": null,
"commands": [
"show ip int brief | in Ethernet1/1"
],
"host": null,
"interval": 1,
"match": "all",
"password": null,
"port": null,
"provider": null,
"retries": 10,
"ssh_keyfile": null,
"timeout": null,
"username": null,
"wait_for": null
}
},
"item": "Ethernet1/1",
"stdout": [
"Ethernet1/1 unassigned YES NVRAM up up"
],
"stdout_lines": [
[
"Ethernet1/1 unassigned YES NVRAM up up"
]
]
},
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": null,
"commands": [
"show ip int brief | in Ethernet2/1"
],
"host": null,
"interval": 1,
"match": "all",
"password": null,
"port": null,
"provider": null,
"retries": 10,
"ssh_keyfile": null,
"timeout": null,
"username": null,
"wait_for": null
}
},
"item": "Ethernet2/1",
"stdout": [
"Ethernet2/1 unassigned YES NVRAM administratively down down"
],
"stdout_lines": [
[
"Ethernet2/1 unassigned YES NVRAM administratively down down"
]
]
}
]
}
]
}
}
ok: [hub2] => {
"PortUpDown": {
"changed": false,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"item": [
{
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": null,
"commands": [
"show ip int brief | in Ethernet1/1"
],
"host": null,
"interval": 1,
"match": "all",
"password": null,
"port": null,
"provider": null,
"retries": 10,
"ssh_keyfile": null,
"timeout": null,
"username": null,
"wait_for": null
}
},
"item": "Ethernet1/1",
"stdout": [
"Ethernet1/1 unassigned YES NVRAM up up"
],
"stdout_lines": [
[
"Ethernet1/1 unassigned YES NVRAM up up"
]
]
},
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": null,
"commands": [
"show ip int brief | in Ethernet2/1"
],
"host": null,
"interval": 1,
"match": "all",
"password": null,
"port": null,
"provider": null,
"retries": 10,
"ssh_keyfile": null,
"timeout": null,
"username": null,
"wait_for": null
}
},
"item": "Ethernet2/1",
"stdout": [
"Ethernet2/1 unassigned YES NVRAM administratively down down"
],
"stdout_lines": [
[
"Ethernet2/1 unassigned YES NVRAM administratively down down"
]
]
}
],
"msg": [
{
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": null,
"commands": [
"show ip int brief | in Ethernet1/1"
],
"host": null,
"interval": 1,
"match": "all",
"password": null,
"port": null,
"provider": null,
"retries": 10,
"ssh_keyfile": null,
"timeout": null,
"username": null,
"wait_for": null
}
},
"item": "Ethernet1/1",
"stdout": [
"Ethernet1/1 unassigned YES NVRAM up up"
],
"stdout_lines": [
[
"Ethernet1/1 unassigned YES NVRAM up up"
]
]
},
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": null,
"commands": [
"show ip int brief | in Ethernet2/1"
],
"host": null,
"interval": 1,
"match": "all",
"password": null,
"port": null,
"provider": null,
"retries": 10,
"ssh_keyfile": null,
"timeout": null,
"username": null,
"wait_for": null
}
},
"item": "Ethernet2/1",
"stdout": [
"Ethernet2/1 unassigned YES NVRAM administratively down down"
],
"stdout_lines": [
[
"Ethernet2/1 unassigned YES NVRAM administratively down down"
]
]
}
]
}
]
}
}
Ответ №1:
Для этого вы можете использовать комбинацию фильтра map
для извлечения stdout_lines
всех элементов вашего списка, а затем flatten
результирующего списка list.
Учитывая учебник:
- hosts: all
gather_facts: no
tasks:
- command: "echo {{ item }}"
loop:
- "Ethernet2/1 unassigned YES NVRAM administratively down down"
- "Ethernet1/1 unassigned YES NVRAM up up"
register: PortUpDown
- debug:
msg: "{{ item }}"
loop: "{{ PortUpDown.results | map(attribute='stdout_lines') | list | flatten }}"
Это приводит к повторению:
PLAY [all] *********************************************************************************************************
TASK [command] *****************************************************************************************************
changed: [localhost] => (item=Ethernet2/1 unassigned YES NVRAM administratively down down)
changed: [localhost] => (item=Ethernet1/1 unassigned YES NVRAM up up)
TASK [debug] *******************************************************************************************************
ok: [localhost] => (item=Ethernet2/1 unassigned YES NVRAM administratively down down) => {
"msg": "Ethernet2/1 unassigned YES NVRAM administratively down down"
}
ok: [localhost] => (item=Ethernet1/1 unassigned YES NVRAM up up) => {
"msg": "Ethernet1/1 unassigned YES NVRAM up up"
}
PLAY RECAP *********************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Комментарии:
1. быстрый вопрос по этому поводу. В каком разделе документа ansible я могу подробнее прочитать об этом, чтобы я мог полностью понять, что происходит?
2. Извините, я не совсем понял ваш вопрос? Что вы подразумеваете под тем, что происходит ?
3. О, я хотел сказать, есть ли какая-либо документация, которую я могу прочитать, которая касается обработки переменных с помощью maps и передачи фильтров.
4. Возможно, вам захочется сначала прочитать документацию Jinja , поскольку Jinja — это система шаблонов, используемая Ansible. На первый взгляд страница может показаться длинной, но на самом деле она не такая длинная, особенно если вы знаете, что у вас есть вся документация на этой странице. В Jinja добавлен набор дополнительных фильтров, и все они также сгруппированы на одной странице документации Ansible .
5. При всем этом у вас должен быть достаточно четкий обзор, насколько это касается шаблонов в Ansible.