You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何校验Ansible Telnet模块输出,确保所有命令执行成功?

问题描述

我编写了一个使用ansible.netcommon.telnet模块的Ansible Playbook,内容如下:

- name: run commands over Telnet
  hosts: myhosts
  gather_facts: False
  strategy: free
  tasks:
    - name: switch show
      ansible.netcommon.telnet:
        user: user
        password: pass
        login_prompt: 'sername'
        password_prompt: 'assword'
        prompts:
        - '[>#]'
        command:
        - disable clipaging
        - disable clipaging
        #- somethere
        #
      register: results

    - name: debug results
      debug:
        msg: "{{ results }}"

执行后,debug模块返回的结果如下:

{
    "msg": {
        "changed": true,
        "failed": false,
        "output": [
            " disable clipaging\r\nCommand: disable clipaging\r\n\r\nSuccess.\r\n\rn116-c8-acc7:5#",
            " disable clipaging\r\nCommand: disable clipaging\r\n\r\nSuccess.\r\n\rn116-c8-acc7:5#"
        ]
    }
}

现在需要实现:校验results的output列表中所有条目是否均包含"Success"子串,若全部包含则Playbook执行成功,否则判定为失败,该如何操作?

解决方案

方案一:批量断言校验(推荐)

使用Ansible的assert模块结合Jinja2的all()过滤器,一次性校验所有结果条目,修改后的Playbook如下:

- name: run commands over Telnet
  hosts: myhosts
  gather_facts: False
  strategy: free
  tasks:
    - name: switch show
      ansible.netcommon.telnet:
        user: user
        password: pass
        login_prompt: 'sername'
        password_prompt: 'assword'
        prompts:
        - '[>#]'
        command:
        - disable clipaging
        - disable clipaging
      register: results

    - name: 校验所有命令执行结果均包含Success
      assert:
        that:
          - "{{ results.output | all('Success' in item) }}"
        fail_msg: "存在命令执行未返回Success,Playbook执行失败"
        success_msg: "所有命令执行均返回Success,Playbook执行成功"
  • assert模块用于断言条件是否成立,不成立则直接触发Playbook失败
  • results.output | all('Success' in item)会遍历output列表的每一项,检查是否全部包含"Success"子串
  • fail_msg和success_msg分别定义条件不满足/满足时的提示信息

方案二:逐个条目校验

如果需要定位具体哪条命令执行失败,可以用loop遍历output列表,逐个校验:

- name: run commands over Telnet
  hosts: myhosts
  gather_facts: False
  strategy: free
  tasks:
    - name: switch show
      ansible.netcommon.telnet:
        user: user
        password: pass
        login_prompt: 'sername'
        password_prompt: 'assword'
        prompts:
        - '[>#]'
        command:
        - disable clipaging
        - disable clipaging
      register: results

    - name: 逐个校验命令执行结果
      fail:
        msg: "命令执行结果未包含Success:{{ item }}"
      when: "'Success' not in item"
      loop: "{{ results.output }}"

这种方式会在发现第一个不满足条件的条目时触发失败,也能直观看到具体失败的命令输出内容。

内容的提问来源于stack exchange,提问作者S.Pot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:03:16