this was the issue
172.27.233.17 ansible_connection=ssh
corrected to
172.27.233.17
I have been fighting with this for days now
This is my first ever dabble with ansible and I cannot get the simplest playbooks or even a ping to work.
Centos 7,
ansible 2.4.2.0
Juniper.junos module installed into ansible
I’m testing with a vSRX
I've read the day 1 guides
This is my error for every playbook I try to run
[root@localhost bin]# ansible -m ping all -vvv
ansible 2.4.2.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Using /etc/ansible/ansible.cfg as config file
Parsed /etc/ansible/hosts inventory source with ini plugin
META: ran handlers
Using module file /usr/lib/python2.7/site-packages/ansible/modules/system/ping.py
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a 172.27.233.17 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<172.27.233.17> (0, '/root\n', '')
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a 172.27.233.17 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231 `" && echo ansible-tmp-1552552686.33-210239546229231="` echo /root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231 `" ) && sleep 0'"'"''
<172.27.233.17> (0, 'ansible-tmp-1552552686.33-210239546229231=/root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231\n', '')
<172.27.233.17> PUT /tmp/tmp2WWXJi TO /root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231/ping.py
<172.27.233.17> SSH: EXEC sshpass -d11 sftp -o BatchMode=no -b - -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a '[172.27.233.17]'
<172.27.233.17> (0, 'sftp> put /tmp/tmp2WWXJi /root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231/ping.py\n', '')
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a 172.27.233.17 '/bin/sh -c '"'"'chmod u+x /root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231/ /root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231/ping.py && sleep 0'"'"''
<172.27.233.17> (0, '', '')
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a -tt 172.27.233.17 '/bin/sh -c '"'"'/usr/bin/python2.7 /root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231/ping.py; rm -rf "/root/.ansible/tmp/ansible-tmp-1552552686.33-210239546229231/" > /dev/null 2>&1 && sleep 0'"'"''
<172.27.233.17> (0, '/usr/bin/python2.7: not found\r\n', 'Shared connection to 172.27.233.17 closed.\r\n')
172.27.233.17 | FAILED! => {
"changed": false,
"module_stderr": "Shared connection to 172.27.233.17 closed.\r\n",
"module_stdout": "/usr/bin/python2.7: not found\r\n",
"msg": "MODULE FAILURE",
"rc": 0
So its saying python cannot be found but look
[root@localhost bin]# //usr/bin/python2.7
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
It looks like ansible usually runs something python on the remote device but this is not the case for network devices , surely we cannot be expected to install python on switches and routers ?.
My example playbook dies in the same way
[root@localhost ansible]# cat uptime3.yaml
- name: Get device uptime
hosts:
- VSRX1
roles:
- Juniper.junos
connection: local
gather_facts: no
vars_prompt:
- name: username
prompt: Junos Username
private: no
- name: password
prompt: Junos Password
private: yes
tasks:
- name: get uptime using galaxy module
juniper_junos_command:
commands:
- show system uptime
provider:
host: "{{ ansible_host }}"
port: 22
user: "{{ username }}"
passwd: "{{ password }}"
register: uptime
# - name: display uptimes (Python style)
# # debug:
# # var: uptime['stdout_lines']
# - name: display uptimes (Ansible shortcut)
# debug:
# var: uptime.stdout_lines
[root@localhost ansible]# ansible-playbook uptime3.yaml -vvv
ansible-playbook 2.4.2.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible-playbook
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Using /etc/ansible/ansible.cfg as config file
Parsed /etc/ansible/hosts inventory source with ini plugin
PLAYBOOK: uptime3.yaml ********************************************************************************************************************************************
1 plays in uptime3.yaml
Junos Username: root
Junos Password:
PLAY [Get device uptime] ******************************************************************************************************************************************
META: ran handlers
TASK [get uptime using galaxy module] *****************************************************************************************************************************
task path: /etc/ansible/uptime3.yaml:20
Using module file /etc/ansible/roles/Juniper.junos/library/juniper_junos_command.py
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a 172.27.233.17 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<172.27.233.17> (0, '/root\n', '')
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a 172.27.233.17 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832 `" && echo ansible-tmp-1552553226.63-178839703888832="` echo /root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832 `" ) && sleep 0'"'"''
<172.27.233.17> (0, 'ansible-tmp-1552553226.63-178839703888832=/root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832\n', '')
<172.27.233.17> PUT /tmp/tmpowZMu1 TO /root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832/juniper_junos_command.py
<172.27.233.17> SSH: EXEC sshpass -d11 sftp -o BatchMode=no -b - -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a '[172.27.233.17]'
<172.27.233.17> (0, 'sftp> put /tmp/tmpowZMu1 /root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832/juniper_junos_command.py\n', '')
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a 172.27.233.17 '/bin/sh -c '"'"'chmod u+x /root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832/ /root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832/juniper_junos_command.py && sleep 0'"'"''
<172.27.233.17> (0, '', '')
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a -tt 172.27.233.17 '/bin/sh -c '"'"'/usr/bin/python2.7 /root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832/juniper_junos_command.py; rm -rf "/root/.ansible/tmp/ansible-tmp-1552553226.63-178839703888832/" > /dev/null 2>&1 && sleep 0'"'"''
<172.27.233.17> (0, '/usr/bin/python2.7: not found\r\n', 'Shared connection to 172.27.233.17 closed.\r\n')
fatal: [172.27.233.17]: FAILED! => {
"changed": false,
"module_stderr": "Shared connection to 172.27.233.17 closed.\r\n",
"module_stdout": "/usr/bin/python2.7: not found\r\n",
"msg": "MODULE FAILURE",
"rc": 0
to retry, use: --limit @/etc/ansible/uptime3.retry
PLAY RECAP ********************************************************************************************************************************************************
172.27.233.17 : ok=0 changed=0 unreachable=0 failed=1
[root@localhost ansible]# ^C
Any pointers at all would be appreciated
Please try to add Python to the path variable on the host and give it a shot:
If this solves your problem, please mark this post as "Accepted Solution."
Kudos are always appreciated :).
I've tried the same steps and config. For me it works fine. However, I see some differences:
@simon.bingham
wrote:
task path: /etc/ansible/uptime3.yaml:20
Using module file /etc/ansible/roles/Juniper.junos/library/juniper_junos_command.py
<172.27.233.17> ESTABLISH SSH CONNECTION FOR USER: root
<172.27.233.17> SSH: EXEC sshpass -d11 ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o User=root -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/7830714a9a 172.27.233.17 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<172.27.233.17> (0, '/root\n', '')
In your case ansible establishes SSH session with 172.27.233.17 (vSRX, right?) and tries to upload and run .py script there.
In my case I see "ESABLISH LOCAL CONNECTION" and EXEC without "SSH:" (local)
task path: /home/ab/aaa/uptime.yaml:20
<10.219.37.14> ESTABLISH LOCAL CONNECTION FOR USER: ab
<10.219.37.14> EXEC /bin/sh -c 'echo ~ab && sleep 0'
I'm not sure what's the exact reason for that on your setup, but here's a couple of things to check/try:
you use "config file = /etc/ansible/ansible.cfg". Check what does it have in there. On my machine it's a default config file generated by installing ansible several years ago.
same for inventory file which is "/etc/ansible/hosts" for you
use a different working directory with simple "ansible.cfg" and inventory as suggested in DAY1 book
Contents of my working dir:
ab@VB:~/aaa$ pwd
/home/ab/aaa
ab@VB:~/aaa$ ls -l
total 16
-rw-rw-r-- 1 ab ab 59 mrt 14 14:59 ansible.cfg
-rw-rw-r-- 1 ab ab 34 mrt 14 15:01 inventory
-rw-rw-r-- 1 ab ab 4 mrt 14 15:37 uptime.retry
-rw-rw-r-- 1 ab ab 518 mrt 14 15:13 uptime.yaml
ab@VB:~/aaa$ cat ansible.cfg
[defaults]
inventory = inventory
host_key_checking = False
ab@VB:~/aaa$ cat inventory
PTX ansible_host=10.219.37.14
ab@VB:~/aaa$ cat uptime.yaml
- name: Get device uptime
hosts:
- all
roles:
- Juniper.junos
connection: local
gather_facts: no
vars_prompt:
- name: username
prompt: Junos Username
private: no
- name: password
prompt: Junos Password
private: yes
tasks:
- name: get uptime using galaxy module
juniper_junos_command:
commands:
- show system uptime
provider:
host: "{{ ansible_host }}"
port: 22
user: "{{ username }}"
passwd: "{{ password }}"
Full log of successful attempt:
ab@VB:~/aaa$ ansible-playbook uptime.yaml -vvv
ansible-playbook 2.7.8
config file = /home/ab/aaa/ansible.cfg
configured module search path = [u'/home/ab/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
executable location = /usr/local/bin/ansible-playbook
python version = 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609]
Using /home/ab/aaa/ansible.cfg as config file
/home/ab/aaa/inventory did not meet host_list requirements, check plugin documentation if this is unexpected
/home/ab/aaa/inventory did not meet script requirements, check plugin documentation if this is unexpected
Parsed /home/ab/aaa/inventory inventory source with ini plugin
PLAYBOOK: uptime.yaml ***************************************************************************************************************************************
1 plays in uptime.yaml
Junos Username: labroot
Junos Password:
PLAY [Get device uptime] ************************************************************************************************************************************
META: ran handlers
TASK [get uptime using galaxy module] ***********************************************************************************************************************
task path: /home/ab/aaa/uptime.yaml:20
<10.219.37.14> ESTABLISH LOCAL CONNECTION FOR USER: ab
<10.219.37.14> EXEC /bin/sh -c 'echo ~ab && sleep 0'
<10.219.37.14> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/ab/.ansible/tmp/ansible-tmp-1552572975.16-116151779420689 `" && echo ansible-tmp-1552572975.16-116151779420689="` echo /home/ab/.ansible/tmp/ansible-tmp-1552572975.16-116151779420689 `" ) && sleep 0'
Using module file /home/ab/.ansible/roles/Juniper.junos/library/juniper_junos_command.py
<10.219.37.14> PUT /home/ab/.ansible/tmp/ansible-local-26344YouvSa/tmp39A4dG TO /home/ab/.ansible/tmp/ansible-tmp-1552572975.16-116151779420689/AnsiballZ_juniper_junos_command.py
<10.219.37.14> EXEC /bin/sh -c 'chmod u+x /home/ab/.ansible/tmp/ansible-tmp-1552572975.16-116151779420689/ /home/ab/.ansible/tmp/ansible-tmp-1552572975.16-116151779420689/AnsiballZ_juniper_junos_command.py && sleep 0'
<10.219.37.14> EXEC /bin/sh -c '/usr/bin/python /home/ab/.ansible/tmp/ansible-tmp-1552572975.16-116151779420689/AnsiballZ_juniper_junos_command.py && sleep 0'
<10.219.37.14> EXEC /bin/sh -c 'rm -f -r /home/ab/.ansible/tmp/ansible-tmp-1552572975.16-116151779420689/ > /dev/null 2>&1 && sleep 0'
ok: [PTX] => {
"changed": false,
"command": "show system uptime",
"format": "text",
"invocation": {
"module_args": {
"attempts": null,
"baud": null,
"commands": [
"show system uptime"
"console": null,
"dest": null,
"dest_dir": null,
"formats": null,
"host": "10.219.37.14",
"level": null,
"logdir": null,
"logfile": null,
"mode": null,
"passwd": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
"port": 22,
"return_output": true,
"ssh_config": null,
"ssh_private_key_file": null,
"timeout": 30,
"user": "labroot"
"msg": "The command executed successfully.",
"stdout": "\nCurrent time: 2019-03-17 00:35:16 UTC\nTime Source: LOCAL CLOCK \nSystem booted: 2019-03-16 22:55:11 UTC (01:40:05 ago)\nProtocols started: 2019-03-16 22:56:14 UTC (01:39:02 ago)\nLast configured: 2019-03-16 22:56:10 UTC (01:39:06 ago) by root\n12:35AM up 1:40, 1 users, load averages: 0.27, 0.21, 0.22\n",
"stdout_lines": [
"Current time: 2019-03-17 00:35:16 UTC",
"Time Source: LOCAL CLOCK ",
"System booted: 2019-03-16 22:55:11 UTC (01:40:05 ago)",
"Protocols started: 2019-03-16 22:56:14 UTC (01:39:02 ago)",
"Last configured: 2019-03-16 22:56:10 UTC (01:39:06 ago) by root",
"12:35AM up 1:40, 1 users, load averages: 0.27, 0.21, 0.22"
META: ran handlers
META: ran handlers
PLAY RECAP **************************************************************************************************************************************************
PTX : ok=1 changed=0 unreachable=0 failed=0
Thanks Andrei
Thanks that worked, when I simplified the config and inventory file and ran it from a new directory.
This is great I now have a working and non working example. I know this issue is not python on my local centos box and is not the vSRX, I will keep digging to work out the exact reason this was not working, I suspect it was trying to run a Python Script directly on the Juniper devices rather than using netconf but I'm compeatly new to this so just guessing.
Thanks again Andrei
Regards
Simon Bingham