Ansible playbook如何添加VLAN不存在时停止后续执行的判断条件
Ansible Playbook VLAN不存在时终止执行实现方案
你可以通过Ansible内置的fail模块或者meta模块实现需求,两种方案如下:
方案1:使用fail模块(推荐,会明确抛出错误提示,标记任务失败)
直接替换你原有的两个VLAN检查debug任务即可,触发条件后会直接终止整个playbook的后续执行,代码如下:
- name: check vlan availability ios_command: commands: - show vlan id {{ vlan1 }} register: precheck - name: check voice_vlan availability ios_command: commands: - show vlan id {{ vlan2 }} register: precheck_voice_vlan - name: L2 Vlan1 Availability Check fail: msg: "Vlan {{ vlan1 }} not present in the switch, playbook aborted" when: "'not found' in precheck.stdout[0]" - name: L2 Vlan2 Availability Check fail: msg: "Vlan {{ vlan2 }} not present in the switch, playbook aborted" when: "'not found' in precheck_voice_vlan.stdout[0]" # 后续只有两个VLAN都存在才会执行 - name: get interface status from the device ios_command: commands: - show run int {{ interface }} | i trunk register: precheck_int
说明:如果只需要终止当前主机的执行而保留其他主机的任务,可以在fail模块添加参数
any_errors_fatal: false,默认情况下fail触发后所有主机的任务都会终止。
方案2:使用meta: end_play(静默终止,无错误提示,标记playbook正常结束)
如果不需要抛出错误,只是正常结束流程,可以使用这个方案,把以下任务放在两个VLAN检查任务之后、接口查询任务之前即可:
- name: Stop playbook if any vlan not found meta: end_play when: "'not found' in precheck.stdout[0] or 'not found' in precheck_voice_vlan.stdout[0]"
说明:只要触发条件就会直接结束整个playbook的所有任务,不会产生失败告警。
优化建议
原来的判断条件'not found' in precheck不够严谨,precheck是包含执行状态、返回值、错误信息的完整变量对象,可能存在其他字段包含not found字符串导致误判,建议指定匹配stdout[0](即第一条命令的返回输出),准确率更高。
内容的提问来源于stack exchange,提问作者Akshay Jadhav
相关产品推荐
相关产品推荐

