Azure: Add Availability Zones (#49243)
Signed-off-by: Sylvain Rabot <s.rabot@lectra.com>pull/4420/head
parent
e8e22e31dc
commit
f29256e4da
|
@ -546,7 +546,7 @@ class AzureRMModuleBase(object):
|
||||||
self.fail("Error creating blob service client for storage account {0} - {1}".format(storage_account_name,
|
self.fail("Error creating blob service client for storage account {0} - {1}".format(storage_account_name,
|
||||||
str(exc)))
|
str(exc)))
|
||||||
|
|
||||||
def create_default_pip(self, resource_group, location, public_ip_name, allocation_method='Dynamic'):
|
def create_default_pip(self, resource_group, location, public_ip_name, allocation_method='Dynamic', sku=None):
|
||||||
'''
|
'''
|
||||||
Create a default public IP address <public_ip_name> to associate with a network interface.
|
Create a default public IP address <public_ip_name> to associate with a network interface.
|
||||||
If a PIP address matching <public_ip_name> exists, return it. Otherwise, create one.
|
If a PIP address matching <public_ip_name> exists, return it. Otherwise, create one.
|
||||||
|
@ -555,6 +555,7 @@ class AzureRMModuleBase(object):
|
||||||
:param location: a valid azure location
|
:param location: a valid azure location
|
||||||
:param public_ip_name: base name to assign the public IP address
|
:param public_ip_name: base name to assign the public IP address
|
||||||
:param allocation_method: one of 'Static' or 'Dynamic'
|
:param allocation_method: one of 'Static' or 'Dynamic'
|
||||||
|
:param sku: sku
|
||||||
:return: PIP object
|
:return: PIP object
|
||||||
'''
|
'''
|
||||||
pip = None
|
pip = None
|
||||||
|
@ -574,6 +575,7 @@ class AzureRMModuleBase(object):
|
||||||
params = self.network_models.PublicIPAddress(
|
params = self.network_models.PublicIPAddress(
|
||||||
location=location,
|
location=location,
|
||||||
public_ip_allocation_method=allocation_method,
|
public_ip_allocation_method=allocation_method,
|
||||||
|
sku=sku
|
||||||
)
|
)
|
||||||
self.log('Creating default public IP {0}'.format(public_ip_name))
|
self.log('Creating default public IP {0}'.format(public_ip_name))
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -305,6 +305,11 @@ options:
|
||||||
type: bool
|
type: bool
|
||||||
default: false
|
default: false
|
||||||
version_added: "2.7"
|
version_added: "2.7"
|
||||||
|
zones:
|
||||||
|
description:
|
||||||
|
- A list of Availability Zones for your virtual machine
|
||||||
|
type: list
|
||||||
|
version_added: "2.8"
|
||||||
|
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
- azure
|
- azure
|
||||||
|
@ -498,6 +503,16 @@ EXAMPLES = '''
|
||||||
remove_on_absent:
|
remove_on_absent:
|
||||||
- network_interfaces
|
- network_interfaces
|
||||||
- virtual_storage
|
- virtual_storage
|
||||||
|
|
||||||
|
- name: Create a VM with an Availability Zone
|
||||||
|
azure_rm_virtualmachine:
|
||||||
|
resource_group: Testing
|
||||||
|
name: testvm001
|
||||||
|
vm_size: Standard_DS1_v2
|
||||||
|
admin_username: adminUser
|
||||||
|
admin_password: password01
|
||||||
|
image: customimage001
|
||||||
|
zones: [1]
|
||||||
'''
|
'''
|
||||||
|
|
||||||
RETURN = '''
|
RETURN = '''
|
||||||
|
@ -737,7 +752,8 @@ class AzureRMVirtualMachine(AzureRMModuleBase):
|
||||||
generalized=dict(type='bool', default=False),
|
generalized=dict(type='bool', default=False),
|
||||||
data_disks=dict(type='list'),
|
data_disks=dict(type='list'),
|
||||||
plan=dict(type='dict'),
|
plan=dict(type='dict'),
|
||||||
accept_terms=dict(type='bool', default=False)
|
accept_terms=dict(type='bool', default=False),
|
||||||
|
zones=dict(type='list')
|
||||||
)
|
)
|
||||||
|
|
||||||
self.resource_group = None
|
self.resource_group = None
|
||||||
|
@ -778,6 +794,7 @@ class AzureRMVirtualMachine(AzureRMModuleBase):
|
||||||
self.data_disks = None
|
self.data_disks = None
|
||||||
self.plan = None
|
self.plan = None
|
||||||
self.accept_terms = None
|
self.accept_terms = None
|
||||||
|
self.zones = None
|
||||||
|
|
||||||
self.results = dict(
|
self.results = dict(
|
||||||
changed=False,
|
changed=False,
|
||||||
|
@ -797,6 +814,9 @@ class AzureRMVirtualMachine(AzureRMModuleBase):
|
||||||
# make sure options are lower case
|
# make sure options are lower case
|
||||||
self.remove_on_absent = set([resource.lower() for resource in self.remove_on_absent])
|
self.remove_on_absent = set([resource.lower() for resource in self.remove_on_absent])
|
||||||
|
|
||||||
|
# convert elements to ints
|
||||||
|
self.zones = [int(i) for i in self.zones] if self.zones else None
|
||||||
|
|
||||||
changed = False
|
changed = False
|
||||||
powerstate_change = None
|
powerstate_change = None
|
||||||
results = dict()
|
results = dict()
|
||||||
|
@ -968,6 +988,12 @@ class AzureRMVirtualMachine(AzureRMModuleBase):
|
||||||
changed = True
|
changed = True
|
||||||
powerstate_change = 'generalized'
|
powerstate_change = 'generalized'
|
||||||
|
|
||||||
|
vm_dict['zones'] = [int(i) for i in vm_dict['zones']] if 'zones' in vm_dict and vm_dict['zones'] else None
|
||||||
|
if self.zones != vm_dict['zones']:
|
||||||
|
self.log("CHANGED: virtual machine {0} zones".format(self.name))
|
||||||
|
differences.append('Zones')
|
||||||
|
changed = True
|
||||||
|
|
||||||
self.differences = differences
|
self.differences = differences
|
||||||
|
|
||||||
elif self.state == 'absent':
|
elif self.state == 'absent':
|
||||||
|
@ -1014,6 +1040,9 @@ class AzureRMVirtualMachine(AzureRMModuleBase):
|
||||||
parsed_availability_set.get('name'))
|
parsed_availability_set.get('name'))
|
||||||
availability_set_resource = self.compute_models.SubResource(id=availability_set.id)
|
availability_set_resource = self.compute_models.SubResource(id=availability_set.id)
|
||||||
|
|
||||||
|
if self.zones:
|
||||||
|
self.fail("Parameter error: you can't use Availability Set and Availability Zones at the same time")
|
||||||
|
|
||||||
# Get defaults
|
# Get defaults
|
||||||
if not self.network_interface_names:
|
if not self.network_interface_names:
|
||||||
default_nic = self.create_default_nic()
|
default_nic = self.create_default_nic()
|
||||||
|
@ -1081,7 +1110,8 @@ class AzureRMVirtualMachine(AzureRMModuleBase):
|
||||||
network_interfaces=nics
|
network_interfaces=nics
|
||||||
),
|
),
|
||||||
availability_set=availability_set_resource,
|
availability_set=availability_set_resource,
|
||||||
plan=plan
|
plan=plan,
|
||||||
|
zones=self.zones,
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.admin_password:
|
if self.admin_password:
|
||||||
|
@ -1220,6 +1250,10 @@ class AzureRMVirtualMachine(AzureRMModuleBase):
|
||||||
else:
|
else:
|
||||||
image_reference = None
|
image_reference = None
|
||||||
|
|
||||||
|
# You can't change a vm zone
|
||||||
|
if vm_dict['zones'] != self.zones:
|
||||||
|
self.fail("You can't change the Availability Zone of a virtual machine (have: {0}, want: {1})".format(vm_dict['zones'], self.zones))
|
||||||
|
|
||||||
if 'osProfile' in vm_dict['properties']:
|
if 'osProfile' in vm_dict['properties']:
|
||||||
os_profile = self.compute_models.OSProfile(
|
os_profile = self.compute_models.OSProfile(
|
||||||
admin_username=vm_dict['properties'].get('osProfile', {}).get('adminUsername'),
|
admin_username=vm_dict['properties'].get('osProfile', {}).get('adminUsername'),
|
||||||
|
@ -1810,8 +1844,9 @@ class AzureRMVirtualMachine(AzureRMModuleBase):
|
||||||
pip = None
|
pip = None
|
||||||
if self.public_ip_allocation_method != 'Disabled':
|
if self.public_ip_allocation_method != 'Disabled':
|
||||||
self.results['actions'].append('Created default public IP {0}'.format(self.name + '01'))
|
self.results['actions'].append('Created default public IP {0}'.format(self.name + '01'))
|
||||||
pip_info = self.create_default_pip(self.resource_group, self.location, self.name + '01', self.public_ip_allocation_method)
|
sku = self.network_models.PublicIPAddressSku(name="Standard") if self.zones else None
|
||||||
pip = self.network_models.PublicIPAddress(id=pip_info.id, location=pip_info.location, resource_guid=pip_info.resource_guid)
|
pip_info = self.create_default_pip(self.resource_group, self.location, self.name + '01', self.public_ip_allocation_method, sku=sku)
|
||||||
|
pip = self.network_models.PublicIPAddress(id=pip_info.id, location=pip_info.location, resource_guid=pip_info.resource_guid, sku=sku)
|
||||||
|
|
||||||
self.results['actions'].append('Created default security group {0}'.format(self.name + '01'))
|
self.results['actions'].append('Created default security group {0}'.format(self.name + '01'))
|
||||||
group = self.create_default_securitygroup(self.resource_group, self.location, self.name + '01', self.os_type,
|
group = self.create_default_securitygroup(self.resource_group, self.location, self.name + '01', self.os_type,
|
||||||
|
|
|
@ -203,6 +203,11 @@ options:
|
||||||
type: bool
|
type: bool
|
||||||
default: True
|
default: True
|
||||||
version_added: "2.8"
|
version_added: "2.8"
|
||||||
|
zones:
|
||||||
|
description:
|
||||||
|
- A list of Availability Zones for your virtual machine scale set
|
||||||
|
type: list
|
||||||
|
version_added: "2.8"
|
||||||
|
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
- azure
|
- azure
|
||||||
|
@ -410,7 +415,8 @@ class AzureRMVirtualMachineScaleSet(AzureRMModuleBase):
|
||||||
remove_on_absent=dict(type='list', default=['all']),
|
remove_on_absent=dict(type='list', default=['all']),
|
||||||
enable_accelerated_networking=dict(type='bool'),
|
enable_accelerated_networking=dict(type='bool'),
|
||||||
security_group=dict(type='raw', aliases=['security_group_name']),
|
security_group=dict(type='raw', aliases=['security_group_name']),
|
||||||
overprovision=dict(type='bool', default=True)
|
overprovision=dict(type='bool', default=True),
|
||||||
|
zones=dict(type='list')
|
||||||
)
|
)
|
||||||
|
|
||||||
self.resource_group = None
|
self.resource_group = None
|
||||||
|
@ -440,6 +446,7 @@ class AzureRMVirtualMachineScaleSet(AzureRMModuleBase):
|
||||||
self.enable_accelerated_networking = None
|
self.enable_accelerated_networking = None
|
||||||
self.security_group = None
|
self.security_group = None
|
||||||
self.overprovision = None
|
self.overprovision = None
|
||||||
|
self.zones = None
|
||||||
|
|
||||||
self.results = dict(
|
self.results = dict(
|
||||||
changed=False,
|
changed=False,
|
||||||
|
@ -462,6 +469,9 @@ class AzureRMVirtualMachineScaleSet(AzureRMModuleBase):
|
||||||
# make sure options are lower case
|
# make sure options are lower case
|
||||||
self.remove_on_absent = set([resource.lower() for resource in self.remove_on_absent])
|
self.remove_on_absent = set([resource.lower() for resource in self.remove_on_absent])
|
||||||
|
|
||||||
|
# convert elements to ints
|
||||||
|
self.zones = [int(i) for i in self.zones] if self.zones else None
|
||||||
|
|
||||||
# default virtual_network_resource_group to resource_group
|
# default virtual_network_resource_group to resource_group
|
||||||
if not self.virtual_network_resource_group:
|
if not self.virtual_network_resource_group:
|
||||||
self.virtual_network_resource_group = self.resource_group
|
self.virtual_network_resource_group = self.resource_group
|
||||||
|
@ -582,6 +592,13 @@ class AzureRMVirtualMachineScaleSet(AzureRMModuleBase):
|
||||||
differences.append('overprovision')
|
differences.append('overprovision')
|
||||||
changed = True
|
changed = True
|
||||||
|
|
||||||
|
vmss_dict['zones'] = [int(i) for i in vmss_dict['zones']] if 'zones' in vmss_dict and vmss_dict['zones'] else None
|
||||||
|
if self.zones != vmss_dict['zones']:
|
||||||
|
self.log("CHANGED: virtual machine scale sets {0} zones".format(self.name))
|
||||||
|
differences.append('Zones')
|
||||||
|
changed = True
|
||||||
|
vmss_dict['zones'] = self.zones
|
||||||
|
|
||||||
self.differences = differences
|
self.differences = differences
|
||||||
|
|
||||||
elif self.state == 'absent':
|
elif self.state == 'absent':
|
||||||
|
@ -694,7 +711,8 @@ class AzureRMVirtualMachineScaleSet(AzureRMModuleBase):
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
)
|
),
|
||||||
|
zones=self.zones
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.admin_password:
|
if self.admin_password:
|
||||||
|
|
Loading…
Reference in New Issue