1#!/usr/bin/python 2# 3# Copyright (c) 2018 Yuwei Zhou, <yuwzho@microsoft.com> 4# 5# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 6 7from __future__ import absolute_import, division, print_function 8__metaclass__ = type 9 10 11ANSIBLE_METADATA = {'metadata_version': '1.1', 12 'status': ['preview'], 13 'supported_by': 'community'} 14 15DOCUMENTATION = ''' 16--- 17module: azure_rm_aks_info 18 19version_added: "2.9" 20 21short_description: Get Azure Kubernetes Service facts 22 23description: 24 - Get facts for a specific Azure Kubernetes Service or all Azure Kubernetes Services. 25 26options: 27 name: 28 description: 29 - Limit results to a specific resource group. 30 resource_group: 31 description: 32 - The resource group to search for the desired Azure Kubernetes Service 33 tags: 34 description: 35 - Limit results by providing a list of tags. Format tags as 'key' or 'key:value'. 36 show_kubeconfig: 37 description: 38 - Show kubeconfig of the AKS cluster. 39 - Note the operation will cost more network overhead, not recommended when listing AKS. 40 version_added: "2.8" 41 choices: 42 - user 43 - admin 44 45extends_documentation_fragment: 46 - azure 47 48author: 49 - Yuwei Zhou (@yuwzho) 50''' 51 52EXAMPLES = ''' 53 - name: Get facts for one Azure Kubernetes Service 54 azure_rm_aks_info: 55 name: Testing 56 resource_group: myResourceGroup 57 58 - name: Get facts for all Azure Kubernetes Services 59 azure_rm_aks_info: 60 61 - name: Get facts by tags 62 azure_rm_aks_info: 63 tags: 64 - testing 65''' 66 67RETURN = ''' 68azure_aks: 69 description: List of Azure Kubernetes Service dicts. 70 returned: always 71 type: list 72''' 73 74from ansible.module_utils.azure_rm_common import AzureRMModuleBase 75 76try: 77 from msrestazure.azure_exceptions import CloudError 78 from azure.common import AzureHttpError 79except Exception: 80 # handled in azure_rm_common 81 pass 82 83AZURE_OBJECT_CLASS = 'managedClusters' 84 85 86class AzureRMManagedClusterInfo(AzureRMModuleBase): 87 """Utility class to get Azure Kubernetes Service facts""" 88 89 def __init__(self): 90 91 self.module_args = dict( 92 name=dict(type='str'), 93 resource_group=dict(type='str'), 94 tags=dict(type='list'), 95 show_kubeconfig=dict(type='str', choices=['user', 'admin']), 96 ) 97 98 self.results = dict( 99 changed=False, 100 aks=[], 101 available_versions=[] 102 ) 103 104 self.name = None 105 self.resource_group = None 106 self.tags = None 107 self.show_kubeconfig = None 108 109 super(AzureRMManagedClusterInfo, self).__init__( 110 derived_arg_spec=self.module_args, 111 supports_tags=False, 112 facts_module=True 113 ) 114 115 def exec_module(self, **kwargs): 116 117 is_old_facts = self.module._name == 'azure_rm_aks_facts' 118 if is_old_facts: 119 self.module.deprecate("The 'azure_rm_aks_facts' module has been renamed to 'azure_rm_aks_info'", version='2.13') 120 121 for key in self.module_args: 122 setattr(self, key, kwargs[key]) 123 124 self.results['aks'] = ( 125 self.get_item() if self.name 126 else self.list_items() 127 ) 128 129 return self.results 130 131 def get_item(self): 132 """Get a single Azure Kubernetes Service""" 133 134 self.log('Get properties for {0}'.format(self.name)) 135 136 item = None 137 result = [] 138 139 try: 140 item = self.managedcluster_client.managed_clusters.get(self.resource_group, self.name) 141 except CloudError: 142 pass 143 144 if item and self.has_tags(item.tags, self.tags): 145 result = [self.serialize_obj(item, AZURE_OBJECT_CLASS)] 146 if self.show_kubeconfig: 147 result[0]['kube_config'] = self.get_aks_kubeconfig(self.resource_group, self.name) 148 149 return result 150 151 def list_items(self): 152 """Get all Azure Kubernetes Services""" 153 154 self.log('List all Azure Kubernetes Services') 155 156 try: 157 response = self.managedcluster_client.managed_clusters.list(self.resource_group) 158 except AzureHttpError as exc: 159 self.fail('Failed to list all items - {0}'.format(str(exc))) 160 161 results = [] 162 for item in response: 163 if self.has_tags(item.tags, self.tags): 164 item_dict = self.serialize_obj(item, AZURE_OBJECT_CLASS) 165 if self.show_kubeconfig: 166 item_dict['kube_config'] = self.get_aks_kubeconfig(self.resource_group, item.name) 167 results.append(item_dict) 168 169 return results 170 171 def get_aks_kubeconfig(self, resource_group, name): 172 ''' 173 Gets kubeconfig for the specified AKS instance. 174 175 :return: AKS instance kubeconfig 176 ''' 177 if not self.show_kubeconfig: 178 return '' 179 role_name = 'cluster{0}'.format(str.capitalize(self.show_kubeconfig)) 180 access_profile = self.managedcluster_client.managed_clusters.get_access_profile(resource_group, name, role_name) 181 return access_profile.kube_config.decode('utf-8') 182 183 184def main(): 185 """Main module execution code path""" 186 187 AzureRMManagedClusterInfo() 188 189 190if __name__ == '__main__': 191 main() 192