如何校验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
相关产品推荐
相关产品推荐

