如何为Ansible任务的stdout结果编写正确的判断条件?
解决Ansible Playbook中CDP启用检查的条件判断问题
问题场景
编写Ansible Playbook检查Cisco设备上CDP是否启用,由于CDP状态不在运行配置中,使用ios_command模块执行show cdp | i enabled命令,但后续的条件判断任务被跳过,未触发预期输出。
原Playbook代码
- name: Check if CDP is running cisco.ios.ios_command: commands: - "show cdp | i enabled" register: cdp_check check_mode: no - name: Check if CDP is enabled set_fact: cdp_check_status: "{{ cdp_check.stdout }}" - name: Print Value debug: msg: Works when: '"enabled" in cdp_check_status'
执行输出
TASK [Check if CDP is enabled] ************************************ redirecting (type: connection) ansible.builtin.network_cli to ansible.netcommon.network_cli redirecting (type: terminal) ansible.builtin.ios to cisco.ios.ios redirecting (type: cliconf) ansible.builtin.ios to cisco.ios.ios redirecting (type: become) ansible.builtin.enable to ansible.netcommon.enable ok: [atl01-sw-lab01] => { "ansible_facts": { "cdp_check_status": [ "Sending CDPv2 advertisements is enabled" ] }, "changed": false } TASK [Print Value] ************************************ skipping: [atl01-sw-lab01] => {}
问题原因
从输出可以看到,cdp_check_status是列表类型,其中包含一个字符串元素"Sending CDPv2 advertisements is enabled"。原条件"enabled" in cdp_check_status是检查字符串"enabled"是否是列表的直接元素,而非检查列表中某个元素是否包含"enabled"子串,因此条件不成立,任务被跳过。
解决方法
方法1:转换列表为单个字符串
修改set_fact任务,直接提取列表的第一个元素(因为show cdp | i enabled只会返回一行结果):
- name: Check if CDP is enabled set_fact: cdp_check_status: "{{ cdp_check.stdout[0] }}" - name: Print Value debug: msg: Works when: '"enabled" in cdp_check_status'
方法2:直接在条件中访问列表元素
无需修改set_fact,直接在when条件里指定列表的第一个元素进行判断:
- name: Print Value debug: msg: Works when: '"enabled" in cdp_check_status[0]'
方法3:用过滤器处理多结果场景
如果命令可能返回多行结果,可使用select和search过滤器检查列表中是否存在包含指定子串的元素:
- name: Print Value debug: msg: Works when: cdp_check_status | select('search', 'enabled') | list | length > 0
内容的提问来源于stack exchange,提问作者Sachin Prasad
相关产品推荐
相关产品推荐

