As well as Getting Web Services Up and Running on Amazon Web Services (AWS) Using Vagrant and the AWS CLI, we can also use Vagrant to provision machines on other web hosts, such as the Microsoft Azure cloud paltform. In this post, I’ll describe a command line based recipe for doing just that.
To start with, you’ll need to get a Microsoft Azure account.
When you’ve done that, install the Azure command line interface (CLI). On a Mac:
curl -L https://aka.ms/InstallAzureCli | bash
For me, this installed to
With the client installed, login:
This requires a token based handshake with a Microsoft authentication website.
List the range of machine images available (if you haven’t set the path to
az, use the full
az vm image list
There was only one that looked suitable to me for my purposes: Canonical:UbuntuServer:16.04-LTS:latest.
To run the provisioner, we need a Subscription ID; this will be used to set the vagrant .subscription_id parameter. These are listed on the Azure Portal.
We also need to create an Active Directory Service Principal:
az ad sp create-for-rbac
This information will be used to configure the Vagrantfile: the
appId sets the vagrant .client_id, the
password the .client_secret, and the
tenant the .tenant_id.
You can also inspect the application in the App Registrations area of the Azure Portal.
Now let’s set up Vagrant. We’ll use the
vagrant plugin install vagrant-azure --plugin-version '2.0.0.pre6'
We need to add a dummy box:
vagrant box add azure https://github.com/azure/vagrant-azure/raw/v2.0/dummy.box
Now let’s set up the Vagrantfile:
config.vm.provider :azure do |azure, override| #The path to your ssh keys override.ssh.private_key_path = '~/.ssh/id_rsa' #The default box we added override.vm.box = 'azure' #Set a territory azure.location="uksouth" #Provide your own group and VM name azure.resource_group_name="tm351azuretest" azure.vm_name="tm351azurevmtest" # Set an appropriate image (the UbuntuServer is actually the current default value) azure.vm_image_urn="Canonical:UbuntuServer:16.04-LTS:latest" #Use a valid subscription ID #https://portal.azure.com/#blade/HubsExtension/MyAccessBlade/resourceId/ azure.subscription_id = ENV['AZURE_SUBSCRIPTION_ID'] # Using details from the Active Directory Service Principal setup azure.tenant_id = ENV['AZURE_TENANT_ID'] azure.client_id = ENV['AZURE_CLIENT_ID'] azure.client_secret = ENV['AZURE_CLIENT_SECRET'] end
With the Vagrantfile parameters in place, we should then be able call the Azure provider using the command:
vagrant up --provider=azure
But we’re still not quite done… If you’re running services on the VM, populated from elsewhere in the Vagranfile, you’ll need to add some security rules to make the ports accessible. I’m running services on ports 80,35180 and 35181 for example:
az vm open-port -g tm351azuretest -n tm351azuretest --port 80 --priority 130 az vm open-port -g tm351azuretest -n tm351azuretest --port 35180 --priority 140 az vm open-port -g tm351azuretest -n tm351azuretest --port 35181 --priority 150
Now we can lookup the IP address of the server:
az vm list-ip-addresses
and see if our applications are there :-)