我试图使用Ansible打一堆(100多个)Cisco Catalyst交换机并检查他们是否安装了某个线卡。通过SSH,可以使用" sh mod"命令。我想在一个剧本中解析该命令的输出,然后在某个字符串匹配时显示该命令的输出。现在使用下面的剧本我得到以下错误:
致命:[编辑主机名]:失败! => {"失败":是的," msg":" The 条件检查> showmod |搜索(\" 4548 \")'失败。错误是: 发生了意外的模板类型错误({%if showmod | 搜索(\" 4548 \")%} True {%else%} False {%endif%}):expect 字符串或缓冲区\ n \ n错误似乎已经出现 ' /etc/ansible/playbooks/linecard-4548.yaml' ;:第22行第5列,但 可能在文件的其他位置,具体取决于确切的语法 问题。\ n \ n违规行似乎是:\ n \ n \ n - debug: \" msg =' 4548发现卡' \" \ n ^此处\ n"}
当前的剧本代码:
---
- hosts: redacted-hostname
gather_facts: yes
connection: local
tasks:
- name: SYS | Define provider
set_fact:
provider:
host: "{{ inventory_hostname }}"
username: redacted-user
password: redacted-password
- name: IOS | Get Module List
ios_command:
provider: "{{ provider }}"
commands:
- sh mod | inc 4548
register: showmod
- debug: "msg='4548 Card Found'"
when: showmod.stdout | search("/4548/")
我在使用和不使用when
的调试中尝试.stdout
无济于事。我已经完成了一些研究,而且在我的情况下,showmod
未定义,但肯定是这样,我经常会遇到错误。如果我用以下代码替换调试,那么playbook运行正常但当然它会打印每个不符合我想要的开关的输出。
- name: IOS | Show Output
debug:
var: showmod
有什么建议吗?
答案 0 :(得分:2)
ios_command返回stdout
作为列表,stdout_lines
作为列表列表(而command
模块返回stdout
作为字符串,stdout_lines
作为列表)。
所以在你的情况下,你可能想尝试:
- debug: "msg='4548 Card Found'"
when: showmod.stdout | join(" ") | search("/4548/")