字符串匹配

时间:2017-07-19 14:23:44

标签: ansible cisco-ios

我试图使用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

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

ios_command返回stdout作为列表,stdout_lines作为列表列表(而command模块返回stdout作为字符串,stdout_lines作为列表)。

所以在你的情况下,你可能想尝试:

- debug: "msg='4548 Card Found'"
  when: showmod.stdout | join(" ") | search("/4548/")