我正在尝试连接到一个主机,该主机只不过是一个 cisco ios 交换机,我通过执行 powershell 脚本获得该交换机。因此,交换机基本上是从 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 }}"
这将给出如下输出
TASK [debug]
************************************************************************************************************************************************
task path: /etc/ansible/splat_executeps_script.yml:21 ok: [localhost] => (item={u'DeviceName': u'abc'}) => { "msg": "abc" }
其中 abc 是我需要在同一剧本的后续任务中连接到的主机。我尝试在同一个 yaml 文件中写入以下内容
hosts: "{{ 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: ran handlers ERROR! The field 'hosts' has an invalid value, which includes an undefined variable. The error was: 'item' is undefined
The error appears to have been in '/etc/ansible/splat_executeps_script.yml': line 27, column 3, but may be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
hosts: "{{ item.DeviceName }}" ^ here
我该如何更正这些细节,任何帮助都会很感激吗?请注意,我在后续任务中尝试连接的设备将由 PS 脚本返回的 xml 动态生成。
答案1
item
仅在该任务的循环持续时间内存在。使用您已注册的变量。
add_host
是动态修改库存的一种方法。然后针对该组运行剧本中的下一个剧本:
- name: Add discovered switches to inventory
add_host:
name: "{{ item.DeviceName }}"
groups: switch
loop: "{{ data.matches }}"
hosts: switch
为了不必每次都按照剧本管理库存,编写动态库存脚本或插件。这可能是该 PowerShell 脚本的一个变体,它会发出 JSON,Ansible 可以将其用作库存脚本示例位于 Ansible 源代码中,位于贡献/库存。