Ansible - 循环播放结果+语句
问题描述:
我的目标是循环访问cisco交换机上的接口,检查访问vlan,然后在设置为“12”时更改该vlan,或者在其他时候更改为12。这样做,我保存结果“int_out”:Ansible - 循环播放结果+语句
- name: check vlan on some interfaces and save to int_out
ios_command:
commands: show run int Fa0/{{ item }} | incl switchport access vlan
provider: "{{ cli }}"
with_sequence: start=1 end=3 stride=1
register: int_out
我想遍历所有的“int_out”的结果,并使用“时,”就像下面众所周知声明改变接入VLAN:
- name: change vlan if needed
ios_config:
lines: switchport access vlan 1234
parents: interface Fa0/{{item}}
when: item.stdout_lines == " switchport access vlan 12"
with_items: "{{ int_out.results }}"
但比较不起作用:
TASK [change vlan when needed] *************************************************
skipping: [192.168.0.33] => (item={u'changed': False, '_ansible_no_log': False, u'stdout': [u' switchport access vlan 12'], '_ansible_item_result': True, 'item': u'1', 'invocation': {'module_name': u'ios_command', u'module_args': {u'authorize': False, u'username': u'admin', u'commands': [u'show run int Fa0/1 | incl switchport access vlan'], u'auth_pass': None, u'retries': 10, u'waitfor': None, u'interval': 1, u'host': u'192.168.0.33', u'ssh_keyfile': None, u'timeout': 10, u'provider': u"{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}", u'password': u'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', u'port': 22}}, u'stdout_lines': [[u' switchport access vlan 12']]})
skipping: [192.168.0.33] => (item={u'changed': False, '_ansible_no_log': False, u'stdout': [u' switchport access vlan 12'], '_ansible_item_result': True, 'item': u'2', 'invocation': {'module_name': u'ios_command', u'module_args': {u'authorize': False, u'username': u'admin', u'commands': [u'show run int Fa0/2 | incl switchport access vlan'], u'auth_pass': None, u'retries': 10, u'waitfor': None, u'interval': 1, u'host': u'192.168.0.33', u'ssh_keyfile': None, u'timeout': 10, u'provider': u"{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}", u'password': u'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', u'port': 22}}, u'stdout_lines': [[u' switchport access vlan 12']]})
skipping: [192.168.0.33] => (item={u'changed': False, '_ansible_no_log': False, u'stdout': [u' switchport access vlan 12'], '_ansible_item_result': True, 'item': u'3', 'invocation': {'module_name': u'ios_command', u'module_args': {u'authorize': False, u'username': u'admin', u'commands': [u'show run int Fa0/3 | incl switchport access vlan'], u'auth_pass': None, u'retries': 10, u'waitfor': None, u'interval': 1, u'host': u'192.168.0.33', u'ssh_keyfile': None, u'timeout': 10, u'provider': u"{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}", u'password': u'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', u'port': 22}}, u'stdout_lines': [[u' switchport access vlan 12']]})
如果我检查“item.stdout_lines”的输出,看啥子的错误:
- debug: msg= "{{ item.stdout_lines }}"
with_items: "{{ int_out.results }}"
我得到的不仅stdout_lines但多了很多:
TASK [debug] *******************************************************************
ok: [192.168.0.33] => (item={u'changed': False, '_ansible_no_log': False, u'stdout': [u' switchport access vlan 12'], '_ansible_item_result': True, 'item': u'1', 'invocation': {'module_name': u'ios_command', u'module_args': {u'authorize': False, u'username': u'admin', u'commands': [u'show run int Fa0/1 | incl switchport access vlan'], u'auth_pass': None, u'retries': 10, u'waitfor': None, u'interval': 1, u'host': u'192.168.0.33', u'ssh_keyfile': None, u'timeout': 10, u'provider': u"{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}", u'password': u'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', u'port': 22}}, u'stdout_lines': [[u' switchport access vlan 12']]}) => {
"item": {
"changed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": false,
"commands": [
"show run int Fa0/1 | incl switchport access vlan"
],
"host": "192.168.0.33",
"interval": 1,
"password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
"port": 22,
"provider": "{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}",
"retries": 10,
"ssh_keyfile": null,
"timeout": 10,
"username": "admin",
"waitfor": null
},
"module_name": "ios_command"
},
"item": "1",
"stdout": [
" switchport access vlan 12"
],
"stdout_lines": [
[
" switchport access vlan 12"
]
]
},
"msg": ""
}
ok: [192.168.0.33] => (item={u'changed': False, '_ansible_no_log': False, u'stdout': [u' switchport access vlan 12'], '_ansible_item_result': True, 'item': u'2', 'invocation': {'module_name': u'ios_command', u'module_args': {u'authorize': False, u'username': u'admin', u'commands': [u'show run int Fa0/2 | incl switchport access vlan'], u'auth_pass': None, u'retries': 10, u'waitfor': None, u'interval': 1, u'host': u'192.168.0.33', u'ssh_keyfile': None, u'timeout': 10, u'provider': u"{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}", u'password': u'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', u'port': 22}}, u'stdout_lines': [[u' switchport access vlan 12']]}) => {
"item": {
"changed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": false,
"commands": [
"show run int Fa0/2 | incl switchport access vlan"
],
"host": "192.168.0.33",
"interval": 1,
"password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
"port": 22,
"provider": "{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}",
"retries": 10,
"ssh_keyfile": null,
"timeout": 10,
"username": "admin",
"waitfor": null
},
"module_name": "ios_command"
},
"item": "2",
"stdout": [
" switchport access vlan 12"
],
"stdout_lines": [
[
" switchport access vlan 12"
]
]
},
"msg": ""
}
ok: [192.168.0.33] => (item={u'changed': False, '_ansible_no_log': False, u'stdout': [u' switchport access vlan 12'], '_ansible_item_result': True, 'item': u'3', 'invocation': {'module_name': u'ios_command', u'module_args': {u'authorize': False, u'username': u'admin', u'commands': [u'show run int Fa0/3 | incl switchport access vlan'], u'auth_pass': None, u'retries': 10, u'waitfor': None, u'interval': 1, u'host': u'192.168.0.33', u'ssh_keyfile': None, u'timeout': 10, u'provider': u"{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}", u'password': u'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER', u'port': 22}}, u'stdout_lines': [[u' switchport access vlan 12']]}) => {
"item": {
"changed": false,
"invocation": {
"module_args": {
"auth_pass": null,
"authorize": false,
"commands": [
"show run int Fa0/3 | incl switchport access vlan"
],
"host": "192.168.0.33",
"interval": 1,
"password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
"port": 22,
"provider": "{'username': 'admin', 'host': '192.168.0.33', 'password': '********'}",
"retries": 10,
"ssh_keyfile": null,
"timeout": 10,
"username": "admin",
"waitfor": null
},
"module_name": "ios_command"
},
"item": "3",
"stdout": [
" switchport access vlan 12"
],
"stdout_lines": [
[
" switchport access vlan 12"
]
]
},
"msg": ""
}
但是当我运行的代码一样这样的:
- debug: msg="{{int_out.results[1].stdout}}"
我得到这样的回应:
TASK [debug] *******************************************************************
ok: [192.168.0.33] => {
"msg": [
" switchport access vlan 12"
]
}
任何想法什么是wron'g,我怎样才能实现我的目标?
答
如果仔细查看int_out.results
元素,您会注意到stdout
是一个字符串列表,而stdout_lines
是一个列表列表。
我怀疑ios_config
模块返回一个列表stdout
(而不是command
/shell
模块中的多行字符串),并且Ansible的标准结果处理器将任何stdout
变量拆分成新列表。
所以,你只需要调整您的when:
声明如下:
when: item.stdout[0] == " switchport access vlan 12"
访问stdout
列表的第一个元素。
太好了。就是这个! –
谢谢你的帮助。 –