0

我正在尝试使用 Ansible 连接一堆(100 多台)Cisco Catalyst 交换机并检查它们是否安装了某个线卡。通过 SSH,这可以使用“sh mod”命令来完成。我想在剧本中解析该命令的输出,然后在某个字符串匹配时显示该命令的输出。现在使用下面的剧本,我收到以下错误:

致命:[编辑主机名]:失败!=> {"failed": true, "msg": "条件检查 'showmod | search(\"4548\")' 失败。错误是:在 ({% if showmod | search(\ "4548\") %} True {% else %} False {% endif %}): 预期的字符串或缓冲区\n\n错误似乎在 '/etc/ansible/playbooks/linecard-4548.yaml' 中:第 22 行第 5 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n有问题的行似乎是:\n\n\n - 调试:\"msg='4548 Card Found'\ "\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是未定义的,但它肯定是。如果我用以下代码段替换调试,则剧本运行良好,但当然它会为每个不是我想要的开关打印输出。

  - name: IOS | Show Output
    debug:
      var: showmod

有什么建议么?

4

1 回答 1

3

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

因此,在您的情况下,您可能想尝试:

- debug: "msg='4548 Card Found'"
  when: showmod.stdout | join(" ") | search("/4548/")  
于 2017-07-19T14:47:09.443 回答