Ansible-在结果上循环+;when语句

Ansible-在结果上循环+;when语句,ansible,ansible-playbook,Ansible,Ansible Playbook,我的目标是在cisco交换机上的接口上进行循环,检查访问vlan,然后在设置为“12”时更改该vlan,或者在设置为“12”时按原样运行。为此,我将结果保存到“int_out”: 我想循环“int_out”结果,并使用下面的“when”状态更改访问vlan: - name: change vlan if needed ios_config: lines: switchport access vlan 1234 parents: interface Fa0/

我的目标是在cisco交换机上的接口上进行循环,检查访问vlan,然后在设置为“12”时更改该vlan,或者在设置为“12”时按原样运行。为此,我将结果保存到“int_out”:

我想循环“int_out”结果,并使用下面的“when”状态更改访问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_line”的输出以查看是否有错误:

   - debug: msg= "{{ item.stdout_lines }}"
     with_items: "{{ int_out.results }}"
我得到的不仅是stdout_系列,还有更多:

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"
    ]
}

你知道我的目标是什么吗?

如果你仔细观察
int\u out.results
元素,你会注意到
stdout
是一个字符串列表,
stdout\u line
是一个列表列表。
我怀疑
ios\u config
模块返回一个列表作为
stdout
(而不是
命令中的多行字符串
/
shell
模块),Ansible的标准结果处理器将任何
stdout
变量拆分为一个新列表

因此,您只需调整
when:
语句,如下所示:

when: item.stdout[0] == " switchport access vlan 12"

访问
stdout
列表的第一个元素。

如果仔细查看
int\u out.results
元素,您会注意到
stdout
是字符串列表,
stdout\u行
是列表。
我怀疑
ios\u config
模块返回一个列表作为
stdout
(而不是
命令中的多行字符串
/
shell
模块),Ansible的标准结果处理器将任何
stdout
变量拆分为一个新列表

因此,您只需调整
when:
语句,如下所示:

when: item.stdout[0] == " switchport access vlan 12"

访问
stdout
列表的第一个元素。

太好了。就是这样!谢谢你的帮助,太好了。就是这样!谢谢你的帮助。