|
|
|
@ -24,6 +24,7 @@ DOCUMENTATION = '''
|
|
|
|
|
description: Filter results on a specific tag
|
|
|
|
|
type: list
|
|
|
|
|
oauth_token:
|
|
|
|
|
required: True
|
|
|
|
|
description: Scaleway OAuth token.
|
|
|
|
|
env:
|
|
|
|
|
# in order of precedence
|
|
|
|
@ -51,6 +52,7 @@ from ansible.errors import AnsibleError
|
|
|
|
|
from ansible.plugins.inventory import BaseInventoryPlugin
|
|
|
|
|
from ansible.module_utils.scaleway import SCALEWAY_LOCATION
|
|
|
|
|
from ansible.module_utils.urls import open_url
|
|
|
|
|
from ansible.module_utils._text import to_native
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _fetch_information(token, url):
|
|
|
|
@ -58,8 +60,8 @@ def _fetch_information(token, url):
|
|
|
|
|
response = open_url(url,
|
|
|
|
|
headers={'X-Auth-Token': token,
|
|
|
|
|
'Content-type': 'application/json'})
|
|
|
|
|
except Exception:
|
|
|
|
|
raise AnsibleError("Error while fetching %s" % url)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
raise AnsibleError("Error while fetching %s: %s" % (url, to_native(e)))
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
raw_json = json.loads(response.read())
|
|
|
|
@ -79,12 +81,6 @@ def _build_server_url(api_endpoint):
|
|
|
|
|
class InventoryModule(BaseInventoryPlugin):
|
|
|
|
|
NAME = 'scaleway'
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
super(InventoryModule, self).__init__()
|
|
|
|
|
|
|
|
|
|
self.token = None
|
|
|
|
|
self.config_data = None
|
|
|
|
|
|
|
|
|
|
def verify_file(self, path):
|
|
|
|
|
return "scaleway" in path
|
|
|
|
|
|
|
|
|
@ -103,39 +99,34 @@ class InventoryModule(BaseInventoryPlugin):
|
|
|
|
|
self.inventory.set_variable(server_id, "tags", server_info["tags"])
|
|
|
|
|
self.inventory.set_variable(server_id, "ipv4", server_info["public_ip"]["address"])
|
|
|
|
|
|
|
|
|
|
def _get_zones(self):
|
|
|
|
|
config_zones = self.get_option("regions")
|
|
|
|
|
def _get_zones(self, config_zones):
|
|
|
|
|
return set(SCALEWAY_LOCATION.keys()).intersection(config_zones)
|
|
|
|
|
|
|
|
|
|
def _get_tags(self):
|
|
|
|
|
return self.get_option("tags")
|
|
|
|
|
|
|
|
|
|
def match_groups(self, server_info):
|
|
|
|
|
def match_groups(self, server_info, tags):
|
|
|
|
|
server_zone = server_info["location"]["zone_id"]
|
|
|
|
|
server_tags = server_info["tags"]
|
|
|
|
|
|
|
|
|
|
# If no filtering is defined, all tags are valid groups
|
|
|
|
|
if self._get_tags() is None:
|
|
|
|
|
if tags is None:
|
|
|
|
|
return set(server_tags).union((server_zone,))
|
|
|
|
|
|
|
|
|
|
matching_tags = set(server_tags).intersection(self._get_tags())
|
|
|
|
|
matching_tags = set(server_tags).intersection(tags)
|
|
|
|
|
|
|
|
|
|
if not matching_tags:
|
|
|
|
|
return set()
|
|
|
|
|
else:
|
|
|
|
|
return matching_tags.union((server_zone,))
|
|
|
|
|
|
|
|
|
|
def do_zone_inventory(self, zone):
|
|
|
|
|
def do_zone_inventory(self, zone, token, tags):
|
|
|
|
|
self.inventory.add_group(zone)
|
|
|
|
|
zone_info = SCALEWAY_LOCATION[zone]
|
|
|
|
|
|
|
|
|
|
url = _build_server_url(zone_info["api_endpoint"])
|
|
|
|
|
all_servers = _fetch_information(url=url, token=self.token)
|
|
|
|
|
all_servers = _fetch_information(url=url, token=token)
|
|
|
|
|
|
|
|
|
|
for server_info in all_servers:
|
|
|
|
|
|
|
|
|
|
groups = self.match_groups(server_info)
|
|
|
|
|
print(groups)
|
|
|
|
|
groups = self.match_groups(server_info, tags)
|
|
|
|
|
server_id = server_info["id"]
|
|
|
|
|
|
|
|
|
|
for group in groups:
|
|
|
|
@ -145,8 +136,11 @@ class InventoryModule(BaseInventoryPlugin):
|
|
|
|
|
|
|
|
|
|
def parse(self, inventory, loader, path, cache=True):
|
|
|
|
|
super(InventoryModule, self).parse(inventory, loader, path)
|
|
|
|
|
self.config_data = self._read_config_data(path=path)
|
|
|
|
|
self.token = self.get_option("oauth_token")
|
|
|
|
|
self._read_config_data(path=path)
|
|
|
|
|
|
|
|
|
|
config_zones = self.get_option("regions")
|
|
|
|
|
tags = self.get_option("tags")
|
|
|
|
|
token = self.get_option("oauth_token")
|
|
|
|
|
|
|
|
|
|
for zone in self._get_zones():
|
|
|
|
|
self.do_zone_inventory(zone=zone)
|
|
|
|
|
for zone in self._get_zones(config_zones):
|
|
|
|
|
self.do_zone_inventory(zone=zone, token=token, tags=tags)
|
|
|
|
|