0

I am trying to connect to an host which is nothing but an cisco ios switch which I get by executing an powershell script. So basically the switch is output from an xml string from an powershell script. I am able to successfully receive the switch name from Ansible output. Now my question is how do I connect to the switch and see the details of the switch using show commands.

This my 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 }}" 

This will give an output as follows

TASK [debug] ************************************************************************************************************************************************ task path: /etc/ansible/splat_executeps_script.yml:21 ok: [localhost] => (item={u'DeviceName': u'abc'}) => { "msg": "abc" } 

where abc is the host to which I need to connect to in the subsequent task in the same playbook. I have tried writing something as below in the same yaml file

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 }}" 

But this does not run and gives the below error:

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 

How can I correct the details, any help would be appreciated? Please note that the device which I am trying to connect in the subsequent task would be dynamically generated by the xml which is returned from PS script.

1 Answer 1

2

item only exists for the duration of the loop in that task. Use variables that you have registered.

add_host is one way to dynamically modify inventory. Then run the next play in your playbook against that group:

 - name: Add discovered switches to inventory add_host: name: "{{ item.DeviceName }}" groups: switch loop: "{{ data.matches }}" hosts: switch 

To not have to manage the inventory every time in your playbook, write a dynamic inventory script or plugin. This could be a variation on that PowerShell script that emits JSON instead, which Ansible can use as an inventory script. Examples are in the Ansible source code, under contrib/inventory.

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.