cheese-chef-provisioning-azurerm
cheese-chef-provisioning-azurerm is an extension of chef-provisioning-azurerm driver to support some basic resources like machine for chef-provisioning that allows Microsoft Azure resources to be provisioned by Chef. This driver uses the new Microsoft Azure Resource Management REST API via the azure-sdk-for-ruby.
The driver provides machine resource for Azure.
Note: If you are looking for a driver that works with the existing Microsoft Azure Service Management API please visit chef-provisioning-azure
Or original AzureRM driver please visit chef-provisioning-azurerm
Quick-start
Prerequisites
The plugin requires Chef Client 12.2.1 or higher.
Installation
This plugin is distributed as a Ruby Gem. To install it, run:
$ chef gem install cheese-chef-provisioning-azurerm
Configuration
For the driver to interact with the Microsoft Azure Resource management REST API, a Service Principal needs to be configured with Owner rights against the specific subscription being targeted. To create a Service Principal and apply the correct permissions, follow the instructions in the article: Authenticating a service principal with Azure Resource Manager
You will essentially need 4 parameters from the above article to configure Chef Provisioning: Subscription ID, Client ID, Client Secret/Password and Tenant ID. These can be easily obtained using the azure-cli tools (v0.9.8 or higher) on any platform.
Using a text editor, open or create the file ~/.azure/credentials and add the following section:
[abcd1234-YOUR-GUID-HERE-abcdef123456]
client_id = "48b9bba3-YOUR-GUID-HERE-90f0b68ce8ba"
client_secret = "your-client-secret-here"
tenant_id = "9c117323-YOUR-GUID-HERE-9ee430723ba3"
If preferred, you may also set the following environment variables on the "provisioning node", replacing the values with those obtained when you configured the service principal
AZURE_CLIENT_ID="48b9bba3-YOUR-GUID-HERE-90f0b68ce8ba"
AZURE_CLIENT_SECRET="your-client-secret-here"
AZURE_TENANT_ID="9c117323-YOUR-GUID-HERE-9ee430723ba3"
Note that the environment variables, if set, take preference over the values in a configuration file. The subscription id will be taken from the recipe.
driver_url
with_driver 'azurerm:abcd1234-YOUR-GUID-HERE-abcdef123456'
Features
Unlike a fully-featured chef-provisioning driver, the chef-provisioning-azurerm driver only offers a way to interact with machine, machine_batch and load_balancer resources.
The following resources are provided by chef-provisioning-azurerm
- azure_resource_group
- azure_resource_template
- azure_storage_account
- azure_virtual_network
- azure_network_interface
- azure_public_ip_address
cheese-chef-provisioning-azurerm offers
Machine Options
You can pass machine options that will be used by machine and machine_batch to
configure the machine.
These options are an extension of the base options. Please see that for a list of the machine_options shared between drivers.
The full syntax available in the bootstrap_options hash is the hash expected by the Azure Virtual Machines create_or_update method. The options seen below in the example are the default options.
with_machine_options({
:transport_address_location => :private_ip
:bootstrap_options => {
:location => "West US 2",
:tags => {},
:resource_group_name => "resource-group",
:virtual_network_name => "virtual-network",
:subnet_name => "network-az-us-west-2",
:network_security_group_name => "admin-sg",
:key_name => "azure-key",
:availability_set => "availability-set",
:osProfile => {
:computerName => "test1",
:adminUsername => "ubuntu",
:linuxConfiguration => {
:disablePasswordAuthentication => true,
:ssh => {
:publicKeys => [
{
:keyData => ""
}
]
}
},
},
:storageProfile => {
:imageReference => {
:publisher => "Canonical",
:offer => "UbuntuServer",
:sku => "14.04.5-LTS",
:version => "14.04.201703280"
},
:storage_account_type => "Standard_LRS"
},
:hardwareProfile => {
:vmSize => "Standard_DS1_v2"
},
}
})
This options hash can be supplied to either with_machine_options at the recipe level or directly into the machine_options
attribute.
location option
location for resource creation can be specified at 2 places.
This list is in the order of preference
machine_options[:bootstrap_options][:location]
machine_options[:location]
Example Recipe - deployment of machine
The following recipe creates a new VM within your subscription (identified by the GUID on line 2).
example1.rb
require 'chef/provisioning/azurerm'
with_driver 'azurerm:abcd1234-YOUR-GUID-HERE-abcdef123456'
with_machine_options({
:bootstrap_options => {
:location => "West US 2",
:tags => {:business => "my business"},
:resource_group_name => "resource-group",
:virtual_network_name => "virtual-network",
:subnet_name => "network-az-us-west-2",
:network_security_group_name => "admin-sg",
:key_name => "azure-key",
:availability_set => "availability-set",
:osProfile => {
:computerName => "test1",
:adminUsername => "ubuntu",
:linuxConfiguration => {
:disablePasswordAuthentication => true,
:ssh => {
:publicKeys => [
{
:keyData => "replace with your pub key"
}
]
}
},
},
:storageProfile => {
:imageReference => {
:publisher => "Canonical",
:offer => "UbuntuServer",
:sku => "14.04.5-LTS",
:version => "14.04.201703280"
},
:storage_account_type => "Standard_LRS"
},
:hardwareProfile => {
:vmSize => "Standard_DS1_v2"
},
}
})
machine "test1" do
end
Resources
azure_data_disk
This resource is used to create and manage managed disks of azurerm. Azure supports several create options to create managed disk. But this driver only supports Empty disk creation as a default option.
attributes
attribute :name, kind_of: String, name_attribute: true
attribute :resource_group, String, required: true
attribute :size, kind_of: Integer, default: 10 # in gb
attribute :storage_account_type, String, default: 'Standard_LRS'
attribute :caching, String, default: 'none'
attribute :lun, Integer
attribute :tags, kind_of: Hash
attribute :vm, String
attribute :location, String
vm and location
One must be specified while creating a new disk. And if both specified, vm takes precedence over location.
size
Azure supports disk size expansion so does this driver, but only at a certain condition.
When a disk is already created and not attached, :create action can be used to attach the disk to a VM and if a larger size is specified, it will expand the disk too. But if size is reduced in same case scenario, it will just warn and attach the disk to the VM.
actions
create
This action will create an empty managed disk. Behaviour of this action varies based vm attribute.
- case 1: when
vm not provided
A new empty disk will be created.
- case 2: when
vm is provided
The disk will be added to the VM. In case disk already exist and is attached to a different VM, it will raise an error.
destroy
- case 1: when disk is not attached
The disk will be destroyed.
- case 2: when disk is attached to a VM
The vm needs to be specified to detach and destroy disk, else it will raise an error.
attach
This action can be used when disk is already available and needs to be attached to a VM. Using :attach action will raise error if disk is not already created.
If you are not sure about disk and still wants a disk to be attached to the VM, use :create action.
detach
This action will detach the disk from provided VM. If vm is not specified, it will raise error.
Example
- Creating and attaching disk to VM
azure_data_disk 'disk-test1' do
size 12
vm 'disk-test1' # required in this case
resource_group 'resource-group'
end
azure_data_disk 'disk-test2' do
size 12
location 'West US 2' # required in this case
resource_group 'resource-group'
end
- Attaching existing disk to a VM
azure_data_disk 'disk-test2' do
vm 'disk-test2' # required in this case
resource_group 'resource-group'
end
azure_data_disk 'detaching disk' do
name 'disk-test2'
vm 'disk-test2' # required in this case
resource_group 'resource-group'
action :detach
end
azure_data_disk 're-attaching with bigger size' do
name 'disk-test2'
size 20
vm 'disk-test2' # required in this case
resource_group 'resource-group'
end