chef-provisioning-azurerm 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +83 -3
- data/lib/chef/provider/azure_network_interface.rb +159 -0
- data/lib/chef/provider/azure_public_ip_address.rb +72 -0
- data/lib/chef/provider/azure_resource_group.rb +2 -0
- data/lib/chef/provider/azure_storage_account.rb +74 -18
- data/lib/chef/provider/azure_virtual_network.rb +100 -0
- data/lib/chef/provisioning/azurerm.rb +4 -1
- data/lib/chef/provisioning/azurerm/azure_provider.rb +35 -0
- data/lib/chef/provisioning/azurerm/version.rb +1 -1
- data/lib/chef/resource/azure_network_interface.rb +39 -0
- data/lib/chef/resource/azure_public_ip_address.rb +19 -0
- data/lib/chef/resource/azure_storage_account.rb +1 -0
- data/lib/chef/resource/azure_virtual_network.rb +39 -0
- metadata +55 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e622074ff9caf91886b46f9ed52ea099edbe0a6a
|
4
|
+
data.tar.gz: 6a1295a76fda9698d7c7ee3a42c8b1492e621d8c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af8e73f71ed1882a3c760101a55a4ed4cb91b5985edc7d60be0ede524c25a5d2afcef7e699b20059e67029e3cdc780221f6007ef98c2f84f9d4434db55c98fdd
|
7
|
+
data.tar.gz: a7ca2425c44dcf520bd37a564a5d015a7ac7e2e36c4d058138f3b11ae1fa06384c899a05a53176312383d7f47d7d73c03e37a3939ae4ad70a5e07d776541d006
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# chef-provisioning-azurerm Changelog
|
2
2
|
|
3
|
+
## [0.3.2] - 2015-10-07
|
4
|
+
### Changed
|
5
|
+
- References to Azure SDK updated, supports Linux
|
6
|
+
- Adding more resources
|
7
|
+
|
3
8
|
## [0.3.1] - 2015-09-05
|
4
9
|
### Changed
|
5
10
|
- :destroy action on azure_resource_group now correctly detects existence of resource group before attempting deletion
|
data/README.md
CHANGED
@@ -60,15 +60,15 @@ The following resources are provided:
|
|
60
60
|
- azure_resource_group
|
61
61
|
- azure_resource_template
|
62
62
|
- azure_storage_account
|
63
|
+
- azure_virtual_network
|
64
|
+
- azure_network_interface
|
65
|
+
- azure_public_ip_address
|
63
66
|
|
64
67
|
The following resources are planned (note: these resources may be renamed as they are implemented):
|
65
68
|
|
66
|
-
- azure_virtual_network
|
67
69
|
- azure_availability_set
|
68
70
|
- azure_load_balancer
|
69
|
-
- azure_network_interface
|
70
71
|
- azure_network_security_group
|
71
|
-
- azure_public_ip_address
|
72
72
|
- azure_virtual_machine
|
73
73
|
- PaaS resources such as TrafficManager, SQL Server etc.
|
74
74
|
|
@@ -141,6 +141,86 @@ azure_storage_account 'mystorageaccount02' do
|
|
141
141
|
end
|
142
142
|
```
|
143
143
|
|
144
|
+
## Example Recipe 3 - deployment of Virtual Network
|
145
|
+
This example creates a virtual network named 'myvnet' in the pendrica-demo
|
146
|
+
resource group in the West US region. This virtual network contains 4 subnets
|
147
|
+
in the 10.123.123.0/24 CIDR block. The specified DNS servers will be used
|
148
|
+
used by VMs in this virtual network.
|
149
|
+
|
150
|
+
**Note that if dns_servers are not specified, the default azure dns will
|
151
|
+
be used.
|
152
|
+
|
153
|
+
### example3.rb
|
154
|
+
|
155
|
+
```ruby
|
156
|
+
require 'chef/provisioning/azurerm'
|
157
|
+
with_driver 'AzureRM:abcd1234-YOUR-GUID-HERE-abcdef123456'
|
158
|
+
|
159
|
+
azure_resource_group 'pendrica-demo' do
|
160
|
+
location 'West US'
|
161
|
+
end
|
162
|
+
|
163
|
+
azure_virtual_network 'myvnet' do
|
164
|
+
action :create
|
165
|
+
resource_group 'pendrica-demo'
|
166
|
+
location 'West US'
|
167
|
+
address_prefixes ['10.123.123.0/24' ]
|
168
|
+
subnets [
|
169
|
+
{ name: 'infrastructure', address_prefix: '10.123.123.0/28' },
|
170
|
+
{ name: 'data', address_prefix: '10.123.123.32/27' },
|
171
|
+
{ name: 'app', address_prefix: '10.123.123.64/26' },
|
172
|
+
{ name: 'web', address_prefix: '10.123.123.128/25' },
|
173
|
+
]
|
174
|
+
dns_servers ['10.123.123.5', '10.123.123.6']
|
175
|
+
tags environment: 'test',
|
176
|
+
owner: 'jsmyth'
|
177
|
+
end
|
178
|
+
|
179
|
+
|
180
|
+
```
|
181
|
+
|
182
|
+
## Example Recipe 4 - deployment of Network Interface
|
183
|
+
This example creates a network interface named mynic2 on the 'web' subnet of a virtual network named 'myvnet'.
|
184
|
+
|
185
|
+
### example4.rb
|
186
|
+
|
187
|
+
```ruby
|
188
|
+
azure_network_interface 'mynic2' do
|
189
|
+
action :create
|
190
|
+
resource_group 'pendrica-demo'
|
191
|
+
location 'West US'
|
192
|
+
virtual_network 'myvnet'
|
193
|
+
subnet 'web'
|
194
|
+
end
|
195
|
+
```
|
196
|
+
|
197
|
+
## Example Recipe 5 - deployment of Network Interface with a private static address and a public IP
|
198
|
+
This example creates a network interface named mynic on the 'web' subnet of a virtual network named 'myvnet'. This interface
|
199
|
+
has a statically assigned IP address and dns servers, as well as a dynamically assigned Public IP address.
|
200
|
+
|
201
|
+
### example5.rb
|
202
|
+
|
203
|
+
```ruby
|
204
|
+
azure_network_interface 'mynic' do
|
205
|
+
action :create
|
206
|
+
resource_group 'pendrica-demo'
|
207
|
+
location 'West US'
|
208
|
+
virtual_network 'myvnet'
|
209
|
+
subnet 'web'
|
210
|
+
private_ip_allocation_method 'static'
|
211
|
+
private_ip_address '10.123.123.250'
|
212
|
+
dns_servers ['10.123.123.5', '10.123.123.6']
|
213
|
+
public_ip 'mynic-pip' do
|
214
|
+
public_ip_allocation_method 'dynamic'
|
215
|
+
domain_name_label 'mydnsname'
|
216
|
+
idle_timeout_in_minutes 15
|
217
|
+
tags environment: 'test',
|
218
|
+
owner: 'jsmyth'
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
```
|
223
|
+
|
144
224
|
## Contributing
|
145
225
|
|
146
226
|
Contributions to the project are welcome via submitting Pull Requests.
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'chef/provisioning/azurerm/azure_provider'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Provider
|
5
|
+
class AzureNetworkInterface < Chef::Provisioning::AzureRM::AzureProvider
|
6
|
+
provides :azure_network_interface
|
7
|
+
|
8
|
+
def whyrun_supported?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
12
|
+
action :create do
|
13
|
+
network_interface_exists = does_network_interface_exist
|
14
|
+
if network_interface_exists
|
15
|
+
converge_by("update network interface #{new_resource.name}") do
|
16
|
+
# currently, we let ARM manage the idempotence, so crete and update are the same
|
17
|
+
new_resource.public_ip_resource.run_action(:create) if new_resource.public_ip_resource
|
18
|
+
create_or_update_network_interface # are create and update different (and should they be??)
|
19
|
+
end
|
20
|
+
else
|
21
|
+
converge_by("create network interface #{new_resource.name}") do
|
22
|
+
new_resource.public_ip_resource.run_action(:create) if new_resource.public_ip_resource
|
23
|
+
create_or_update_network_interface
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
action :destroy do
|
29
|
+
converge_by("destroy network interface: #{new_resource.name}") do
|
30
|
+
if does_network_interface_exist
|
31
|
+
destroy_network_interface
|
32
|
+
new_resource.public_ip_resource.run_action(:destroy) if new_resource.public_ip_resource
|
33
|
+
else
|
34
|
+
action_handler.report_progress "network interface #{new_resource.name} was not found."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def load_current_resource
|
40
|
+
if new_resource.public_ip_resource
|
41
|
+
new_resource.public_ip_resource.location(new_resource.location)
|
42
|
+
new_resource.public_ip_resource.resource_group(new_resource.resource_group) unless new_resource.public_ip_resource.resource_group
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def does_network_interface_exist
|
47
|
+
network_interface_list = try_azure_operation('enumerating network interfaces') do
|
48
|
+
network_management_client.network_interfaces.list(new_resource.resource_group).value!
|
49
|
+
end
|
50
|
+
|
51
|
+
network_interface_list.body.value.each do |network_interface|
|
52
|
+
return true if network_interface.name == new_resource.name
|
53
|
+
end
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
def destroy_network_interface
|
58
|
+
action_handler.report_progress 'Destroying network interface...'
|
59
|
+
try_azure_operation 'destroying network interface' do
|
60
|
+
network_management_client.network_interfaces.delete(new_resource.resource_group, new_resource.name).value!
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_or_update_network_interface
|
65
|
+
network_interface_params = create_network_interface_params
|
66
|
+
action_handler.report_progress 'Creating or Updating network interface...'
|
67
|
+
try_azure_operation 'Creating or Updating network interface' do
|
68
|
+
network_management_client.network_interfaces.create_or_update(new_resource.resource_group, new_resource.name, network_interface_params).value!
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def create_network_interface_params
|
73
|
+
network_interface = create_network_interface(new_resource.name, new_resource.tags, new_resource.location)
|
74
|
+
|
75
|
+
new_resource.virtual_network_resource_group(new_resource.resource_group) unless new_resource.virtual_network_resource_group
|
76
|
+
subnet_ref = get_subnet_ref(new_resource.virtual_network_resource_group,
|
77
|
+
new_resource.virtual_network, new_resource.subnet)
|
78
|
+
|
79
|
+
if new_resource.public_ip_resource
|
80
|
+
public_ip_ref = get_public_ip(new_resource.public_ip_resource.resource_group, new_resource.public_ip_resource.name)
|
81
|
+
end
|
82
|
+
|
83
|
+
network_interface.properties = create_network_interface_properties(
|
84
|
+
new_resource.name, new_resource.private_ip_allocation_method,
|
85
|
+
new_resource.private_ip_address, subnet_ref, new_resource.dns_servers, public_ip_ref)
|
86
|
+
|
87
|
+
network_interface
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_network_interface(name, tags, location)
|
91
|
+
network_interface = Azure::ARM::Network::Models::NetworkInterface.new
|
92
|
+
network_interface.name = name
|
93
|
+
network_interface.tags = tags
|
94
|
+
network_interface.location = location
|
95
|
+
|
96
|
+
network_interface
|
97
|
+
end
|
98
|
+
|
99
|
+
def create_network_interface_properties(interface_name, private_ip_type, private_ip, subnet_ref, dns_servers, public_ip_ref)
|
100
|
+
nic_properties = Azure::ARM::Network::Models::NetworkInterfacePropertiesFormat.new
|
101
|
+
|
102
|
+
nic_properties.dns_settings = create_network_interface_dns_settings(dns_servers) if dns_servers
|
103
|
+
|
104
|
+
ip_config = create_network_interface_ip_configuration("#{interface_name}-ipconfig", private_ip_type, private_ip, subnet_ref, public_ip_ref)
|
105
|
+
nic_properties.ip_configurations = [ip_config]
|
106
|
+
|
107
|
+
nic_properties
|
108
|
+
end
|
109
|
+
|
110
|
+
def create_network_interface_dns_settings(dns_servers)
|
111
|
+
dns_settings = Azure::ARM::Network::Models::NetworkInterfaceDnsSettings.new
|
112
|
+
dns_settings.dns_servers = dns_servers
|
113
|
+
dns_settings
|
114
|
+
end
|
115
|
+
|
116
|
+
def create_network_interface_ip_configuration(ipconfig_name, private_ip_type, private_ip, subnet_ref, public_ip_ref)
|
117
|
+
ip_config = Azure::ARM::Network::Models::NetworkInterfaceIpConfiguration.new
|
118
|
+
ip_config.name = ipconfig_name
|
119
|
+
ip_config.properties = Azure::ARM::Network::Models::NetworkInterfaceIpConfigurationPropertiesFormat.new
|
120
|
+
ip_config.properties.private_ipallocation_method = private_ip_type if private_ip_type
|
121
|
+
ip_config.properties.private_ipaddress = private_ip if private_ip
|
122
|
+
|
123
|
+
if subnet_ref
|
124
|
+
ip_config.properties.subnet = Azure::ARM::Network::Models::Subnet.new
|
125
|
+
ip_config.properties.subnet.id = subnet_ref
|
126
|
+
end
|
127
|
+
|
128
|
+
if public_ip_ref
|
129
|
+
ip_config.properties.public_ipaddress = Azure::ARM::Network::Models::PublicIpAddress.new
|
130
|
+
ip_config.properties.public_ipaddress.id = public_ip_ref
|
131
|
+
end
|
132
|
+
|
133
|
+
ip_config
|
134
|
+
end
|
135
|
+
|
136
|
+
def get_public_ip(resource_group, resource_name)
|
137
|
+
result = try_azure_operation('getting public IP') do
|
138
|
+
network_management_client.public_ip_addresses.get(resource_group, resource_name).value!
|
139
|
+
end
|
140
|
+
|
141
|
+
public_ip = result.body
|
142
|
+
public_ip.id
|
143
|
+
end
|
144
|
+
|
145
|
+
def get_subnet_ref(resource_group_name, vnet_name, subnet_name)
|
146
|
+
[resource_group_name, vnet_name, subnet_name].each do |v|
|
147
|
+
return nil if v.nil? || v.empty?
|
148
|
+
end
|
149
|
+
|
150
|
+
result = try_azure_operation('getting subnet') do
|
151
|
+
network_management_client.subnets.get(resource_group_name, vnet_name, subnet_name).value!
|
152
|
+
end
|
153
|
+
subnet = result.body
|
154
|
+
|
155
|
+
subnet.id
|
156
|
+
end
|
157
|
+
end # class AzureNetworkInterface
|
158
|
+
end # class Provider
|
159
|
+
end # class Chef
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'chef/provisioning/azurerm/azure_provider'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Provider
|
5
|
+
class AzurePublicIPAddress < Chef::Provisioning::AzureRM::AzureProvider
|
6
|
+
provides :azure_public_ip_address
|
7
|
+
|
8
|
+
def whyrun_supported?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
12
|
+
action :create do
|
13
|
+
converge_by("create or update public IP address #{new_resource.name}") do
|
14
|
+
create_public_ip_address
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
action :destroy do
|
19
|
+
converge_by("destroy public IP address #{new_resource.name}") do
|
20
|
+
if public_ip_address_exists
|
21
|
+
destroy_public_ip_address
|
22
|
+
else
|
23
|
+
action_handler.report_progress "public IP address #{new_resource.name} was not found."
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def public_ip_address_exists
|
29
|
+
public_ip_address_list = network_management_client.public_ip_addresses.list(new_resource.resource_group).value!
|
30
|
+
public_ip_address_list.body.value.each do |public_ip_address|
|
31
|
+
return true if public_ip_address.name == new_resource.name
|
32
|
+
end
|
33
|
+
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_public_ip_address
|
38
|
+
public_ip_address = Azure::ARM::Network::Models::PublicIpAddress.new
|
39
|
+
public_ip_address.location = new_resource.location
|
40
|
+
public_ip_address.tags = new_resource.tags
|
41
|
+
|
42
|
+
public_ip_address_properties = Azure::ARM::Network::Models::PublicIpAddressPropertiesFormat.new
|
43
|
+
public_ip_address_properties.public_ipallocation_method = new_resource.public_ip_allocation_method
|
44
|
+
public_ip_address_properties.idle_timeout_in_minutes = new_resource.idle_timeout_in_minutes
|
45
|
+
|
46
|
+
if new_resource.domain_name_label || new_resource.reverse_fqdn
|
47
|
+
public_ip_address_properties.dns_settings = create_public_ip_dns_settings(new_resource.domain_name_label, new_resource.reverse_fqdn)
|
48
|
+
end
|
49
|
+
|
50
|
+
public_ip_address.properties = public_ip_address_properties
|
51
|
+
|
52
|
+
try_azure_operation('creating or updating public ip') do
|
53
|
+
network_management_client.public_ip_addresses.create_or_update(new_resource.resource_group, new_resource.name, public_ip_address).value!
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def destroy_public_ip_address
|
58
|
+
try_azure_operation('destroyinh public ip') do
|
59
|
+
network_management_client.public_ip_addresses.delete(new_resource.resource_group, new_resource.name).value!
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_public_ip_dns_settings(domain_name_label, reverse_fqdn)
|
64
|
+
dns_settings = Azure::ARM::Network::Models::PublicIpAddressDnsSettings.new
|
65
|
+
dns_settings.domain_name_label = domain_name_label
|
66
|
+
dns_settings.reverse_fqdn = reverse_fqdn
|
67
|
+
|
68
|
+
dns_settings
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -15,6 +15,7 @@ class Chef
|
|
15
15
|
resource_group.location = new_resource.location
|
16
16
|
resource_group.tags = new_resource.tags
|
17
17
|
result = resource_management_client.resource_groups.create_or_update(new_resource.name, resource_group).value!
|
18
|
+
Chef::Log.debug("result: #{result.body.inspect}")
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
@@ -23,6 +24,7 @@ class Chef
|
|
23
24
|
resource_group_exists = resource_management_client.resource_groups.check_existence(new_resource.name).value!
|
24
25
|
if resource_group_exists.body
|
25
26
|
result = resource_management_client.resource_groups.delete(new_resource.name).value!
|
27
|
+
Chef::Log.debug("result: #{result.body.inspect}")
|
26
28
|
else
|
27
29
|
action_handler.report_progress "Resource Group #{new_resource.name} was not found."
|
28
30
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'chef/provisioning/azurerm/azure_provider'
|
2
2
|
|
3
|
-
# MSDN: https://msdn.microsoft.com/en-us/library/azure/mt163564.aspx
|
4
|
-
|
5
3
|
class Chef
|
6
4
|
class Provider
|
7
5
|
class AzureStorageAccount < Chef::Provisioning::AzureRM::AzureProvider
|
@@ -12,28 +10,86 @@ class Chef
|
|
12
10
|
end
|
13
11
|
|
14
12
|
action :create do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
13
|
+
# Does the storage account already exist in the specified resource group?
|
14
|
+
storage_account_exists = does_storage_account_exist
|
15
|
+
|
16
|
+
# If the storage account already exists, do an update
|
17
|
+
if storage_account_exists
|
18
|
+
converge_by("update Storage Account #{new_resource.name}") do
|
19
|
+
update_storage_account
|
20
|
+
end
|
21
|
+
else
|
22
|
+
# Create the storage account complete with tags and properties
|
23
|
+
converge_by("create Storage Account #{new_resource.name}") do
|
24
|
+
create_storage_account
|
25
|
+
# now update the resource with properties that are not settable in the create operation (e.g. create domain)
|
26
|
+
update_storage_account
|
27
|
+
end
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
30
31
|
action :destroy do
|
31
|
-
url = "https://management.azure.com/subscriptions/#{new_resource.subscription_id}/resourcegroups/" \
|
32
|
-
"#{new_resource.resource_group}/providers/Microsoft.Storage/storageAccounts/#{new_resource.name}" \
|
33
|
-
'?api-version=2015-05-01-preview'
|
34
32
|
converge_by("destroy Storage Account: #{new_resource.name}") do
|
35
|
-
|
33
|
+
storage_account_exists = does_storage_account_exist
|
34
|
+
if storage_account_exists
|
35
|
+
action_handler.report_progress 'destroying Storage Account'
|
36
|
+
storage_management_client.storage_accounts.delete(new_resource.resource_group, new_resource.name).value!
|
37
|
+
else
|
38
|
+
action_handler.report_progress "Storage Account #{new_resource.name} was not found."
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def does_storage_account_exist
|
44
|
+
storage_account_list = storage_management_client.storage_accounts.list_by_resource_group(new_resource.resource_group).value!
|
45
|
+
storage_account_list.body.value.each do |storage_account|
|
46
|
+
return true if storage_account.name == new_resource.name
|
36
47
|
end
|
48
|
+
false
|
49
|
+
end
|
50
|
+
|
51
|
+
def create_storage_account
|
52
|
+
storage_account = Azure::ARM::Storage::Models::StorageAccountCreateParameters.new
|
53
|
+
storage_account.location = new_resource.location
|
54
|
+
storage_account.tags = new_resource.tags
|
55
|
+
storage_account.properties = Azure::ARM::Storage::Models::StorageAccountPropertiesCreateParameters.new
|
56
|
+
storage_account.properties.account_type = new_resource.account_type
|
57
|
+
action_handler.report_progress 'creating Storage Account'
|
58
|
+
result = storage_management_client.storage_accounts.create(new_resource.resource_group, new_resource.name, storage_account).value!
|
59
|
+
Chef::Log.debug(result)
|
60
|
+
end
|
61
|
+
|
62
|
+
def update_storage_account
|
63
|
+
update_storage_account_tags
|
64
|
+
update_storage_account_account_type
|
65
|
+
update_storage_account_custom_domain
|
66
|
+
end
|
67
|
+
|
68
|
+
def update_storage_account_tags
|
69
|
+
storage_account = Azure::ARM::Storage::Models::StorageAccountUpdateParameters.new
|
70
|
+
storage_account.tags = new_resource.tags
|
71
|
+
storage_account.properties = Azure::ARM::Storage::Models::StorageAccountPropertiesUpdateParameters.new
|
72
|
+
action_handler.report_progress 'updating Tags'
|
73
|
+
result = storage_management_client.storage_accounts.update(new_resource.resource_group, new_resource.name, storage_account).value!
|
74
|
+
Chef::Log.debug(result)
|
75
|
+
end
|
76
|
+
|
77
|
+
def update_storage_account_account_type
|
78
|
+
storage_account = Azure::ARM::Storage::Models::StorageAccountUpdateParameters.new
|
79
|
+
storage_account.properties = Azure::ARM::Storage::Models::StorageAccountPropertiesUpdateParameters.new
|
80
|
+
storage_account.properties.account_type = new_resource.account_type
|
81
|
+
action_handler.report_progress 'updating Properties'
|
82
|
+
result = storage_management_client.storage_accounts.update(new_resource.resource_group, new_resource.name, storage_account).value!
|
83
|
+
Chef::Log.debug(result)
|
84
|
+
end
|
85
|
+
|
86
|
+
def update_storage_account_custom_domain
|
87
|
+
storage_account = Azure::ARM::Storage::Models::StorageAccountUpdateParameters.new
|
88
|
+
storage_account.properties = Azure::ARM::Storage::Models::StorageAccountPropertiesUpdateParameters.new
|
89
|
+
storage_account.properties.custom_domain = new_resource.custom_domain
|
90
|
+
action_handler.report_progress 'updating Custom Domain'
|
91
|
+
result = storage_management_client.storage_accounts.update(new_resource.resource_group, new_resource.name, storage_account).value!
|
92
|
+
Chef::Log.debug(result)
|
37
93
|
end
|
38
94
|
end
|
39
95
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'chef/provisioning/azurerm/azure_provider'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Provider
|
5
|
+
class AzureVirtualNetwork < Chef::Provisioning::AzureRM::AzureProvider
|
6
|
+
provides :azure_virtual_network
|
7
|
+
|
8
|
+
def whyrun_supported?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
12
|
+
action :create do
|
13
|
+
virtual_network_exists = does_virtual_network_exist
|
14
|
+
|
15
|
+
if virtual_network_exists
|
16
|
+
converge_by("update virtual network #{new_resource.name}") do
|
17
|
+
# currently, we let ARM manage the idempotence, so crete and update are the same
|
18
|
+
create_or_update_virtual_network # are create and update different (and should they be??)
|
19
|
+
end
|
20
|
+
else
|
21
|
+
converge_by("create virtual network #{new_resource.name}") do
|
22
|
+
create_or_update_virtual_network
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
action :destroy do
|
28
|
+
converge_by("destroy virtual network: #{new_resource.name}") do
|
29
|
+
if does_virtual_network_exist
|
30
|
+
destroy_virtual_network
|
31
|
+
else
|
32
|
+
action_handler.report_progress "virtual network #{new_resource.name} was not found."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def does_virtual_network_exist
|
38
|
+
virtual_network_list = try_azure_operation('listing virtual networks') do
|
39
|
+
network_management_client.virtual_networks.list(new_resource.resource_group).value!
|
40
|
+
end
|
41
|
+
|
42
|
+
virtual_network_list.body.value.each do |virtual_network|
|
43
|
+
return true if virtual_network.name == new_resource.name
|
44
|
+
end
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
def destroy_virtual_network
|
49
|
+
action_handler.report_progress 'Destroying Virtual Network...'
|
50
|
+
try_azure_operation('destroying virtual network') do
|
51
|
+
network_management_client.virtual_networks.delete(new_resource.resource_group, new_resource.name).value!
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_or_update_virtual_network
|
56
|
+
virtual_network = Azure::ARM::Network::Models::VirtualNetwork.new
|
57
|
+
|
58
|
+
virtual_network.tags = new_resource.tags
|
59
|
+
virtual_network.location = new_resource.location
|
60
|
+
|
61
|
+
virtual_network.properties = create_virtual_network_properties(
|
62
|
+
new_resource.address_prefixes, new_resource.subnets, new_resource.dns_servers)
|
63
|
+
|
64
|
+
action_handler.report_progress 'Creating or Updating Virtual Network...'
|
65
|
+
|
66
|
+
try_azure_operation('creating or updating network interface') do
|
67
|
+
network_management_client.virtual_networks.create_or_update(new_resource.resource_group, new_resource.name, virtual_network).value!
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def create_virtual_network_properties(address_prefixes, subnets, dns_servers)
|
72
|
+
props = Azure::ARM::Network::Models::VirtualNetworkPropertiesFormat.new
|
73
|
+
|
74
|
+
props.address_space = Azure::ARM::Network::Models::AddressSpace.new
|
75
|
+
props.address_space.address_prefixes = address_prefixes
|
76
|
+
|
77
|
+
if dns_servers
|
78
|
+
props.dhcp_options = Azure::ARM::Network::Models::DhcpOptions.new
|
79
|
+
props.dhcp_options.dns_servers = dns_servers
|
80
|
+
end
|
81
|
+
|
82
|
+
props.subnets = []
|
83
|
+
subnets.each do |subnet|
|
84
|
+
props.subnets.push(create_subnet(subnet[:name], subnet[:address_prefix]))
|
85
|
+
end
|
86
|
+
|
87
|
+
props
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_subnet(subnet_name, subnet_address)
|
91
|
+
subnet = Azure::ARM::Network::Models::Subnet.new
|
92
|
+
subnet.name = subnet_name
|
93
|
+
subnet.properties = Azure::ARM::Network::Models::SubnetPropertiesFormat.new
|
94
|
+
subnet.properties.address_prefix = subnet_address
|
95
|
+
|
96
|
+
subnet
|
97
|
+
end
|
98
|
+
end # class AzureVirtualNetwork
|
99
|
+
end # class Provider
|
100
|
+
end # class Chef
|
@@ -3,11 +3,14 @@ require 'chef/provisioning/version'
|
|
3
3
|
require 'chef/provisioning/azurerm/driver'
|
4
4
|
require 'chef/provisioning/azurerm/version'
|
5
5
|
require 'azure_mgmt_resources'
|
6
|
+
require 'azure_mgmt_storage'
|
7
|
+
require 'azure_mgmt_compute'
|
8
|
+
require 'azure_mgmt_network'
|
6
9
|
|
7
10
|
Chef::Log.info("chef-provisioning-azurerm #{Chef::Provisioning::AzureRM::VERSION}")
|
8
11
|
Chef::Log.info("chef-provisioning #{Chef::Provisioning::VERSION}")
|
9
12
|
|
10
|
-
resources = %w(resource_group resource_template storage_account)
|
13
|
+
resources = %w(resource_group resource_template storage_account virtual_network network_interface public_ip_address)
|
11
14
|
resources.each do |r|
|
12
15
|
require "chef/resource/azure_#{r}"
|
13
16
|
require "chef/provider/azure_#{r}"
|
@@ -18,6 +18,41 @@ class Chef
|
|
18
18
|
client.subscription_id = new_resource.subscription_id
|
19
19
|
client
|
20
20
|
end
|
21
|
+
|
22
|
+
def storage_management_client
|
23
|
+
credentials = Credentials.new.azure_credentials_for_subscription(new_resource.subscription_id)
|
24
|
+
client = Azure::ARM::Storage::StorageManagementClient.new(credentials)
|
25
|
+
client.subscription_id = new_resource.subscription_id
|
26
|
+
client
|
27
|
+
end
|
28
|
+
|
29
|
+
def compute_management_client
|
30
|
+
credentials = Credentials.new.azure_credentials_for_subscription(new_resource.subscription_id)
|
31
|
+
client = Azure::ARM::Compute::ComputeManagementClient.new(credentials)
|
32
|
+
client.subscription_id = new_resource.subscription_id
|
33
|
+
client
|
34
|
+
end
|
35
|
+
|
36
|
+
def network_management_client
|
37
|
+
credentials = Credentials.new.azure_credentials_for_subscription(new_resource.subscription_id)
|
38
|
+
client = Azure::ARM::Network::NetworkResourceProviderClient.new(credentials)
|
39
|
+
client.subscription_id = new_resource.subscription_id
|
40
|
+
client
|
41
|
+
end
|
42
|
+
|
43
|
+
def try_azure_operation(description, silently_continue_on_error = false)
|
44
|
+
begin
|
45
|
+
result = yield
|
46
|
+
rescue MsRestAzure::AzureOperationError => operation_error
|
47
|
+
unless silently_continue_on_error
|
48
|
+
error = operation_error.body['error']
|
49
|
+
Chef::Log.error "ERROR #{description} - #{error}"
|
50
|
+
raise operation_error
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
result
|
55
|
+
end
|
21
56
|
end
|
22
57
|
end
|
23
58
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'chef/provisioning/azurerm/azure_resource'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Resource
|
5
|
+
class AzureNetworkInterface < Chef::Provisioning::AzureRM::AzureResource
|
6
|
+
resource_name :azure_network_interface
|
7
|
+
|
8
|
+
actions :create, :destroy, :nothing
|
9
|
+
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
attribute :name, kind_of: String, name_attribute: true, regex: /^[\w\-\(\)\.]{0,80}$+(?<!\.)$/i
|
13
|
+
attribute :resource_group, kind_of: String
|
14
|
+
attribute :location, kind_of: String, default: 'westus'
|
15
|
+
attribute :tags, kind_of: Hash
|
16
|
+
attribute :private_ip_allocation_method, kind_of: String, equal_to: %w(static dynamic), default: 'dynamic'
|
17
|
+
attribute :private_ip_address, kind_of: String, regex: /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
|
18
|
+
attribute :virtual_network, kind_of: String
|
19
|
+
attribute :virtual_network_resource_group, kind_of: String
|
20
|
+
attribute :subnet, kind_of: String
|
21
|
+
attribute :dns_servers, kind_of: Array, callbacks: {
|
22
|
+
'should be an array of ip addresses' => lambda do |arg_array|
|
23
|
+
arg_array.each do |subnet|
|
24
|
+
return false unless subnet =~ /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
|
25
|
+
end
|
26
|
+
return true
|
27
|
+
end
|
28
|
+
}
|
29
|
+
|
30
|
+
attr_reader :public_ip_resource
|
31
|
+
|
32
|
+
def public_ip(resource_name, &resource_block)
|
33
|
+
@public_ip_resource = Chef::Resource::AzurePublicIPAddress.new(resource_name.to_s, run_context)
|
34
|
+
@public_ip_resource.action :nothing
|
35
|
+
@public_ip_resource.instance_eval(&resource_block)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'chef/provisioning/azurerm/azure_resource'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Resource
|
5
|
+
class AzurePublicIPAddress < Chef::Provisioning::AzureRM::AzureResource
|
6
|
+
resource_name :azure_public_ip_address
|
7
|
+
actions :create, :destroy, :nothing
|
8
|
+
default_action :create
|
9
|
+
attribute :name, kind_of: String, name_attribute: true
|
10
|
+
attribute :location, kind_of: String, default: 'westus'
|
11
|
+
attribute :tags, kind_of: Hash
|
12
|
+
attribute :resource_group, kind_of: String
|
13
|
+
attribute :public_ip_allocation_method, kind_of: String, equal_to: %w(dynamic static), default: 'dynamic'
|
14
|
+
attribute :domain_name_label, kind_of: String
|
15
|
+
attribute :reverse_fqdn, kind_of: String
|
16
|
+
attribute :idle_timeout_in_minutes, kind_of: Integer
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -13,6 +13,7 @@ class Chef
|
|
13
13
|
attribute :location, kind_of: String, default: 'westus'
|
14
14
|
attribute :tags, kind_of: Hash
|
15
15
|
attribute :account_type, kind_of: String, equal_to: %w(Standard_LRS Standard_ZRS Standard_GRS Standard_RAGRS Premium_LRS), default: 'Standard_LRS'
|
16
|
+
attribute :custom_domain, kind_of: String
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'chef/provisioning/azurerm/azure_resource'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Resource
|
5
|
+
class AzureVirtualNetwork < Chef::Provisioning::AzureRM::AzureResource
|
6
|
+
resource_name :azure_virtual_network
|
7
|
+
actions :create, :destroy, :nothing
|
8
|
+
default_action :create
|
9
|
+
attribute :name, kind_of: String, name_attribute: true
|
10
|
+
attribute :resource_group, kind_of: String
|
11
|
+
attribute :location, kind_of: String, default: 'westus'
|
12
|
+
attribute :tags, kind_of: Hash
|
13
|
+
attribute :address_prefixes, kind_of: Array, callbacks: {
|
14
|
+
'should be an array of subnets in CIDR format (nnn.nnn.nnn.nnn/nn)' => lambda do |arg_array|
|
15
|
+
arg_array.each do |subnet|
|
16
|
+
return false unless subnet =~ %r{^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$}
|
17
|
+
end
|
18
|
+
return true
|
19
|
+
end
|
20
|
+
}
|
21
|
+
attribute :subnets, kind_of: Array, callbacks: {
|
22
|
+
'should be an array of subnet hashes, each with a :name and :address_prefix' => lambda do |arg_array|
|
23
|
+
arg_array.each do |subnet|
|
24
|
+
return false unless ([:name, :address_prefix].sort == subnet.keys.sort)
|
25
|
+
end
|
26
|
+
return true
|
27
|
+
end
|
28
|
+
}
|
29
|
+
attribute :dns_servers, kind_of: Array, callbacks: {
|
30
|
+
'should be an array of ip addresses' => lambda do |arg_array|
|
31
|
+
arg_array.each do |subnet|
|
32
|
+
return false unless subnet =~ /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
|
33
|
+
end
|
34
|
+
return true
|
35
|
+
end
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-provisioning-azurerm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stuart Preston
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|
@@ -82,16 +82,58 @@ dependencies:
|
|
82
82
|
name: azure_mgmt_resources
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- -
|
85
|
+
- - '='
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
87
|
+
version: 0.1.1
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
|
-
- -
|
92
|
+
- - '='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.1.1
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: azure_mgmt_storage
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - '='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.1.1
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - '='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 0.1.1
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: azure_mgmt_compute
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - '='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 0.1.1
|
116
|
+
type: :runtime
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - '='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 0.1.1
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: azure_mgmt_network
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - '='
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 0.1.1
|
130
|
+
type: :runtime
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - '='
|
93
135
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
136
|
+
version: 0.1.1
|
95
137
|
- !ruby/object:Gem::Dependency
|
96
138
|
name: bundler
|
97
139
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,9 +172,12 @@ files:
|
|
130
172
|
- CHANGELOG.md
|
131
173
|
- LICENSE.txt
|
132
174
|
- README.md
|
175
|
+
- lib/chef/provider/azure_network_interface.rb
|
176
|
+
- lib/chef/provider/azure_public_ip_address.rb
|
133
177
|
- lib/chef/provider/azure_resource_group.rb
|
134
178
|
- lib/chef/provider/azure_resource_template.rb
|
135
179
|
- lib/chef/provider/azure_storage_account.rb
|
180
|
+
- lib/chef/provider/azure_virtual_network.rb
|
136
181
|
- lib/chef/provisioning/azurerm.rb
|
137
182
|
- lib/chef/provisioning/azurerm/azure_provider.rb
|
138
183
|
- lib/chef/provisioning/azurerm/azure_resource.rb
|
@@ -140,9 +185,12 @@ files:
|
|
140
185
|
- lib/chef/provisioning/azurerm/driver.rb
|
141
186
|
- lib/chef/provisioning/azurerm/version.rb
|
142
187
|
- lib/chef/provisioning/driver_init/azurerm.rb
|
188
|
+
- lib/chef/resource/azure_network_interface.rb
|
189
|
+
- lib/chef/resource/azure_public_ip_address.rb
|
143
190
|
- lib/chef/resource/azure_resource_group.rb
|
144
191
|
- lib/chef/resource/azure_resource_template.rb
|
145
192
|
- lib/chef/resource/azure_storage_account.rb
|
193
|
+
- lib/chef/resource/azure_virtual_network.rb
|
146
194
|
homepage: https://github.com/pendrica/chef-provisioning-azurerm
|
147
195
|
licenses:
|
148
196
|
- Apache-2.0
|
@@ -163,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
211
|
version: '0'
|
164
212
|
requirements: []
|
165
213
|
rubyforge_project:
|
166
|
-
rubygems_version: 2.4.
|
214
|
+
rubygems_version: 2.4.8
|
167
215
|
signing_key:
|
168
216
|
specification_version: 4
|
169
217
|
summary: Chef Provisioner for the Azure Resource Management (ARM) REST API.
|