Upgrade to azure 2.0.0rc5 and add locations parameter.

This commit is contained in:
Chris Houseknecht 2016-07-08 17:50:36 -04:00
parent ebd3eeec8c
commit 7964a2fca3
3 changed files with 46 additions and 27 deletions

View file

@ -9,6 +9,9 @@
# Control which tags are included. Set tags to a comma separated list of keys or key:value pairs # Control which tags are included. Set tags to a comma separated list of keys or key:value pairs
#tags= #tags=
# Control which locations are included. Set locations to a comma separated list (e.g. eastus,eastus2,westus)
#locations=
# Include powerstate. If you don't need powerstate information, turning it off improves runtime performance. # Include powerstate. If you don't need powerstate information, turning it off improves runtime performance.
include_powerstate=yes include_powerstate=yes

View file

@ -130,6 +130,10 @@ Select hosts for specific tag key by assigning a comma separated list of tag key
AZURE_TAGS=key1,key2,key3 AZURE_TAGS=key1,key2,key3
Select hosts for specific locations:
AZURE_LOCATIONS=eastus,westus,eastus2
Or, select hosts for specific tag key:value pairs by assigning a comma separated list key:value pairs to: Or, select hosts for specific tag key:value pairs by assigning a comma separated list key:value pairs to:
AZURE_TAGS=key1:value1,key2:value2 AZURE_TAGS=key1:value1,key2:value2
@ -152,13 +156,13 @@ up. If the value is anything other than 'running', the machine is down, and will
Examples: Examples:
--------- ---------
Execute /bin/uname on all instances in the galaxy-qa resource group Execute /bin/uname on all instances in the galaxy-qa resource group
$ ansible -i azure_rm_inventory.py galaxy-qa -m shell -a "/bin/uname -a" $ ansible -i azure_rm.py galaxy-qa -m shell -a "/bin/uname -a"
Use the inventory script to print instance specific information Use the inventory script to print instance specific information
$ contrib/inventory/azure_rm_inventory.py --host my_instance_host_name --pretty $ contrib/inventory/azure_rm.py --host my_instance_host_name --pretty
Use with a playbook Use with a playbook
$ ansible-playbook -i contrib/inventory/azure_rm_inventory.py my_playbook.yml --limit galaxy-qa $ ansible-playbook -i contrib/inventory/azure_rm.py my_playbook.yml --limit galaxy-qa
Insecure Platform Warning Insecure Platform Warning
@ -185,6 +189,8 @@ import os
import re import re
import sys import sys
from distutils.version import LooseVersion
from os.path import expanduser from os.path import expanduser
HAS_AZURE = True HAS_AZURE = True
@ -195,12 +201,9 @@ try:
from azure.mgmt.compute import __version__ as azure_compute_version from azure.mgmt.compute import __version__ as azure_compute_version
from azure.common import AzureMissingResourceHttpError, AzureHttpError from azure.common import AzureMissingResourceHttpError, AzureHttpError
from azure.common.credentials import ServicePrincipalCredentials, UserPassCredentials from azure.common.credentials import ServicePrincipalCredentials, UserPassCredentials
from azure.mgmt.network.network_management_client import NetworkManagementClient,\ from azure.mgmt.network.network_management_client import NetworkManagementClient
NetworkManagementClientConfiguration from azure.mgmt.resource.resources.resource_management_client import ResourceManagementClient
from azure.mgmt.resource.resources.resource_management_client import ResourceManagementClient,\ from azure.mgmt.compute.compute_management_client import ComputeManagementClient
ResourceManagementClientConfiguration
from azure.mgmt.compute.compute_management_client import ComputeManagementClient,\
ComputeManagementClientConfiguration
except ImportError as exc: except ImportError as exc:
HAS_AZURE_EXC = exc HAS_AZURE_EXC = exc
HAS_AZURE = False HAS_AZURE = False
@ -219,6 +222,7 @@ AZURE_CREDENTIAL_ENV_MAPPING = dict(
AZURE_CONFIG_SETTINGS = dict( AZURE_CONFIG_SETTINGS = dict(
resource_groups='AZURE_RESOURCE_GROUPS', resource_groups='AZURE_RESOURCE_GROUPS',
tags='AZURE_TAGS', tags='AZURE_TAGS',
locations='AZURE_LOCATIONS',
include_powerstate='AZURE_INCLUDE_POWERSTATE', include_powerstate='AZURE_INCLUDE_POWERSTATE',
group_by_resource_group='AZURE_GROUP_BY_RESOURCE_GROUP', group_by_resource_group='AZURE_GROUP_BY_RESOURCE_GROUP',
group_by_location='AZURE_GROUP_BY_LOCATION', group_by_location='AZURE_GROUP_BY_LOCATION',
@ -226,7 +230,7 @@ AZURE_CONFIG_SETTINGS = dict(
group_by_tag='AZURE_GROUP_BY_TAG' group_by_tag='AZURE_GROUP_BY_TAG'
) )
AZURE_MIN_VERSION = "2016-03-30" AZURE_MIN_VERSION = "0.30.0rc5"
def azure_id_to_dict(id): def azure_id_to_dict(id):
@ -362,8 +366,7 @@ class AzureRM(object):
def network_client(self): def network_client(self):
self.log('Getting network client') self.log('Getting network client')
if not self._network_client: if not self._network_client:
self._network_client = NetworkManagementClient( self._network_client = NetworkManagementClient(self.azure_credentials, self.subscription_id)
NetworkManagementClientConfiguration(self.azure_credentials, self.subscription_id))
self._register('Microsoft.Network') self._register('Microsoft.Network')
return self._network_client return self._network_client
@ -371,16 +374,14 @@ class AzureRM(object):
def rm_client(self): def rm_client(self):
self.log('Getting resource manager client') self.log('Getting resource manager client')
if not self._resource_client: if not self._resource_client:
self._resource_client = ResourceManagementClient( self._resource_client = ResourceManagementClient(self.azure_credentials, self.subscription_id)
ResourceManagementClientConfiguration(self.azure_credentials, self.subscription_id))
return self._resource_client return self._resource_client
@property @property
def compute_client(self): def compute_client(self):
self.log('Getting compute client') self.log('Getting compute client')
if not self._compute_client: if not self._compute_client:
self._compute_client = ComputeManagementClient( self._compute_client = ComputeManagementClient(self.azure_credentials, self.subscription_id)
ComputeManagementClientConfiguration(self.azure_credentials, self.subscription_id))
self._register('Microsoft.Compute') self._register('Microsoft.Compute')
return self._compute_client return self._compute_client
@ -403,6 +404,7 @@ class AzureInventory(object):
self.resource_groups = [] self.resource_groups = []
self.tags = None self.tags = None
self.locations = None
self.replace_dash_in_groups = False self.replace_dash_in_groups = False
self.group_by_resource_group = True self.group_by_resource_group = True
self.group_by_location = True self.group_by_location = True
@ -425,6 +427,9 @@ class AzureInventory(object):
if self._args.tags: if self._args.tags:
self.tags = self._args.tags.split(',') self.tags = self._args.tags.split(',')
if self._args.locations:
self.locations = self._args.locations.split(',')
if self._args.no_powerstate: if self._args.no_powerstate:
self.include_powerstate = False self.include_powerstate = False
@ -462,6 +467,8 @@ class AzureInventory(object):
help='Return inventory for comma separated list of resource group names') help='Return inventory for comma separated list of resource group names')
parser.add_argument('--tags', action='store', parser.add_argument('--tags', action='store',
help='Return inventory for comma separated list of tag key:value pairs') help='Return inventory for comma separated list of tag key:value pairs')
parser.add_argument('--locations', action='store',
help='Return inventory for comma separated list of locations')
parser.add_argument('--no-powerstate', action='store_true', default=False, parser.add_argument('--no-powerstate', action='store_true', default=False,
help='Do not include the power state of each virtual host') help='Do not include the power state of each virtual host')
return parser.parse_args() return parser.parse_args()
@ -487,7 +494,7 @@ class AzureInventory(object):
except Exception as exc: except Exception as exc:
sys.exit("Error: fetching virtual machines - {0}".format(str(exc))) sys.exit("Error: fetching virtual machines - {0}".format(str(exc)))
if self._args.host or self.tags > 0: if self._args.host or self.tags or self.locations:
selected_machines = self._selected_machines(virtual_machines) selected_machines = self._selected_machines(virtual_machines)
self._load_machines(selected_machines) self._load_machines(selected_machines)
else: else:
@ -524,7 +531,7 @@ class AzureInventory(object):
resource_group=resource_group, resource_group=resource_group,
mac_address=None, mac_address=None,
plan=(machine.plan.name if machine.plan else None), plan=(machine.plan.name if machine.plan else None),
virtual_machine_size=machine.hardware_profile.vm_size.value, virtual_machine_size=machine.hardware_profile.vm_size,
computer_name=machine.os_profile.computer_name, computer_name=machine.os_profile.computer_name,
provisioning_state=machine.provisioning_state, provisioning_state=machine.provisioning_state,
) )
@ -576,7 +583,7 @@ class AzureInventory(object):
host_vars['mac_address'] = network_interface.mac_address host_vars['mac_address'] = network_interface.mac_address
for ip_config in network_interface.ip_configurations: for ip_config in network_interface.ip_configurations:
host_vars['private_ip'] = ip_config.private_ip_address host_vars['private_ip'] = ip_config.private_ip_address
host_vars['private_ip_alloc_method'] = ip_config.private_ip_allocation_method.value host_vars['private_ip_alloc_method'] = ip_config.private_ip_allocation_method
if ip_config.public_ip_address: if ip_config.public_ip_address:
public_ip_reference = self._parse_ref_id(ip_config.public_ip_address.id) public_ip_reference = self._parse_ref_id(ip_config.public_ip_address.id)
public_ip_address = self._network_client.public_ip_addresses.get( public_ip_address = self._network_client.public_ip_addresses.get(
@ -585,7 +592,7 @@ class AzureInventory(object):
host_vars['ansible_host'] = public_ip_address.ip_address host_vars['ansible_host'] = public_ip_address.ip_address
host_vars['public_ip'] = public_ip_address.ip_address host_vars['public_ip'] = public_ip_address.ip_address
host_vars['public_ip_name'] = public_ip_address.name host_vars['public_ip_name'] = public_ip_address.name
host_vars['public_ip_alloc_method'] = public_ip_address.public_ip_allocation_method.value host_vars['public_ip_alloc_method'] = public_ip_address.public_ip_allocation_method
host_vars['public_ip_id'] = public_ip_address.id host_vars['public_ip_id'] = public_ip_address.id
if public_ip_address.dns_settings: if public_ip_address.dns_settings:
host_vars['fqdn'] = public_ip_address.dns_settings.fqdn host_vars['fqdn'] = public_ip_address.dns_settings.fqdn
@ -599,6 +606,8 @@ class AzureInventory(object):
selected_machines.append(machine) selected_machines.append(machine)
if self.tags and self._tags_match(machine.tags, self.tags): if self.tags and self._tags_match(machine.tags, self.tags):
selected_machines.append(machine) selected_machines.append(machine)
if self.locations and machine.location in self.locations:
selected_machines.append(machine)
return selected_machines return selected_machines
def _get_security_groups(self, resource_group): def _get_security_groups(self, resource_group):
@ -676,17 +685,17 @@ class AzureInventory(object):
file_settings = self._load_settings() file_settings = self._load_settings()
if file_settings: if file_settings:
for key in AZURE_CONFIG_SETTINGS: for key in AZURE_CONFIG_SETTINGS:
if key in ('resource_groups', 'tags') and file_settings.get(key, None) is not None: if key in ('resource_groups', 'tags', 'locations') and file_settings.get(key):
values = file_settings.get(key).split(',') values = file_settings.get(key).split(',')
if len(values) > 0: if len(values) > 0:
setattr(self, key, values) setattr(self, key, values)
elif file_settings.get(key, None) is not None: elif file_settings.get(key):
val = self._to_boolean(file_settings[key]) val = self._to_boolean(file_settings[key])
setattr(self, key, val) setattr(self, key, val)
else: else:
env_settings = self._get_env_settings() env_settings = self._get_env_settings()
for key in AZURE_CONFIG_SETTINGS: for key in AZURE_CONFIG_SETTINGS:
if key in('resource_groups', 'tags') and env_settings.get(key, None) is not None: if key in('resource_groups', 'tags', 'locations') and env_settings.get(key):
values = env_settings.get(key).split(',') values = env_settings.get(key).split(',')
if len(values) > 0: if len(values) > 0:
setattr(self, key, values) setattr(self, key, values)
@ -774,11 +783,11 @@ class AzureInventory(object):
def main(): def main():
if not HAS_AZURE: if not HAS_AZURE:
sys.exit("The Azure python sdk is not installed (try 'pip install azure') - {0}".format(HAS_AZURE_EXC)) sys.exit("The Azure python sdk is not installed (try 'pip install azure==2.0.0rc5') - {0}".format(HAS_AZURE_EXC))
if azure_compute_version < AZURE_MIN_VERSION: if LooseVersion(azure_compute_version) != LooseVersion(AZURE_MIN_VERSION):
sys.exit("Expecting azure.mgmt.compute.__version__ to be >= {0}. Found version {1} " sys.exit("Expecting azure.mgmt.compute.__version__ to be {0}. Found version {1} "
"Do you have Azure >= 2.0.0rc2 installed?".format(AZURE_MIN_VERSION, azure_compute_version)) "Do you have Azure == 2.0.0rc5 installed?".format(AZURE_MIN_VERSION, azure_compute_version))
AzureInventory() AzureInventory()

View file

@ -320,6 +320,10 @@ Select hosts for specific tag key by assigning a comma separated list of tag key
* AZURE_TAGS=key1,key2,key3 * AZURE_TAGS=key1,key2,key3
Select hosts for specific locations by assigning a comma separated list of locations to:
* AZURE_LOCATIONS=eastus,eastus2,westus
Or, select hosts for specific tag key:value pairs by assigning a comma separated list key:value pairs to: Or, select hosts for specific tag key:value pairs by assigning a comma separated list key:value pairs to:
* AZURE_TAGS=key1:value1,key2:value2 * AZURE_TAGS=key1:value1,key2:value2
@ -341,6 +345,9 @@ file will contain the following:
# Control which tags are included. Set tags to a comma separated list of keys or key:value pairs # Control which tags are included. Set tags to a comma separated list of keys or key:value pairs
#tags= #tags=
# Control which locations are included. Set locations to a comma separated list of locations.
#locations=
# Include powerstate. If you don't need powerstate information, turning it off improves runtime performance. # Include powerstate. If you don't need powerstate information, turning it off improves runtime performance.
# Valid values: yes, no, true, false, True, False, 0, 1. # Valid values: yes, no, true, false, True, False, 0, 1.
include_powerstate=yes include_powerstate=yes