Introduction

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
  

Summary

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.

Updated: 20th January 2019

vagrant