While building VMs with Vagrant and trying to run ansible-playbook with them over SSH connection. We get exceptions like Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password
The execution and the error would like something similar to the below.
aksarav@mwinventory.in:~/VirtualBox VMs/vagrantVM$ ansible app -m ping -i ansible_hosts
192.168.60.4 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
"unreachable": true
}
This post presumes that you are using the Vagrant's private key for ansible SSH authentication.
The Problem / The Scenario:
Here I am using the vagrant private key with ansible and passing it as a ansible_ssh_private_key_file variable
A Snap of my ansible_hosts file shows my variable declaration
[multi:vars] ansible_ssh_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key ansible_ssh_common_args='-o StrictHostKeyChecking=no'
Though you would be able to directly SSH to the VM using the private_key. You would not be able to SSH with ansible.
aksarav@mwinventory.in:~/VirtualBox VMs/vagrantVM$ ssh -i ~/.vagrant.d/insecure_private_key vagrant@192.168.60.4 Development Environment [vagrant@mwiapp01 ~]$
ansible ad-hoc commands (or) playbook will fail with the error. when executed with -vvv option in ansible. you could see the detailed info similar to this
aksarav@mwinventory.in:~/VirtualBox VMs/vagrantVM$ ansible app -m ping -i ansible_hosts -vvv
ansible 2.5.0
config file = None
configured module search path = [u'/Users/aksarav/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/Cellar/ansible/2.5.0/libexec/lib/python2.7/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 2.7.14 (default, Mar 22 2018, 15:04:47) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)]
No config file found; using defaults
Parsed /Users/aksarav/VirtualBox VMs/vagrantVM/ansible_hosts inventory source with ini plugin
META: ran handlers
Using module file /usr/local/Cellar/ansible/2.5.0/libexec/lib/python2.7/site-packages/ansible/modules/system/ping.py
<192.168.60.4> ESTABLISH SSH CONNECTION FOR USER: vagrant
<192.168.60.4> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="/Users/aksarav/.vagrant.d/insecure_private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=vagrant -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o ControlPath=/Users/aksarav/.ansible/cp/1dc5e4da79 192.168.60.4 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<192.168.60.4> (255, '', 'Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n')
192.168.60.4 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
"unreachable": true
}
Resolution
Now we have our private-key of vagrant. Let us create a SSH public Key and copy it over to VMs.
Execute the following command in the order it is given to accomplish.
ssh-keygen -y -f ~/.vagrant.d/insecure_private_key
ssh-keygen -y -f ~/.vagrant.d/insecure_private_key > ~/.vagrant.d/vagrant.pub
ssh-copy-id -f -i ~/.vagrant.d/vagrant.pub vagrant@192.168.60.4
Execution Result
aksarav@mwinventory.in:~/VirtualBox VMs/vagrantVM$ ssh-keygen -y -f ~/.vagrant.d/insecure_private_key ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== aksarav@mwinventory.in:~/VirtualBox VMs/vagrantVM$ ssh-keygen -y -f ~/.vagrant.d/insecure_private_key > ~/.vagrant.d/vagrant.pub aksarav@mwinventory.in:~/VirtualBox VMs/vagrantVM$ ssh-copy-id -f -i ~/.vagrant.d/vagrant.pub vagrant@192.168.60.4 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/aksarav/.vagrant.d/vagrant.pub" Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'vagrant@192.168.60.4'" and check to make sure that only the key(s) you wanted were added.
Validation
aksarav@mwinventory.in:~/VirtualBox VMs/vagrantVM$ ansible app -m ping -i ansible_hosts
192.168.60.4 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Now you could notice the issue is resolved and you could run the ansible ad-hoc commands and playbook without any hitch
Cheers!.
A K S A R A V




