Intro

I discovered a nice little trick to make working with Vagrant VMs a little easier by utilizing the openssh config file to define the SSH connection parameters for Vagrant VMs. This post will walk you through getting it setup.

For reference the following software will be used in this post.

  • openssh - 7.6p1
  • Vagrant - 2.2.3

Dependencies

In order to utilize this method you will need to have openssh version 7.3p1 or greater. If you are not sure what an SSH config file is or does, go on a quick duck hunt there are a plethora for resources out there.

Note
If you are running an openssh version < 7.3p1 there is an alternate method at the bottom of this post.

SSH The Vagrant Way

Usually when working with Vagrant you access a VM by using the command vagrant ssh <vm-name> . This is fine, but things start to get messy when you want to use Ansible or Puppet Bolt etc.. to apply config to the VMs. You either need to use Vagrants config to apply your inventory groupings or twiddle around with your inventory files.

Vagrant has a command vagrant ssh-config that will spit out a valid openssh config file. This file can be used with openssh to define ssh connection parameters for your Vagrant VMs.

Prepare Host

First up be sure you have at least openssh version 7.3p1

cmd
ssh -V

# output

OpenSSH_7.6p1 Ubuntu-4ubuntu0.1, OpenSSL 1.0.2n  7 Dec 2017

Next up create a directory for your vagrant SSH config.

cmd
mkdir -p ~/.ssh/vagrant.d/

The Include parameter was added to openssh in version 7.3p1 . Add the following to your ~/.ssh/config file.

cmd
Include vagrant.d/sshconfig

Now navigate to the directory where your Vagrant lab is configured and run the following command.

cmd
vagrant ssh-config > ~/.ssh/vagrant.d/sshconfig

This will take the Vagrant SSH config and add it to your home directory SSH config.

Test

Now instead of using the vagrant ssh <vm-name> command to access your VMs you can just use ssh <vm-name> . Not only will this be alot faster than using the vagrant ssh you wont have to mess around with /etc/hosts file or do funny tricks with your configuration management inventory files.

cmd
ssh lab-spine01

# output

Welcome to Cumulus VX (TM)

Cumulus VX (TM) is a community supported virtual appliance designed for
experiencing, testing and prototyping Cumulus Networks' latest technology.
For any questions or technical support, visit our community site at:
http://community.cumulusnetworks.com

The registered trademark Linux (R) is used pursuant to a sublicense from LMI,
the exclusive licensee of Linus Torvalds, owner of the mark on a world-wide
basis.
vagrant@cumulus:~$
cmd
cat ~/.ssh/vagrant.d/sshconfig

# output

Host lab-spine01
  HostName 192.168.121.114
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/bradmin/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

Alternate Method

There is an alternate method which is not as seamless but is available if you are running openssh < 7.3p1 or prefer not to alter your user ssh config.

This method involves redirecting the vagrant ssh-config command output to a local directory file (.sshconfig in the below example).

cmd
vagrant ssh-config > .sshconfig

Then use the -F flag to specify the ssh config file for the ssh connection.

cmd
ssh -F .sshconfig lab-spine01

Outro

SSH config is a nice way to manage your SSH connections. In my $JOB I rely on my ssh config to navigate around the network through a multitude of jump boxes. Using an SSH config to manage the Vagrant lab I am working on is a nice little hack and I am kicking myself I did not think of it sooner.