Ansible连接到存储在变量中的主机

时间:2019-04-03 09:18:45

标签: ansible

我正在尝试连接到主机,该主机不过是通过执行Powershell脚本而获得的cisco ios开关。因此,基本上,开关是从Powershell脚本的xml字符串输出的。我能够从Ansible输出中成功接收开关名称。现在我的问题是如何连接到交换机并使用show命令查看交换机的详细信息。

这是我的剧本:

hosts: localhost
  connection: local
  tasks:
    - name: Parse the XML output
      xml:
        xmlstring: "{{ hostvars[groups['win'][0]]['splat']['stdout'] }}"
        xpath: "/HostDiscovery/Host/Connection/NetworkDevice[Candidate='true' and  Uplink='false']/DeviceName"
        content: text
      register: data
    - debug:
        msg: "{{ item.DeviceName }}"
      with_items: "{{ data.matches }}"

这将给出如下输出

任务[调试] *********************************************** ****************************************************** ****************************************************** * 任务路径:/etc/ansible/splat_executeps_script.yml:21 好的:[localhost] =>(item = {u'DeviceName':u'abc'})=> {     “ msg”:“ abc” }

其中abc是我在同一剧本的后续任务中需要连接到的主机。 我试图在同一个yaml文件中编写以下内容: 主机:“ {{item.DeviceName}}”

 connection: network_cli
  tasks:
    - name: Show VLAN
      ios_command:
        commands:
          - show vlan brief | include {{id}}
          - show interfaces {{interface}} status
      register: vlan
    - debug: var=vlan.stdout_lines
      with_items: "{{ data.matches }}"

但这无法运行,并出现以下错误:

META:运行处理程序 错误! “主机”字段的值无效,其中包括未定义的变量。错误是:“ item”未定义

错误似乎出在'/etc/ansible/splat_executeps_script.yml'中:第27行第3列,但可能 根据确切的语法问题放在文件的其他位置。

违规行似乎是:

  • 主机:“ {{item.DeviceName}}” ^这里

我该如何更正详细信息,请提供任何帮助? 请注意,我在后续任务中尝试连接的设备将由PS脚本返回的xml动态生成。

2 个答案:

答案 0 :(得分:0)

我认为您必须写:主机:“ {{data.matches.DeviceName}}”。 您必须在同一本Playbook中拥有两个主机:

hosts: localhost
  connection: local
  tasks:
    - name: Parse the XML output
      xml:
        xmlstring: "{{ hostvars[groups['win'][0]]['splat']['stdout'] }}"
        xpath: "/HostDiscovery/Host/Connection/NetworkDevice[Candidate='true' and  Uplink='false']/DeviceName"
        content: text
      register: data
    - debug:
        msg: "{{ item.DeviceName }}"
      with_items: "{{ data.matches }}"

hosts: "{{ data.matches.DeviceName }}"
connection: network_cli
  tasks:
    - name: Show VLAN
      ios_command:
        commands:
          - show vlan brief | include {{id}}
          - show interfaces {{interface}} status
      register: vlan
    - debug: var=vlan.stdout_lines
      with_items: "{{ data.matches }}"

答案 1 :(得分:0)

我使用以下代码解决了上述问题:

  • 主机:“ {{hostvars ['localhost'] ['data'] ['matches'] [0] ['DeviceName']}}“