Ansible: To use the 'ssh' connection type with passwords, you must install the sshpass program"

Ansible

Ansible Problem Overview


Recently I created new roles called spd in my existing project. While other script works fine in the setup. This newly created fails. Please point me to what is going wrong here

ansible/roles
      spd
        tasks
        templates
        defaults

deploy-spd.yml

 - hosts:
   roles:
     - spd

inventory file

[kube-master]
kubernetes-master-1 ansible_host=10.20.0.225 ansible_user=centos ansible_become=true
kubernetes-master-2 ansible_host=10.20.0.226 ansible_user=centos ansible_become=true
kubernetes-master-3 ansible_host=10.20.0.227 ansible_user=centos ansible_become=true

Failure

bash-4.3# ansible-playbook -i inventory/inventory deploy-test-ms.yml --ask-vault-pass
Vault password:

PLAY [kube-master] *************************************************************

TASK [setup] *******************************************************************
Thursday 16 March 2017  13:32:05 +0000 (0:00:00.026)       0:00:00.026 ********
fatal: [kubernetes-master-1]: FAILED! => {"failed": true, "msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"}
fatal: [kubernetes-master-2]: FAILED! => {"failed": true, "msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"}
fatal: [kubernetes-master-3]: FAILED! => {"failed": true, "msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"}

PLAY RECAP *********************************************************************
kubernetes-master-1 : ok=0    changed=0    unreachable=0    failed=1
kubernetes-master-2 : ok=0    changed=0    unreachable=0    failed=1
kubernetes-master-3 : ok=0    changed=0    unreachable=0    failed=1

UPDATE:

**With failed script**    

		Using module file /usr/lib/python2.7/site-packages/ansible/modules/core/system/setup.py
<10.20.0.227> ESTABLISH SSH CONNECTION FOR USER: centos
Using module file /usr/lib/python2.7/site-packages/ansible/modules/core/system/setup.py
Using module file /usr/lib/python2.7/site-packages/ansible/modules/core/system/setup.py
Using module file /usr/lib/python2.7/site-packages/ansible/modules/core/system/setup.py
<172.23.169.137> ESTABLISH SSH CONNECTION FOR USER: centos
<10.20.0.225> ESTABLISH SSH CONNECTION FOR USER: centos
<10.20.0.226> ESTABLISH SSH CONNECTION FOR USER: centos
   
**With successfull script**    

Thursday 16 March 2017  14:03:49 +0000 (0:00:00.066)       0:00:00.066 ********
Using module file /usr/lib/python2.7/site-packages/ansible/modules/core/system/setup.py
<10.20.0.237> ESTABLISH SSH CONNECTION FOR USER: centos
<10.20.0.237> SSH: EXEC ssh -F ./ssh.cfg -o ControlMaster=auto -o ControlPersist=30m -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey
-o PasswordAuthentication=no -o User=centos -o ConnectTimeout=30 -o 'ControlPath=~/.ssh/ansible-%r@%h:%p' 10.20.0.237 '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1489673029.48-15997231643297
4 `" && echo ansible-tmp-1489673029.48-159972316432974="` echo $HOME/.ansible/tmp/ansible-tmp-1489673029.48-159972316432974 `" ) && sleep 0'"'"''
<10.20.0.237> PUT /tmp/tmpnHJPbc TO /home/centos/.ansible/tmp/ansible-tmp-1489673029.48-159972316432974/setup.py
<10.20.0.237> SSH: EXEC scp -F ./ssh.cfg -o ControlMaster=auto -o ControlPersist=30m -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey
-o PasswordAuthentication=no -o User=centos -o ConnectTimeout=30 -o 'ControlPath=~/.ssh/ansible-%r@%h:%p' /tmp/tmpnHJPbc '[10.20.0.237]:/home/centos/.ansible/tmp/ansible-tmp-1489673029.48-159972316432974/setup.py'
<10.20.0.237> ESTABLISH SSH CONNECTION FOR USER: centos
<10.20.0.237> SSH: EXEC ssh -F ./ssh.cfg -o ControlMaster=auto -o ControlPersist=30m -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey
-o PasswordAuthentication=no -o User=centos -o ConnectTimeout=30 -o 'ControlPath=~/.ssh/ansible-%r@%h:%p' 10.20.0.237 '/bin/sh -c '"'"'chmod u+x /home/centos/.ansible/tmp/ansible-tmp-1489673029.48-159972316432974/ /home/cento
s/.ansible/tmp/ansible-tmp-1489673029.48-159972316432974/setup.py && sleep 0'"'"''

Ansible Solutions


Solution 1 - Ansible

It is the host machine which needs the sshpass program installed. For an Ubuntu machine such as 16.04, it's as simple as apt-get install sshpass. Again, this error message of:

> ERROR! to use the 'ssh' connection type with passwords, you must install the sshpass program

Applies to the HOST (provisioner) not the GUEST (machine(s) being provisioned). Thus install sshpass on the provisioner.

For installing sshpass on Mac OS refer to this link

Solution 2 - Ansible

Just to add to various answers above and this method directly resolves and answers the main issue as stated in the title.

It is possible to pass the parameter using paramiko, which is another pure python implementation of SSH. This is supported by ansible and would be the preferred option as it relies on less cross language dependancies that has to be separately managed; Thus this essentially by-passes the need for another library installed on your host machine : sshpass.

instead of using the connection ssh as below :

> $ansible-playbook -i hosts -v -b -c ssh --ask-pass myplaybook.yml

you can and will find it easier to use the following :

> $ansible-playbook -i hosts -v -b -c paramiko --ask-pass myplaybook.yml

if you are interested, you can read more here: http://www.paramiko.org/

thanks for additional comments as mention, via the paramiko way, you can also set it in your inventory file, or set it as a playbook option.

Solution 3 - Ansible

The issue was because of use of attribute ansible_password in /defaults/main.yml. I have maintained lots of variables in this file to be used by script along with attribute ansible_password.

- include_vars: "{{ role_path}}/defaults/main.yml"

The attribute ansible_password is reserved for use by Ansible. Now I changed the variable name to ansible_pass and it is working fine.

Solution 4 - Ansible

For UBUNTU

sudo apt install sshpass

After this run ansible script

Solution 5 - Ansible

For macOS

brew install esolitos/ipa/sshpass

To quickly verify I would just ping

ansible all -i path/to/host -m ping

Solution 6 - Ansible

Use ansible_password to ansible_pass and that will do it!

Solution 7 - Ansible

for MacOS brew install sshpass resolved this issue for me

Solution 8 - Ansible

> brew install hudochenkov/sshpass/sshpass

this path seem ok

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVikram RanabhattView Question on Stackoverflow
Solution 1 - AnsibleDanCatView Answer on Stackoverflow
Solution 2 - AnsiblemirageglobeView Answer on Stackoverflow
Solution 3 - AnsibleVikram RanabhattView Answer on Stackoverflow
Solution 4 - AnsibleVineet KumarView Answer on Stackoverflow
Solution 5 - AnsiblepixelsoccupiedView Answer on Stackoverflow
Solution 6 - AnsibleMawtyView Answer on Stackoverflow
Solution 7 - AnsiblerokView Answer on Stackoverflow
Solution 8 - AnsibleSamuelView Answer on Stackoverflow