From dd2fca15f3c10c8c4bb6d0b7fec9e85fe25fcf04 Mon Sep 17 00:00:00 2001 From: sskarimov Date: Wed, 13 Nov 2024 11:51:38 +0300 Subject: [PATCH] 6.0.0 --- CHANGELOG.md | 107 +- README.md | 13 +- library/decort_account.py | 25 + library/decort_account_info.py | 7 +- library/decort_bservice.py | 15 +- library/decort_disk.py | 75 +- library/decort_group.py | 76 +- library/decort_k8s.py | 107 +- library/decort_kvmvm.py | 236 +- library/decort_lb.py | 13 +- library/decort_osimage.py | 32 +- library/decort_pfw.py | 6 +- library/decort_rg.py | 123 +- library/decort_user_info.py | 21 +- module_utils/decort_utils.py | 974 ++--- wiki/6.0.0/Home.md | 23 + wiki/6.0.0/введение.md | 181 + wiki/6.0.0/модуль-decort_account.md | 992 +++++ .../6.0.0/модуль-decort_account_info.md | 3805 +++++++++++++++++ wiki/6.0.0/модуль-decort_bservice.md | 92 + wiki/6.0.0/модуль-decort_disk.md | 177 + wiki/6.0.0/модуль-decort_group.md | 105 + wiki/6.0.0/модуль-decort_jwt.md | 53 + wiki/6.0.0/модуль-decort_k8s.md | 108 + wiki/6.0.0/модуль-decort_kvmvm.md | 109 + wiki/6.0.0/модуль-decort_lb.md | 893 ++++ wiki/6.0.0/модуль-decort_osimage.md | 131 + wiki/6.0.0/модуль-decort_pfw.md | 76 + wiki/6.0.0/модуль-decort_rg.md | 229 + wiki/6.0.0/модуль-decort_user_info.md | 1338 ++++++ wiki/6.0.0/модуль-decort_vins.md | 120 + wiki/Home.md | 1 + 32 files changed, 9544 insertions(+), 719 deletions(-) create mode 100644 wiki/6.0.0/Home.md create mode 100644 wiki/6.0.0/введение.md create mode 100644 wiki/6.0.0/модуль-decort_account.md create mode 100644 wiki/6.0.0/модуль-decort_account_info.md create mode 100644 wiki/6.0.0/модуль-decort_bservice.md create mode 100644 wiki/6.0.0/модуль-decort_disk.md create mode 100644 wiki/6.0.0/модуль-decort_group.md create mode 100644 wiki/6.0.0/модуль-decort_jwt.md create mode 100644 wiki/6.0.0/модуль-decort_k8s.md create mode 100644 wiki/6.0.0/модуль-decort_kvmvm.md create mode 100644 wiki/6.0.0/модуль-decort_lb.md create mode 100644 wiki/6.0.0/модуль-decort_osimage.md create mode 100644 wiki/6.0.0/модуль-decort_pfw.md create mode 100644 wiki/6.0.0/модуль-decort_rg.md create mode 100644 wiki/6.0.0/модуль-decort_user_info.md create mode 100644 wiki/6.0.0/модуль-decort_vins.md diff --git a/CHANGELOG.md b/CHANGELOG.md index e7f7b9e..7ba57b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,114 @@ -# Список изменений в версии 5.6.0 +# Список изменений в версии 6.0.0 ## Обновления +### Модуль decort_user_info +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-515 | Фильтрация аудитов по коду ответа происходит в фильтре `status_code`, принимающем параметры `min` и `max`. | + +### Модуль decort_account_info +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-554 | Удалён подпараметр `images.deleted`. | + +### Модуль decort_kvmvm +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-573 | Удалён параметр `arch`. | +| BANS-581 |Добавлен параметр `chipset` для указания чипсета при создании виртуальной машины. | +| BANS-528 | Добавлен тип сети `VFNIC`. | +| BANS-586 | Добавлен параметр `network_order_changing`, позволяющий включить соблюдение очерёдности сетей при их изменении. | +| BANS-522 | Добавлен тип сети `EMPTY`. | +| BANS-592 | Добавлен тип сети `DPDK`. | +| BANS-11 | Добавлена возможность создать виртуальную машину без образа. | +| BANS-12 | Добавлена возможность переименования виртуальной машины. | +| BANS-596 | Добавлена возможность изменения IP-адреса ВМ во внутренней/внешней сети без переподключения сети. | + +### Модуль decort_osimage +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-573 | Удалён параметр `architecture`. | + +### Модуль decort_rg +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-507 | Добавлена возможность удаления сети по умолчанию. | +| BANS-509 | Добавлен параметр `sep_pools` для указания доступных пулов СХД. | +| BANS-7 | Добавлен параметр `recursive_deletion` для удаления непустой РГ. | + +### Модуль decort_account +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-508 | Добавлен параметр `sep_pools` для указания доступных пулов СХД. | + +## Исправления + ### Глобальные +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-511 | При ошибке HTTP-подключения в некоторых случаях работа модуля завершалась ошибкой Python. | + +### Модуль decort_bservice +| Идентификатор
задачи | Описание | +|-------------------------| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| BANS-549 | Модуль требовал параметр `name` вместе с параметром `id`.
Исправлено завершение работы модуля с ошибкой Python при отсутствии параметра `rg_id` при заданном параметре `id`. | + +### Модуль decort_kvmvm | Идентификатор
задачи | Описание | | --- | --- | -| BANS-111 | Реализовано информативное сообщение при ошибке SSL. | +| BANS-550 | Отсутствие параметров `cpu` и/или `ram` при заданном параметре `id` вызывало завершение работы модуля **decort_kvmvm** с ошибкой Python. | +| BANS-588 | Исправлена ошибка, при которой модуль производил изменения при незаданных параметрах `data_disks`, `networks`, `tag`, `affinity_label`, `aff_rule`, `aaff_rule`. | -### Модуль decort_user_info +### Модуль decort_disk +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-534 | Исправлена ошибка получения данных о привязке диска к виртуальной машине. | +| BANS-557 | Модуль требовал параметр `account_id` или `account_name` при заданном параметре `id`. | +| BANS-558 | Модуль пытался произвести `rename` и `resize` при отсутствующих параметрах `name` и `size` | + +### Модуль decort_group +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-560 | Модуль требовал параметр `name` при заданном параметре `id`. | +| BANS-561 | Модуль всегда требовал параметр `count`. | +| BANS-562 | Модуль производил обновление сетей при незаданном параметре `networks`. | +| BANS-563 | Модуль производил вызов API `cloudapi/bservice/groupUpdate` при незаданных параметрах. | +| BANS-564 | Модуль завершал свою работу с ошибкой Python если не заданы все необходимые параметры при создании группы. | + +### Модуль decort_osimage +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-566 | Модуль не удалял шаблонный образ без указания идентификатора аккаунта. | +| BANS-567 | Модуль завершал свою работу с ошибкой запроса к API при попытке удалить несуществующий или уже удалённый образ. | +| BANS-568 | Модуль завершал свою работу ошибкой запроса к API при заданном параметре `virt_id` и незаданном параметре `image_id`. | + +### Модуль decort_lb +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-569 | Модуль требовал параметр `lb_name` при заданном параметре `lb_id`. | +| BANS-570 | Модуль завершал работу с ошибкой запроса к API при заданных параметрах `lb_name` и `rg_id` существующего балансировщика. | +| BANS-571 | Модуль удалял конфигурации backend и frontend у существующего балансировщика при незаданных параметрах `backends`, `servers`, `frontends`. | + +### Модуль decort_k8s +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-198 | Модуль завершал свою работу с ошибкой Python при отсутствии необязательных подпараметров `workers.sep_id` и `workers.pool`. | +| BANS-576 | Модуль требовал необязательные параметры при заданном параметре `id`. | +| BANS-578 | Модуль требовал необязательные параметры для изменения группы worker-узлов. | + +### Модуль decort_rg +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-546 | Модуль требовал параметр `account_id` или `account_name` при заданном параметре `rg_id`. | + +### Модуль decort_account_info +| Идентификатор
задачи | Описание | +| --- | --- | +| BANS-547 | Модуль ожидал тип `int` для параметра `ext_ip` вместо типа `str`. | +### Модуль decort_pfw | Идентификатор
задачи | Описание | | --- | --- | -| BANS-487
BANS-489
BANS-490
BANS-491
BANS-493
BANS-494
BANS-499
BANS-500 | Добавлен новый модуль **decort_user_info**, который позволяет получить следующую информацию о пользователе:
• основная информация
• доступные аккаунты
• используемые и зарезервированные ресурсы
• аудиты
• доступные методы API
• поиск доступных объектов по строке | +| BANS-577 | Модуль удаляет правила переадресации портов при незаданном параметре `rules`. | diff --git a/README.md b/README.md index ed406bb..0446b33 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,13 @@ ## Соответствие версий платформы версиям модулей Ansible -| Версия платформы | Версия модулей Ansible | -| :---: | :---: | -| 4.0.0 | 5.6.x, 5.5.x, 5.4.x, 5.3.x | -| 3.8.8, 3.8.9 | 5.2.6 | -| 3.8.7 | 5.2.5 | -| 3.8.6 | 5.2.4 | +| Версия платформы | Версия модулей Ansible | +|:----------------:|:--------------------------:| +| 4.1.0 | 6.0.x | +| 4.0.0 | 5.6.x, 5.5.x, 5.4.x, 5.3.x | +| 3.8.8, 3.8.9 | 5.2.6 | +| 3.8.7 | 5.2.5 | +| 3.8.6 | 5.2.4 | ## Ссылки diff --git a/library/decort_account.py b/library/decort_account.py index 3a64bbd..a7796cb 100644 --- a/library/decort_account.py +++ b/library/decort_account.py @@ -107,6 +107,21 @@ class DecortAccount(DecortController): ], default='present', ), + sep_pools=dict( + type='list', + elements='dict', + options=dict( + sep_id=dict( + type='int', + required=True, + ), + pool_names=dict( + type='list', + required=True, + elements='str', + ), + ), + ), ), required_one_of=[ ('id', 'name') @@ -344,6 +359,16 @@ class DecortAccount(DecortController): and current_value != aparam_quotas[aparam]): result_args[result_arg] = aparam_quotas[aparam] + aparam_sep_pools = self.aparams['sep_pools'] + if aparam_sep_pools is not None: + sep_pools = set() + for sep in aparam_sep_pools: + for pool_name in sep['pool_names']: + sep_pools.add( + f'{sep["sep_id"]}_{pool_name}' + ) + if set(self.facts['uniqPools']) != sep_pools: + result_args['sep_pools'] = sep_pools return result_args diff --git a/library/decort_account_info.py b/library/decort_account_info.py index a153624..b39b1a9 100644 --- a/library/decort_account_info.py +++ b/library/decort_account_info.py @@ -195,10 +195,6 @@ class DecortAccountInfo(DecortController): images=dict( type='dict', options=dict( - deleted=dict( - type='bool', - default=False, - ), filter=dict( type='dict', options=dict( @@ -312,7 +308,7 @@ class DecortAccountInfo(DecortController): type='dict', options=dict( ext_ip=dict( - type='int', + type='str', ), id=dict( type='int', @@ -478,7 +474,6 @@ class DecortAccountInfo(DecortController): return input_args mapped_args = {} - mapped_args['deleted'] = input_args['deleted'] if input_args['filter']: mapped_args['image_id'] = input_args['filter']['id'] mapped_args['image_name'] = input_args['filter']['name'] diff --git a/library/decort_bservice.py b/library/decort_bservice.py index a7b3ab7..da4bb71 100644 --- a/library/decort_bservice.py +++ b/library/decort_bservice.py @@ -23,7 +23,6 @@ class decort_bservice(DecortController): validated_acc_id = 0 validated_rg_id = 0 - validated_rg_facts = None self.bservice_info = None if arg_amodule.params['name'] == "" and arg_amodule.params['id'] == 0: self.result['failed'] = True @@ -55,12 +54,12 @@ class decort_bservice(DecortController): arg_amodule.params['rg_name']) self.fail_json(**self.result) - arg_amodule.params['rg_id'] = validated_rg_id - arg_amodule.params['rg_name'] = validated_rg_facts['name'] - self.acc_id = validated_rg_facts['accountId'] + arg_amodule.params['rg_id'] = validated_rg_id + arg_amodule.params['rg_name'] = validated_rg_facts['name'] + validated_acc_id = validated_rg_facts['accountId'] - self.bservice_id,self.bservice_info = self.bservice_find( - self.acc_id, + self.bservice_id, self.bservice_info = self.bservice_find( + validated_acc_id, validated_rg_id, arg_amodule.params['name'], arg_amodule.params['id'] @@ -150,7 +149,7 @@ class decort_bservice(DecortController): ret_dict['techStatus'] = self.bservice_info['techStatus'] ret_dict['state'] = self.bservice_info['status'] ret_dict['rg_id'] = self.bservice_info['rgId'] - ret_dict['account_id'] = self.acc_id + ret_dict['account_id'] = self.bservice_info['accountId'] ret_dict['groups'] = self.bservice_info['groups'] return ret_dict @staticmethod @@ -188,7 +187,7 @@ class decort_bservice(DecortController): user=dict(type='str', required=False, fallback=(env_fallback, ['DECORT_USER'])), - name=dict(type='str', required=True), + name=dict(type='str', required=False, default=''), sshuser=dict(type='str', required=False,default=None), sshkey=dict(type='str', required=False,default=None), id=dict(type='int', required=False, default=0), diff --git a/library/decort_disk.py b/library/decort_disk.py index b4d4078..5df1870 100644 --- a/library/decort_disk.py +++ b/library/decort_disk.py @@ -240,7 +240,7 @@ facts: pool: datastore state: ASSIGNED account_id: 7 - attached_to: 18 + computes: {vm_id: vm_name} gid: 1001 ''' @@ -257,39 +257,45 @@ class decort_disk(DecortController): validated_acc_id = 0 validated_acc_info = None - validated_disk_id = 0 self.disk_id = 0 self.account_id = 0 - validated_disk_facts = None # limitIO check for exclusive parameters if arg_amodule.params['limitIO']: self.disk_check_iotune_arg(arg_amodule.params['limitIO']) - - if arg_amodule.params['id'] or arg_amodule.params['name']: - if arg_amodule.params['account_id'] or arg_amodule.params['account_name'] : - validated_acc_id,validated_acc_info = self.account_find(arg_amodule.params['account_name'],arg_amodule.params['account_id']) + if not arg_amodule.params['id']: + if ( + not arg_amodule.params['account_id'] + and not arg_amodule.params['account_name'] + ): + self.result['changed'] = False + self.result['msg'] = ( + 'Cannot manage Disk by name without specifying account ID ' + 'or name.' + ) + self.amodule.fail_json(**self.result) + validated_acc_id, validated_acc_info = self.account_find( + arg_amodule.params['account_name'], + arg_amodule.params['account_id']) if not validated_acc_id: - self.result['failed'] = True - self.result['changed'] = False - self.result['msg'] = ("Current user does not have access to the account ID {} / " - "name '{}' or non-existent account specified.").format(arg_amodule.params['account_id'], - arg_amodule.params['account_name']) - self.amodule.fail_json(**self.result) - else: - self.acc_id = validated_acc_id - self.acc_info = validated_acc_info - validated_disk_id,validated_disk_facts = self.disk_find( - disk_id=arg_amodule.params['id'], - name=arg_amodule.params['name'] if "name" in arg_amodule.params else "", - account_id=self.acc_id, - check_state=False, + self.result['changed'] = False + self.result['msg'] = ( + f"Current user does not have access to the account " + f"ID {arg_amodule.params['account_id']} / " + f"name '{arg_amodule.params['account_name']}' " + f"or non-existent account specified." ) - else: - self.result['failed'] = True - self.result['msg'] = ("Cannot manage Disk when its ID is 0 and name is empty") - self.amodule.fail_json(**self.result) + self.amodule.fail_json(**self.result) + + self.acc_id = validated_acc_id + self.acc_info = validated_acc_info + validated_disk_id, validated_disk_facts = self.disk_find( + disk_id=arg_amodule.params['id'], + name=arg_amodule.params['name'] if "name" in arg_amodule.params else "", + account_id=self.acc_id, + check_state=False, + ) if arg_amodule.params['place_with']: image_id, image_facts = self.image_find(arg_amodule.params['place_with'], "", 0) @@ -324,12 +330,17 @@ class decort_disk(DecortController): if restore: self.disk_restore(self.disk_id) #rename if id present - if self.amodule.params['name'] != self.disk_info['name']: + if ( + self.amodule.params['name'] is not None + and self.amodule.params['name'] != self.disk_info['name'] + ): self.disk_rename(disk_id=self.disk_id, name=self.amodule.params['name']) - self.disk_info['name'] = self.amodule.params['name'] #resize - if self.amodule.params['size'] != self.disk_info['sizeMax']: + if ( + self.amodule.params['size'] is not None + and self.amodule.params['size'] != self.disk_info['sizeMax'] + ): self.disk_resize(self.disk_info,self.amodule.params['size']) #IO TUNE if self.amodule.params['limitIO']: @@ -381,7 +392,6 @@ class decort_disk(DecortController): account_id=0, sep_id=0, pool="none", - attached_to=0, gid=0 ) @@ -399,7 +409,7 @@ class decort_disk(DecortController): ret_dict['account_id'] = self.disk_info['accountId'] ret_dict['sep_id'] = self.disk_info['sepId'] ret_dict['pool'] = self.disk_info['pool'] - ret_dict['attached_to'] = self.disk_info['vmid'] + ret_dict['computes'] = self.disk_info['computes'] ret_dict['gid'] = self.disk_info['gid'] ret_dict['iotune'] = self.disk_info['iotune'] @@ -441,7 +451,7 @@ class decort_disk(DecortController): place_with=dict(type='int', default=0), pool=dict(type='str', default=''), sep_id=dict(type='int', default=0), - size=dict(type='int', default=0), + size=dict(type='int'), type=dict(type='str', required=False, default="D", @@ -490,6 +500,9 @@ def main(): ['app_id', 'app_secret'], ['user', 'password'], ], + required_one_of=[ + ['id', 'name'], + ], ) decon = decort_disk(amodule) diff --git a/library/decort_group.py b/library/decort_group.py index 9c29ff8..71d1c07 100644 --- a/library/decort_group.py +++ b/library/decort_group.py @@ -77,13 +77,6 @@ class decort_group(DecortController): return def create(self): - - if self.amodule.params['driver'] not in ["KVM_X86","KVM_PPC"]: - self.result['failed'] = True - self.result['msg'] = ("Unsupported driver '{}' is specified for " - "Group.").format(self.amodule.params['driver']) - self.amodule.fail_json(**self.result) - self.group_id=self.group_provision( self.bservice_id, self.amodule.params['name'], @@ -109,22 +102,40 @@ class decort_group(DecortController): self.group_info['techStatus'] == 'STOPPED' and self.amodule.params['state'] in ('started','present') ): self.group_state(self.bservice_id,self.group_id,self.amodule.params['state']) - self.group_resize_count(self.bservice_id,self.group_info,self.amodule.params['count']) - self.group_update_hw( - self.bservice_id, - self.group_info, - self.amodule.params['cpu'], - self.amodule.params['boot_disk'], - self.amodule.params['name'], - self.amodule.params['role'], - self.amodule.params['ram'], - ) - self.group_update_net( - self.bservice_id, - self.group_info, - self.amodule.params['networks'] - ) - return + + if self.aparams['count'] != None: + self.group_resize_count( + bs_id=self.bservice_id, + gr_dict=self.group_info, + desired_count=self.aparams['count'], + ) + + for aparam_name, info_key in {'cpu': 'cpu', + 'boot_disk': 'disk', + 'role': 'role', + 'ram': 'ram', + 'name': 'name', + }.items(): + aparam_value = self.aparams[aparam_name] + group_info_value = self.group_info[info_key] + if aparam_value != None and aparam_value != group_info_value: + self.group_update( + bs_id=self.bservice_id, + gr_dict=self.group_info, + arg_cpu=self.aparams['cpu'], + arg_disk=self.aparams['boot_disk'], + arg_name=self.aparams['name'], + arg_role=self.aparams['role'], + arg_ram=self.aparams['ram'], + ) + break + + if self.aparams['networks'] != None: + self.group_update_net( + bs_id=self.bservice_id, + gr_dict=self.group_info, + arg_net=self.aparams['networks'], + ) def destroy(self): @@ -198,20 +209,20 @@ class decort_group(DecortController): user=dict(type='str', required=False, fallback=(env_fallback, ['DECORT_USER'])), - name=dict(type='str', required=True), - id=dict(type='int', required=False, default=0), + name=dict(type='str'), + id=dict(type='int', required=False), image_id=dict(type='int', required=False), image_name=dict(type='str', required=False), - driver=dict(type='str', required=False,default="KVM_X86"), + driver=dict(type='str', required=False, choices=['KVM_X86', 'SVA_KVM_X86'], default="KVM_X86"), boot_disk=dict(type='int', required=False), bservice_id=dict(type='int', required=True), - count=dict(type='int', required=True), + count=dict(type='int'), timeoutStart=dict(type='int', required=False), - role=dict(type='str', required=False, default=''), + role=dict(type='str', required=False), cpu=dict(type='int', required=False), ram=dict(type='int', required=False), networks=dict( - type='list', default=[], elements='dict', + type='list', elements='dict', options=dict( type=dict( type='str', @@ -244,6 +255,13 @@ def main(): ], required_one_of=[ ['id', 'name'], + ['id', 'networks'], + ['id', 'count'], + ['id', 'cpu'], + ['id', 'ram'], + ['id', 'boot_disk'], + ['id', 'image_id'], + ['id', 'driver'], ], ) diff --git a/library/decort_k8s.py b/library/decort_k8s.py index 27d92e9..9c5fe2b 100644 --- a/library/decort_k8s.py +++ b/library/decort_k8s.py @@ -63,6 +63,7 @@ EXAMPLES = ''' - node.mainapp.domen.local/group1=g1 register: some_cluster ''' + from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import env_fallback from ansible.module_utils.decort_utils import * @@ -76,20 +77,14 @@ class decort_k8s(DecortController): validated_rg_facts = None validated_k8ci_id = 0 self.k8s_should_exist = False - if not arg_amodule.params['workers']: - self.result['failed'] = True - self.result['changed'] = False - self.result['msg'] = "At least one worker group must be present" - self.amodule.fail_json(**self.result) - if arg_amodule.params['name'] == "" and arg_amodule.params['id'] == 0: + if arg_amodule.params['name'] == "" and arg_amodule.params['id'] is None: self.result['failed'] = True self.result['changed'] = False self.result['msg'] = "Cannot manage k8s cluster when its ID is 0 and name is empty." self.amodule.fail_json(**self.result) - - if not arg_amodule.params['id']: + if arg_amodule.params['id'] is None: if not arg_amodule.params['rg_id']: # RG ID is not set -> locate RG by name -> need account ID validated_acc_id, _ = self.account_find(arg_amodule.params['account_name'], arg_amodule.params['account_id']) @@ -114,10 +109,23 @@ class decort_k8s(DecortController): arg_amodule.params['rg_name']) self.amodule.fail_json(**self.result) # fail the module - exit - - #validate k8ci ID + self.rg_id = validated_rg_id + arg_amodule.params['rg_id'] = validated_rg_id + arg_amodule.params['rg_name'] = validated_rg_facts['name'] + self.acc_id = validated_rg_facts['accountId'] + self.k8s_id,self.k8s_info = self.k8s_find(k8s_id=arg_amodule.params['id'], + k8s_name=arg_amodule.params['name'], + rg_id=validated_rg_id, + check_state=False) + + if self.k8s_id: + self.k8s_should_exist = True + self.acc_id = self.k8s_info['accountId'] + # check workers and groups for add or remove? + + if not self.k8s_id: validated_k8ci_id = self.k8s_k8ci_find(arg_amodule.params['k8ci_id']) if not validated_k8ci_id: self.result['failed'] = True @@ -125,22 +133,12 @@ class decort_k8s(DecortController): self.result['msg'] = "Cannot find K8CI ID {}.".format(arg_amodule.params['k8ci_id']) self.amodule.fail_json(**self.result) - self.rg_id = validated_rg_id - arg_amodule.params['rg_id'] = validated_rg_id - arg_amodule.params['rg_name'] = validated_rg_facts['name'] - self.acc_id = validated_rg_facts['accountId'] - arg_amodule.params['k8ci_id'] = validated_k8ci_id + if not arg_amodule.params['workers']: + self.result['failed'] = True + self.result['changed'] = False + self.result['msg'] = "At least one worker group must be present" + self.amodule.fail_json(**self.result) - self.k8s_id,self.k8s_info = self.k8s_find(k8s_id=arg_amodule.params['id'], - k8s_name=arg_amodule.params['name'], - rg_id=validated_rg_id, - check_state=False) - - if self.k8s_id: - self.k8s_should_exist = True - self.acc_id = self.k8s_info['accountId'] - # check workers and groups for add or remove? - return def package_facts(self,check_mode=False): @@ -169,7 +167,7 @@ class decort_k8s(DecortController): ret_dict['name'] = self.k8s_info['name'] ret_dict['techStatus'] = self.k8s_info['techStatus'] ret_dict['state'] = self.k8s_info['status'] - ret_dict['rg_id'] = self.rg_id + ret_dict['rg_id'] = self.k8s_info['rgId'] ret_dict['vins_id'] = self.k8s_vins_id ret_dict['account_id'] = self.acc_id ret_dict['k8s_Masters'] = self.k8s_info['k8sGroups']['masters'] @@ -266,15 +264,13 @@ class decort_k8s(DecortController): self.k8s_info = self.k8s_get_by_id(k8s_id=self.k8s_id) #k8s state self.k8s_state(self.k8s_info, disared_state, started) - self.k8s_id,self.k8s_info = self.k8s_find(k8s_id=self.amodule.params['id'], - k8s_name=self.amodule.params['name'], - rg_id=self.rg_id, - check_state=False) + self.k8s_info = self.k8s_get_by_id(k8s_id=self.k8s_id) if started == True and self.k8s_info['techStatus'] == "STOPPED": self.k8s_state(self.k8s_info, disared_state,started) self.k8s_info['techStatus'] == "STARTED" #check groups and modify if needed - self.k8s_workers_modify(self.k8s_info,self.amodule.params['workers']) + if self.aparams['workers'] is not None: + self.k8s_workers_modify(self.k8s_info, self.aparams['workers']) if self.result['changed'] == True: self.k8s_info = self.k8s_get_by_id(k8s_id=self.k8s_id) #TODO check workers metadata and modify if needed @@ -319,12 +315,12 @@ class decort_k8s(DecortController): required=False, fallback=(env_fallback, ['DECORT_USER'])), name=dict(type='str', required=False, default=""), - id=dict(type='int', required=False, default=0), + id=dict(type='int', required=False), getConfig=dict(type='bool',required=False, default=False), rg_id=dict(type='int', default=0), rg_name=dict(type='str',default=""), vins_id=dict(type='int', required=False,default=None), - k8ci_id=dict(type='int', required=True), + k8ci_id=dict(type='int'), network_plugin=dict(type='str',required=False,default="flannel"), master_count=dict(type='int', default=1), master_cpu=dict(type='int', default=2), @@ -332,7 +328,49 @@ class decort_k8s(DecortController): master_disk=dict(type='int', default=10), master_sepid=dict(type='int', required=False, default=None), master_pool=dict(type='str', required=False, default=None), - workers=dict(type='list',required=True), + workers=dict( + type='list', + elements='dict', + options=dict( + name=dict( + type='str', + required=True, + ), + num=dict( + type='int', + ), + cpu=dict( + type='int', + ), + ram=dict( + type='int', + ), + disk=dict( + type='int', + ), + sep_id=dict( + type='int', + ), + pool=dict( + type='str', + ), + annotations=dict( + type='list', + elements='str', + ), + ci_user_data=dict( + type='dict', + ), + labels=dict( + type='list', + elements='str', + ), + taints=dict( + type='list', + elements='str', + ), + ), + ), workers_metadata=dict(type='bool',required=False,default=False), extnet_id=dict(type='int', default=0), description=dict(type='str', default="Created by decort ansible module"), @@ -366,7 +404,6 @@ def main(): ], required_one_of=[ ['id', 'name'], - ['rg_id','rg_name'] ], ) diff --git a/library/decort_kvmvm.py b/library/decort_kvmvm.py index a0be17a..29ab6b3 100644 --- a/library/decort_kvmvm.py +++ b/library/decort_kvmvm.py @@ -69,11 +69,11 @@ options: required: no arch: description: - - Architecture of the KVM VM. DECORT supports KVM hosts based on Intel x86 and IBM PowerPC hardware. + - Architecture of the KVM VM. DECORT supports KVM hosts based on Intel x86. - This parameter is used when new KVM VM is created and ignored for all other operations. - Module may fail if your DECORT installation does not have physical nodes of specified architecture. default: X86_64 - choices: [ X86_64, PPC64_LE ] + choices: [ X86_64 ] required: yes authenticator: description: @@ -355,6 +355,8 @@ class decort_kvmvm(DecortController): # call superclass constructor first super(decort_kvmvm, self).__init__(arg_amodule) + self.check_amodule_args() + self.comp_should_exist = False # This following flag is used to avoid extra (and unnecessary) get of compute details prior to # packaging facts before the module completes. As "" @@ -415,19 +417,59 @@ class decort_kvmvm(DecortController): check_state=False) if self.comp_id: - if self.comp_info['status'] != 'DESTROYED' and self.comp_info['arch'] not in ["X86_64", "PPC64_LE"]: - # If we found a Compute in a non-DESTROYED state and it is not of type valid arch, abort the module - self.result['failed'] = True - self.result['msg'] = ("Compute ID {} architecture '{}' is not supported by " - "decort_kvmvm module.").format(self.comp_id, - self.amodule.params['arch']) - self.amodule.fail_json(**self.result) - # fail the module - exit self.comp_should_exist = True self.acc_id = self.comp_info['accountId'] return + def check_amodule_args(self): + """ + Additional Ansible Module arguments validation that + cannot be implemented using Ansible Argument spec. + """ + + # Check parameter "networks" for DPDK type + aparam_nets = self.aparams['networks'] + if aparam_nets: + net_types = {net['type'] for net in aparam_nets} + DPDK = 'DPDK' + if DPDK in net_types and not net_types.issubset({'DPDK', 'EMPTY'}): + self.message( + 'Check for parameter "networks" failed: a compute cannot' + ' be connected to a DPDK network and a network of another' + ' type at the same time.' + ) + self.exit(fail=True) + + # Check for unacceptable parameters for a blank Compute + if ( + self.aparams['image_id'] is None + and self.aparams['image_name'] is None + ): + for parameter in ( + 'ssh_key', + 'ssh_key_user', + 'ci_user_data', + ): + if self.aparams[parameter] is not None: + self.message( + f'Check for parameter "{parameter}" failed: ' + f'"image_id" or "image_name" must be specified ' + f'to set {parameter}.' + ) + self.exit(fail=True) + + if ( + self.aparams['sep_id'] is not None + and self.aparams['boot_disk'] is None + ): + self.message( + 'Check for parameter "sep_id" failed: ' + '"image_id" or "image_name" or "boot_disk" ' + 'must be specified to set sep_id.' + ) + self.exit(fail=True) + def nop(self): """No operation (NOP) handler for Compute management by decort_kvmvm module. This function is intended to be called from the main switch construct of the module @@ -475,42 +517,45 @@ class decort_kvmvm(DecortController): # each of the following calls will abort if argument is missing self.check_amodule_argument('cpu') self.check_amodule_argument('ram') + validated_bdisk_size = self.amodule.params['boot_disk'] or 0 - if self.amodule.params['arch'] not in ["X86_64", "PPC64_LE"]: - self.result['failed'] = True - self.result['msg'] = ("Unsupported architecture '{}' is specified for " - "KVM VM create.").format(self.amodule.params['arch']) - self.amodule.fail_json(**self.result) - # fail the module - exit - - validated_bdisk_size = 0 - - image_facts = None - # either image_name or image_id must be present - if self.check_amodule_argument('image_id', abort=False) and self.amodule.params['image_id'] > 0 : - # find image by image ID and account ID - # image_find(self, image_id, image_name, account_id, rg_id=0, sepid=0, pool=""): - _, image_facts = self.image_find(image_id=self.amodule.params['image_id'], - image_name="", - account_id=self.acc_id) - elif self.check_amodule_argument('image_name', abort=False) and self.amodule.params['image_name'] != "": - # find image by image name and account ID - _, image_facts = self.image_find(image_id=0, - image_name=self.amodule.params['image_name'], - account_id=self.acc_id) + image_id, image_facts = None, None + if ( + self.amodule.params['image_id'] is None + and self.amodule.params['image_name'] is None + ): + if self.amodule.params['state'] not in ('poweredoff', 'halted'): + self.result['msg'] = ( + '"state" parameter for a blank Compute must be either ' + '"poweredoff" or "halted".' + ) + self.exit(fail=True) else: - # neither image_name nor image_id are set - abort the script - self.result['failed'] = True - self.result['msg'] = "Missing both 'image_name' and 'image_id'. You need to specify one to create a Compute." - self.amodule.fail_json(**self.result) - # fail the module - exit + # either image_name or image_id must be present + if ( + self.check_amodule_argument('image_id', abort=False) + and self.amodule.params['image_id'] > 0 + ): + # find image by image ID and account ID + # image_find(self, image_id, image_name, account_id, rg_id=0, sepid=0, pool=""): + image_id, image_facts = self.image_find( + image_id=self.amodule.params['image_id'], + image_name="", + account_id=self.acc_id) + elif ( + self.check_amodule_argument('image_name', abort=False) + and self.amodule.params['image_name'] != "" + ): + # find image by image name and account ID + image_id, image_facts = self.image_find( + image_id=0, + image_name=self.amodule.params['image_name'], + account_id=self.acc_id, + ) - if ((not self.check_amodule_argument('boot_disk', False)) or - self.amodule.params['boot_disk'] <= image_facts['size']): - # adjust disk size to the minimum allowed by OS image, which will be used to spin off this Compute - validated_bdisk_size = image_facts['size'] - else: - validated_bdisk_size =self.amodule.params['boot_disk'] + if validated_bdisk_size <= image_facts['size']: + # adjust disk size to the minimum allowed by OS image, which will be used to spin off this Compute + validated_bdisk_size = image_facts['size'] # NOTE: due to a libvirt "feature", that impacts management of a VM created without any network interfaces, # we create KVM VM in HALTED state. @@ -536,17 +581,24 @@ class decort_kvmvm(DecortController): cloud_init_params = None # if we get through here, all parameters required to create new Compute instance should be at hand + match self.amodule.params['chipset'].lower(): + case 'q35': + chipset = 'Q35' + case 'i440fx': + chipset = 'i440fx' + # NOTE: KVM VM is created in HALTED state and must be explicitly started self.comp_id = self.kvmvm_provision(rg_id=self.rg_id, - comp_name=self.amodule.params['name'], arch=self.amodule.params['arch'], + comp_name=self.amodule.params['name'], cpu=self.amodule.params['cpu'], ram=self.amodule.params['ram'], boot_disk=validated_bdisk_size, - image_id=image_facts['id'], + image_id=image_id, annotation=self.amodule.params['annotation'], userdata=cloud_init_params, sep_id=self.amodule.params['sep_id' ] if "sep_id" in self.amodule.params else None, pool_name=self.amodule.params['pool'] if "pool" in self.amodule.params else None, - start_on_create=start_compute) + start_on_create=start_compute, + chipset=chipset) self.comp_should_exist = True # Originally we would have had to re-read comp_info after VM was provisioned @@ -574,9 +626,17 @@ class decort_kvmvm(DecortController): # Compute was created # # Setup network connections - self.compute_networks(self.comp_info, self.amodule.params['networks']) + if self.amodule.params['networks'] is not None: + self.compute_networks( + comp_dict=self.comp_info, + new_networks=self.amodule.params['networks'], + ) # Next manage data disks - self.compute_data_disks(self.comp_info, self.amodule.params['data_disks']) + if self.amodule.params['data_disks'] is not None: + self.compute_data_disks( + comp_dict=self.comp_info, + new_data_disks=self.amodule.params['data_disks'], + ) self.compute_affinity(self.comp_info, self.amodule.params['tag'], @@ -623,25 +683,49 @@ class decort_kvmvm(DecortController): Note that it does not modify power state of KVM VM. """ - self.compute_networks(self.comp_info, self.amodule.params['networks']) + if self.amodule.params['networks'] is not None: + self.compute_networks( + comp_dict=self.comp_info, + new_networks=self.aparams['networks'], + order_changing=self.aparams['network_order_changing'], + ) boot_disk_new_size = self.amodule.params['boot_disk'] if boot_disk_new_size: self.compute_bootdisk_size(self.comp_info, boot_disk_new_size) - - self.compute_data_disks(self.comp_info, self.amodule.params['data_disks']) + + if self.amodule.params['data_disks'] is not None: + self.compute_data_disks(self.comp_info, self.amodule.params['data_disks']) + self.compute_resize(self.comp_info, self.amodule.params['cpu'], self.amodule.params['ram'], wait_for_state_change=arg_wait_cycles) - + self.compute_affinity(self.comp_info, self.amodule.params['tag'], self.amodule.params['aff_rule'], self.amodule.params['aaff_rule'], label=self.amodule.params['affinity_label']) + if self.compute_update_args: + self.compute_update( + compute_id=self.comp_info['id'], + **self.compute_update_args, + ) + return + @property + def compute_update_args(self) -> dict: + result_args = {} + + aparam_name = self.amodule.params['name'] + if aparam_name is not None and aparam_name != self.comp_info['name']: + result_args['name'] = aparam_name + + return result_args + + def package_facts(self, check_mode=False): """Package a dictionary of KVM VM facts according to the decort_kvmvm module specification. This dictionary will be returned to the upstream Ansible engine at the completion of decort_kvmvm @@ -670,6 +754,8 @@ class decort_kvmvm(DecortController): private_ips=[], # IPs on ViNSes; usually, at least one IP is listed nat_ip="", # IP of the external ViNS interface; can be empty. tags={}, + chipset="", + interfaces=[], ) if check_mode or self.comp_info is None: @@ -722,6 +808,10 @@ class decort_kvmvm(DecortController): # if it is a data disk - append its ID to the list of data disks IDs ret_dict['data_disks'].append(ddisk['id']) + ret_dict['chipset'] = self.comp_info['chipset'] + + ret_dict['interfaces'] = self.comp_info['interfaces'] + return ret_dict @staticmethod @@ -745,7 +835,6 @@ class decort_kvmvm(DecortController): required=False, fallback=(env_fallback, ['DECORT_APP_SECRET']), no_log=True), - arch=dict(type='str', choices=['X86_64', 'PPC64_LE'], default='X86_64'), authenticator=dict(type='str', required=True, choices=['legacy', 'oauth2', 'jwt']), @@ -756,7 +845,7 @@ class decort_kvmvm(DecortController): # count=dict(type='int', required=False, default=1), cpu=dict(type='int', required=False), # datacenter=dict(type='str', required=False, default=''), - data_disks=dict(type='list', default=[], required=False), # list of integer disk IDs + data_disks=dict(type='list', required=False), # list of integer disk IDs id=dict(type='int', required=False, default=0), image_id=dict(type='int', required=False), image_name=dict(type='str', required=False), @@ -765,7 +854,39 @@ class decort_kvmvm(DecortController): fallback=(env_fallback, ['DECORT_JWT']), no_log=True), name=dict(type='str'), - networks=dict(type='list', default=[], required=False), # list of dictionaries + networks=dict( + type='list', + elements='dict', + options=dict( + type=dict( + type='str', + required=True, + choices=[ + 'VINS', + 'EXTNET', + 'VFNIC', + 'DPDK', + 'EMPTY', + ], + ), + id=dict( + type='int', + ), + ip_addr=dict( + type='str', + ), + ), + required_if=[ + ('type', 'VINS', ('id',)), + ('type', 'EXTNET', ('id',)), + ('type', 'VFNIC', ('id',)), + ('type', 'DPDK', ('id',)), + ], + ), + network_order_changing=dict( + type='bool', + default=False, + ), oauth2_url=dict(type='str', required=False, fallback=(env_fallback, ['DECORT_OAUTH2_URL'])), @@ -794,6 +915,11 @@ class decort_kvmvm(DecortController): # wait_for_ip_address=dict(type='bool', required=False, default=False), workflow_callback=dict(type='str', required=False), workflow_context=dict(type='str', required=False), + chipset=dict( + type='str', + default='i440fx', + choices=['Q35', 'q35', 'I440FX', 'i440fx'] + ), ) # Workflow digest: diff --git a/library/decort_lb.py b/library/decort_lb.py index 042691a..f40f7fc 100644 --- a/library/decort_lb.py +++ b/library/decort_lb.py @@ -46,7 +46,7 @@ class decort_lb(DecortController): "rise": 2, "slowstart": 60000, "weight": 100, - } + } if arg_amodule.params['lb_id']: self.lb_id, self.lb_facts = self.lb_find(arg_amodule.params['lb_id']) if not self.lb_id: @@ -54,7 +54,6 @@ class decort_lb(DecortController): self.result['msg'] = "Specified LB ID {} not found."\ .format(arg_amodule.params['lb _id']) self.fail_json(**self.result) - self.acc_id = self.lb_facts['accountId'] self.rg_id = self.lb_facts['rgId'] self.vins_id = self.lb_facts['vinsId'] return @@ -105,7 +104,7 @@ class decort_lb(DecortController): ) self.amodule.fail_json(**self.result) - if self.rg_id and self.vins_id: + if self.rg_id and arg_amodule.params['lb_name']: self.lb_id, self.lb_facts = self.lb_find(0,arg_amodule.params['lb_name'],self.rg_id) return @@ -274,11 +273,11 @@ class decort_lb(DecortController): vins_id=dict(type='int', required=False, default=0), verify_ssl=dict(type='bool', required=False, default=True), lb_id=dict(type='int', required=False, default=0), - lb_name=dict(type='str', required=True), + lb_name=dict(type='str'), ha_lb=dict(type='bool', required=False, default=False), - backends=dict(type='list',required=False,default=[]), - frontends=dict(type='list',required=False,default=[]), - servers=dict(type='list',required=False,default=[]), + backends=dict(type='list',required=False), + frontends=dict(type='list',required=False), + servers=dict(type='list',required=False), permanently=dict(type='bool', required=False, default=False), workflow_callback=dict(type='str', required=False), workflow_context=dict(type='str', required=False), diff --git a/library/decort_osimage.py b/library/decort_osimage.py index cbe84e5..944041f 100644 --- a/library/decort_osimage.py +++ b/library/decort_osimage.py @@ -156,7 +156,7 @@ options: required: no architecture: description: - - 'Binary architecture of the image. Note. `X86_64` or `PPC64_LE`. Used when creating + - 'Binary architecture of the image. Note. `X86_64`. Used when creating -an operating system image.' required: no imagetype: @@ -208,10 +208,6 @@ options: - 'The password for loading the binary media. Used in conjunction with `usernameDL`. Used when creating - an operating system image.' required: no - permanently: - description: - - 'Whether to permanently delete the image. Used when deleting an image. The default is false.' - required: no ''' @@ -363,29 +359,28 @@ class decort_osimage(DecortController): passwordDL=amodule.params['passwordDL'], sepId=amodule.params['sepId'], poolName=amodule.params['poolName'], - architecture=amodule.params['architecture'], drivers=amodule.params['drivers']) self.result['changed'] = True return image_facts def decort_virt_image_link(self,amodule): # function that links an OS image to a virtual one - self.virt_image_link(imageId=self.validated_virt_image_id, targetId=self.validated_image_id) + self.virt_image_link(imageId=self.validated_virt_image_id, targetId=self.target_image_id) image_id, image_facts = decort_osimage.decort_virt_image_find(self, amodule) self.result['facts'] = decort_osimage.decort_osimage_package_facts(image_facts, amodule.check_mode) - self.result['msg'] = ("Image '{}' linked to virtual image '{}'").format(self.validated_image_id, + self.result['msg'] = ("Image '{}' linked to virtual image '{}'").format(self.target_image_id, decort_osimage.decort_osimage_package_facts(image_facts)['id'],) return image_id, image_facts def decort_image_delete(self,amodule): # function that removes an image - self.image_delete(imageId=amodule.image_id_delete, permanently=amodule.params['permanently']) + self.image_delete(imageId=amodule.image_id_delete) self.result['changed'] = True self.result['msg'] = ("Image '{}' deleted").format(amodule.image_id_delete) def decort_virt_image_create(self,amodule): # function that creates a virtual image - image_facts = self.virt_image_create(name=amodule.params['virt_name'], targetId=self.validated_image_id) + image_facts = self.virt_image_create(name=amodule.params['virt_name'], targetId=self.target_image_id) image_id, image_facts = decort_osimage.decort_virt_image_find(self, amodule) self.result['facts'] = decort_osimage.decort_osimage_package_facts(image_facts, amodule.check_mode) return image_id, image_facts @@ -487,7 +482,6 @@ class decort_osimage(DecortController): default='present', choices=['absent', 'present']), drivers=dict(type='str', required=False, default="KVM_X86"), - architecture=dict(type='str', required=False, default="X86_64"), imagetype=dict(type='str', required=False, default="linux"), boottype=dict(type='str', required=False, default="uefi"), url=dict(type='str', required=False), @@ -499,7 +493,6 @@ class decort_osimage(DecortController): image_password=dict(type='str', required=False), usernameDL=dict(type='str', required=False), passwordDL=dict(type='str', required=False), - permanently=dict(type='bool', required=False, default=False), ) @@ -524,22 +517,25 @@ def main(): if amodule.params['virt_name'] or amodule.params['virt_id']: image_id, image_facts = decort_osimage.decort_virt_image_find(decon, amodule) - decon.validated_image_id, _ = decort_osimage.decort_image_find(decon, amodule) + if amodule.params['image_name'] or amodule.params['image_id']: + decon.target_image_id, _ = decort_osimage.decort_image_find(decon, amodule) + else: + decon.target_image_id = 0 if decort_osimage.decort_osimage_package_facts(image_facts)['id'] > 0: decon.result['facts'] = decort_osimage.decort_osimage_package_facts(image_facts, amodule.check_mode) decon.validated_virt_image_id = decort_osimage.decort_osimage_package_facts(image_facts)['id'] decon.validated_virt_image_name = decort_osimage.decort_osimage_package_facts(image_facts)['name'] - if decort_osimage.decort_osimage_package_facts(image_facts)['id'] == 0 and amodule.params['state'] == "present" and decon.validated_image_id > 0: + if decort_osimage.decort_osimage_package_facts(image_facts)['id'] == 0 and amodule.params['state'] == "present" and decon.target_image_id > 0: image_id, image_facts = decort_osimage.decort_virt_image_create(decon,amodule) decon.result['msg'] = ("Virtual image '{}' created").format(decort_osimage.decort_osimage_package_facts(image_facts)['id']) decon.result['changed'] = True - elif decort_osimage.decort_osimage_package_facts(image_facts)['id'] == 0 and amodule.params['state'] == "present" and decon.validated_image_id == 0: + elif decort_osimage.decort_osimage_package_facts(image_facts)['id'] == 0 and amodule.params['state'] == "present" and decon.target_image_id == 0: decon.result['msg'] = ("Cannot find OS image") amodule.fail_json(**decon.result) - if decon.validated_virt_image_id: - if decort_osimage.decort_osimage_package_facts(image_facts)['linkto'] != decon.validated_image_id: + if decon.validated_virt_image_id and decon.target_image_id: + if decort_osimage.decort_osimage_package_facts(image_facts)['linkto'] != decon.target_image_id: decort_osimage.decort_virt_image_link(decon,amodule) decon.result['changed'] = True amodule.exit_json(**decon.result) @@ -564,8 +560,6 @@ def main(): decon.validated_image_id = decort_osimage.decort_osimage_package_facts(image_facts)['id'] elif amodule.params['state'] == "absent" and decon.validated_image_id: - if amodule.params['image_name'] or amodule.params['image_id'] and\ - decort_osimage.decort_osimage_package_facts(image_facts)['accountId'] == amodule.params['account_Id']: amodule.image_id_delete = decon.validated_image_id decort_osimage.decort_image_delete(decon,amodule) diff --git a/library/decort_pfw.py b/library/decort_pfw.py index df19794..b8625b9 100644 --- a/library/decort_pfw.py +++ b/library/decort_pfw.py @@ -248,7 +248,7 @@ def decort_pfw_parameters(): required=False, fallback=(env_fallback, ['DECORT_PASSWORD']), no_log=True), - rules=dict(type='list', required=False, default=[]), + rules=dict(type='list', required=False), state=dict(type='str', default='present', choices=['absent', 'present']), @@ -314,9 +314,11 @@ def main(): if amodule.params['state'] == 'absent': # ignore amodule.params['rules'] and remove all rules associated with this Compute pfw_facts = decon.pfw_configure(comp_facts, vins_facts, None) - else: + elif amodule.params['rules'] is not None: # manage PFW rules accodring to the module arguments pfw_facts = decon.pfw_configure(comp_facts, vins_facts, amodule.params['rules']) + else: + pfw_facts = decon._pfw_get(comp_facts['id'], vins_facts['id']) # # complete module run diff --git a/library/decort_rg.py b/library/decort_rg.py index 8f1f5a8..a4f45a2 100644 --- a/library/decort_rg.py +++ b/library/decort_rg.py @@ -217,31 +217,44 @@ class decort_rg(DecortController): self.validated_rg_id = 0 self.validated_rg_facts = None - if self.amodule.params['account_id']: - self.validated_acc_id, _ = self.account_find("", amodule.params['account_id']) - elif amodule.params['account_name']: - self.validated_acc_id, _ = self.account_find(amodule.params['account_name']) - if not self.validated_acc_id: - # we failed to locate account by either name or ID - abort with an error - self.result['failed'] = True - self.result['msg'] = ("Current user does not have access to the requested account " - "or non-existent account specified.") - self.amodule.fail_json(**self.result) - - if amodule.params['rg_id'] > 0: - self.validated_rg_id = amodule.params['rg_id'] + if amodule.params['rg_id'] is None: + if self.amodule.params['account_id']: + self.validated_acc_id, _ = self.account_find("", amodule.params['account_id']) + elif amodule.params['account_name']: + self.validated_acc_id, _ = self.account_find(amodule.params['account_name']) + if not self.validated_acc_id: + # we failed to locate account by either name or ID - abort with an error + self.result['failed'] = True + self.result['msg'] = ("Current user does not have access to the requested account " + "or non-existent account specified.") + self.amodule.fail_json(**self.result) # Check if the RG with the specified parameters already exists - self.validated_rg_id, self.rg_facts = self.rg_find(self.validated_acc_id, - arg_rg_id = self.validated_rg_id, - arg_rg_name=amodule.params['rg_name'], - arg_check_state=False) + self.get_info() if amodule.params['state'] != "absent": self.rg_should_exist = True else: self.rg_should_exist = False + def get_info(self): + # If this is the first getting info + if not self.validated_rg_id: + self.validated_rg_id, self.rg_facts = self.rg_find( + arg_account_id=self.validated_acc_id, + arg_rg_id=self.aparams['rg_id'], + arg_rg_name=self.aparams['rg_name'], + arg_check_state=False, + ) + # If this is a repeated getting info + else: + # If check mode is enabled, there is no needed to + # request info again + if self.amodule.check_mode: + return + + _, self.rg_facts = self.rg_find(arg_rg_id=self.validated_rg_id) + def access(self): should_change_access = False acc_granted = False @@ -296,17 +309,37 @@ class decort_rg(DecortController): self.result['msg'] = ("Cannot limit less than already reserved'{}'").format(incorrect_quota) self.result['failed'] = True - if self.result['failed'] != True: - self.rg_update(self.rg_facts, self.amodule.params['quotas'], - self.amodule.params['resType'], self.amodule.params['rename']) + if not self.result['failed']: + self.rg_update( + arg_rg_dict=self.rg_facts, + arg_quotas=self.amodule.params['quotas'], + arg_res_types=self.amodule.params['resType'], + arg_newname=self.amodule.params['rename'], + arg_sep_pools=self.amodule.params['sep_pools'], + ) self.rg_should_exist = True return def setDefNet(self): - if self.amodule.params['def_netId'] != self.rg_facts['def_net_id']: - self.rg_setDefNet(self.validated_rg_id, - self.amodule.params['def_netType'], - self.amodule.params['def_netId']) + rg_def_net_type = self.rg_facts['def_net_type'] + rg_def_net_id = self.rg_facts['def_net_id'] + aparam_def_net_type = self.aparams['def_netType'] + aparam_def_net_id = self.aparams['def_netId'] + + need_to_reset = (aparam_def_net_type == 'NONE' + and rg_def_net_type != aparam_def_net_type) + + need_to_change = False + if aparam_def_net_id is not None: + need_to_change = (aparam_def_net_id != rg_def_net_id + or aparam_def_net_type != rg_def_net_type) + + if need_to_reset or need_to_change: + self.rg_setDefNet( + arg_rg_id=self.validated_rg_id, + arg_net_type=aparam_def_net_type, + arg_net_id=aparam_def_net_id, + ) self.rg_should_exist = True return @@ -351,8 +384,11 @@ class decort_rg(DecortController): return def destroy(self): - - self.rg_delete(self.validated_rg_id, self.amodule.params['permanently']) + self.rg_delete( + rg_id=self.validated_rg_id, + permanently=self.amodule.params['permanently'], + recursively=self.aparams['recursive_deletion'], + ) if self.amodule.params['permanently'] == True: self.rg_facts['status'] = 'DESTROYED' else: @@ -393,6 +429,7 @@ class decort_rg(DecortController): ret_dict['defNetType'] = self.rg_facts['def_net_type'] ret_dict['ViNS'] = self.rg_facts['vins'] ret_dict['computes'] = self.rg_facts['vms'] + ret_dict['uniqPools'] = self.rg_facts['uniqPools'] return ret_dict @@ -418,7 +455,7 @@ class decort_rg(DecortController): controller_url=dict(type='str', required=True), # datacenter=dict(type='str', required=False, default=''), def_netType=dict(type='str', choices=['PRIVATE','PUBLIC', 'NONE'], default='PRIVATE'), - def_netId=dict(type='int', default=0), + def_netId=dict(type='int'), extNetId=dict(type='int', default=0), extNetIp=dict(type='str', default=""), owner=dict(type='str', default=""), @@ -446,10 +483,29 @@ class decort_rg(DecortController): required=False, fallback=(env_fallback, ['DECORT_USER'])), rg_name=dict(type='str', required=False,), - rg_id=dict(type='int', required=False, default=0), + rg_id=dict(type='int', required=False), verify_ssl=dict(type='bool', required=False, default=True), workflow_callback=dict(type='str', required=False), workflow_context=dict(type='str', required=False), + sep_pools=dict( + type='list', + elements='dict', + options=dict( + sep_id=dict( + type='int', + required=True, + ), + pool_names=dict( + type='list', + required=True, + elements='str', + ), + ), + ), + recursive_deletion=dict( + type='bool', + default=False, + ) ) # Workflow digest: @@ -486,11 +542,16 @@ def main(): elif amodule.params['state'] == "disabled": decon.enable() if amodule.params['state'] in ['present', 'enabled']: - if amodule.params['quotas'] or amodule.params['resType'] or amodule.params['rename'] != "": + if ( + amodule.params['quotas'] + or amodule.params['resType'] + or amodule.params['rename'] != "" + or amodule.params['sep_pools'] is not None + ): decon.update() if amodule.params['access']: decon.access() - if amodule.params['def_netId'] > 0: + if amodule.params['def_netType'] is not None: decon.setDefNet() elif decon.rg_facts['status'] == "DELETED": @@ -528,6 +589,8 @@ def main(): amodule.fail_json(**decon.result) else: if decon.rg_should_exist: + if decon.result['changed']: + decon.get_info() decon.result['facts'] = decon.package_facts(amodule.check_mode) amodule.exit_json(**decon.result) else: diff --git a/library/decort_user_info.py b/library/decort_user_info.py index 6a5addc..8173bf8 100644 --- a/library/decort_user_info.py +++ b/library/decort_user_info.py @@ -112,7 +112,15 @@ class DecortUserInfo(DecortController): type='str', ), status_code=dict( - type='str', + type='dict', + options=dict( + min=dict( + type='int', + ), + max=dict( + type='int', + ), + ), ), time=dict( type='dict', @@ -151,6 +159,7 @@ class DecortUserInfo(DecortController): ), pagination=dict( type='dict', + apply_defaults=True, options=dict( number=dict( type='int', @@ -158,7 +167,7 @@ class DecortUserInfo(DecortController): ), size=dict( type='int', - required=True, + default=50, ), ), ), @@ -276,7 +285,13 @@ class DecortUserInfo(DecortController): input_args_filter = input_args['filter'] if input_args_filter: mapped_args['api_method'] = input_args_filter['api_method'] - mapped_args['http_status_code'] = input_args_filter['status_code'] + + match input_args_filter['status_code']: + case {'min': int() as min_status_code}: + mapped_args['min_status_code'] = min_status_code + match input_args_filter['status_code']: + case {'max': int() as max_status_code}: + mapped_args['max_status_code'] = max_status_code match input_args_filter['time']: case {'start': {'unix': int() as start_unix_time}}: diff --git a/module_utils/decort_utils.py b/module_utils/decort_utils.py index 3e9f346..82039a8 100644 --- a/module_utils/decort_utils.py +++ b/module_utils/decort_utils.py @@ -32,11 +32,10 @@ from datetime import datetime from enum import Enum import json import re -from typing import Any, Callable, Iterable +from typing import Any, Callable, Iterable, Literal, Optional import time import jwt -import netaddr import requests from ansible.module_utils.basic import AnsibleModule, env_fallback @@ -827,13 +826,12 @@ class DecortController(object): self.exit(fail=True) except requests.exceptions.ConnectionError: self.result['failed'] = True - self.result['msg'] = "Failed to connect to '{}' when calling DECORT API.".format(api_resp.url) + self.result['msg'] = "Failed to connect to '{}' when calling DECORT API.".format(api_resp.url if api_resp else req_url) self.amodule.fail_json(**self.result) return None # actually, this directive will never be executed as fail_json aborts the script except requests.exceptions.Timeout: self.result['failed'] = True - self.result['msg'] = "Timeout when trying to connect to '{}' when calling DECORT API.".format( - api_resp.url) + self.result['msg'] = "Timeout when trying to connect to '{}' when calling DECORT API.".format(api_resp.url if api_resp else req_url) self.amodule.fail_json(**self.result) return None @@ -984,12 +982,14 @@ class DecortController(object): @waypoint def user_audits(self, + page_size: int, api_method: None | str = None, - http_status_code: None | int = None, + min_status_code: None | int = None, + max_status_code: None | int = None, start_unix_time: None | int = None, end_unix_time: None | int = None, page_number: int = 1, - page_size: None | int = None) -> dict[str, Any]: + ) -> dict[str, Any]: """ Implementation of the functionality of API method `/cloudapi/user/getAudit`. @@ -997,10 +997,11 @@ class DecortController(object): api_params = { 'call': api_method, - 'statuscode': http_status_code, + 'minStatusCode': min_status_code, + 'maxStatusCode': max_status_code, 'timestampAt': start_unix_time, 'timestampTo': end_unix_time, - 'page': page_number if page_size else None, + 'page': page_number, 'size': page_size, } api_resp = self.decort_api_call( @@ -1234,7 +1235,11 @@ class DecortController(object): api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/get", api_params) if api_resp.status_code == 200: ret_comp_id = comp_id + ret_comp_dict = json.loads(api_resp.content.decode('utf8')) + # Sorting network interface list by PCI slot number + ret_comp_dict['interfaces'].sort(key=lambda k: k['pciSlot']) + ret_rg_id = ret_comp_dict['rgId'] else: self.result['warning'] = ("compute_get_by_id(): failed to get Compute by ID {}. HTTP code {}, " @@ -1395,22 +1400,21 @@ class DecortController(object): return def kvmvm_provision(self, rg_id, - comp_name, arch, + comp_name, cpu, ram, boot_disk, image_id, + chipset: Literal['Q35', 'i440fx'] = 'i440fx', annotation="", userdata=None, sep_id=None, pool_name=None, start_on_create=True): - """Manage KVM VM provisioning. To remove existing KVM VM compute instance use compute_remove method, + """Manage KVM VM provisioning. To remove existing KVM VM compute instance use compute_remove method, to resize use compute_resize, to manage power state use compute_powerstate method. @param (int) rg_id: ID of the RG where the VM will be provisioned. @param (string) comp_name: that specifies the name of the VM. - @param (string) arch: hardware architecture of KVM VM. Supported values are: "X86_64" for Intel x86 - and "PPC64_LE" for IBM PowerPC. @param (int) cpu: how many virtual CPUs to allocate. @param (int) ram: volume of RAM in MB to allocate (i.e. pass 4096 to allocate 4GB RAM). @param (int) boot_disk: boot disk size in GB. @@ -1431,33 +1435,31 @@ class DecortController(object): "was requested.").format(comp_name, rg_id) return 0 - api_url = "" - if arch == "X86_64": - api_url = "/restmachine/cloudapi/kvmx86/create" - elif arch == "PPC64_LE": - api_url = "/restmachine/cloudapi/kvmppc/create" - else: - self.result['failed'] = True - self.result['msg'] = "Unsupported architecture '{}' requested for KVM VM name '{}'".format(arch, comp_name) - self.amodule.fail_json(**self.result) - # fail the module - exit - - api_params = dict(rgId=rg_id, - name=comp_name, - cpu=cpu, ram=ram, - imageId=image_id, - bootDisk=boot_disk, - sepId=sep_id, - pool=pool_name, - start=start_on_create, # start_machine parameter requires DECORT API ver 3.3.1 or higher - interfaces='[]'# we create VM without any network connections - ) - if userdata: - api_params['userdata'] = json.dumps(userdata) # we need to pass a string object as "userdata" - + api_params = { + 'rgId': rg_id, + 'name': comp_name, + 'cpu': cpu, + 'ram': ram, + 'bootDisk': boot_disk, + 'sepId': sep_id, + 'pool': pool_name, + 'interfaces': '[]', # we create VM without any network connections + 'chipset': chipset, + 'withoutBootDisk': not boot_disk, + } if annotation: api_params['decs'] = annotation + if not image_id: + api_url = '/restmachine/cloudapi/kvmx86/createBlank' + else: + api_url = '/restmachine/cloudapi/kvmx86/create' + api_params['imageId'] = image_id + api_params['start'] = start_on_create + + if userdata: + api_params['userdata'] = json.dumps(userdata) # we need to pass a string object as "userdata" + api_resp = self.decort_api_call(requests.post, api_url, api_params) # On success the above call will return here. On error it will abort execution by calling fail_json. self.result['failed'] = False @@ -1466,167 +1468,133 @@ class DecortController(object): return ret_vm_id - def compute_networks(self, comp_dict, new_networks): - """Manage network configuration of Compute instance. - - @param (dict) comp_dict: dictionary, which identifies this Compute instance, formatted - as returned by previous call to compute_find(...). - @param (list of dicts) new_networks: list of dictionaries with network specs, which defines - new network configuration for the Compute. Keys in the network specification dictionary: - (string) type - one of "VINS" or "EXTNET", to connect to either private or public - network respectively. - (int) id - ID of the ViNS or external network, interpreted based on net_type value. - (string) ip_addr - optional IP address to assign to this connection. If empty string is - specified, the platform will assign the address automatically. - - Note: as this method may change network configuration of the compute instance, comp_dict - will no longer contain actual info about interfaces. It is recommended that compute - facts are updated in the upstream code. - """ - - self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "compute_networks") - - if self.amodule.check_mode: - self.result['failed'] = False - self.result['msg'] = ("compute_networks() in check mode: network reconfig for Compute " - "ID {} was requested.").format(comp_dict['id']) - return - - # 'networks' dictionary for decort_kvmvm module has 'id' parameter, which is expected - # to be interger. - # However, if the value for 'id' comes via Jinja templating like this: - # networks: - # - type: VINS <= will come as string, which is OK. - # id: "{{ my_vins.facts.id }}" <= will come as string, which is WRONG!!! - # - type: VINS <= will come as string, which is OK - # id: 37 <= no Jinja templae, will come as int - OK - # - # then all values (including those for 'id' key) when entering this method will be of - # type string. We need to explicitly cast int type on all of them. - - for repair in new_networks: - repair['id'] = int(repair['id']) - - api_params = dict(accountId=comp_dict['accountId']) - api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/vins/search", api_params) - vins_list = json.loads(api_resp.content.decode('utf8')) - # - # We should not fail the module if ViNS list is empty - it is not an error, as in case of - # API failure "decort_api_call" will abort the module execution on its own. Hence the - # following code fragment is commented out - # - # if not len(vins_list): - # self.result['failed'] = True - # self.result['msg'] = ("compute_networks() cannot obtain VINS list for Account ID {}, " - # "Compute ID {}.").format(comp_dict['accountId'], comp_dict['id']) - # return - - api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/extnet/list", api_params) - extnet_list = json.loads( - api_resp.content.decode('utf8')) # list of dicts: "name" holds "NET_ADDR/NETMASK", "id" is ID - # - # Empty extnet_list does not constitute error condition, so we should not fail the module in - # this case. Therefore the following code fragment is commented out. - # - # if not len(extnet_list): - # self.result['failed'] = True - # self.result['msg'] = ("compute_networks() cannot obtain External networks list for Account ID {}, " - # "Compute ID {}.").format(comp_dict['accountId'], comp_dict['id']) - # return - - # Prepare the lists of network interfaces for the compute instance: - vins_iface_list = [] # will contain dict(id=, ipAddress=, mac=) for ifaces connected to ViNS(es) - enet_iface_list = [] # will contain dict(id=, ipAddress=, mac=) for ifaces connected to Ext net(s) - for iface in comp_dict['interfaces']: - if iface['connType'] == 'VXLAN': - for vrunner in vins_list: - if vrunner['vxlanId'] == iface['connId']: - iface_data = dict(id=vrunner['id'], - ipAddress=iface['ipAddress'], - mac=iface['mac']) - vins_iface_list.append(iface_data) - elif iface['connType'] == 'VLAN': - ip_addr = netaddr.IPAddress(iface['ipAddress']) - for erunner in extnet_list['data']: - # match by IP address range - # if iface['ipAddress'] <-> erunner['name'] - # enet_iface_list.append(erunner['id']) - ip_extnet = netaddr.IPNetwork(erunner['ipcidr']) - if ip_addr.value >= ip_extnet.first and ip_addr.value <= ip_extnet.last: - iface_data = dict(id=erunner['id'], - ipAddress=iface['ipAddress'], - mac=iface['mac']) - enet_iface_list.append(iface_data) - - # If at this point compt_dict["interfaces"] lists some interfaces, but neither vins_iface_list - # nor enet_iface_list contain any members, it means that none of the ViNS or Ext Nets currently - # available to us match existing interfaces of the Compute instance. - # This is abnormal condition and we should not proceed any further. - if len(comp_dict['interfaces']) and (not len(vins_iface_list) and not len(enet_iface_list)): - self.result['failed'] = True - self.result['msg'] = ("compute_networks() no match between {} interface(s) of Compute ID {}" - "and available {} ViNS(es) or {} ExtNet(s).").format(len(comp_dict['interfaces']), - comp_dict['id'], - len(vins_list), - len(extnet_list)) - return - - vins_id_list = [rec['id'] for rec in vins_iface_list] - - enet_id_list = [rec['id'] for rec in enet_iface_list] - - # Build attach list by looking for ViNS/Ext net IDs that appear in new_networks, but do not appear in current lists - attach_list = [] # attach list holds both ViNS and Ext Net attachment specs, as API handles them the same way - for netrunner in new_networks: - if netrunner['type'] == 'VINS' and (netrunner['id'] not in vins_id_list): - net2attach = dict(computeId=comp_dict['id'], - netType='VINS', - netId=netrunner['id'], - ipAddr=netrunner.get('ip_addr', "")) - attach_list.append(net2attach) - elif netrunner['type'] == 'EXTNET' and (netrunner['id'] not in enet_id_list): - net2attach = dict(computeId=comp_dict['id'], - netType='EXTNET', - netId=netrunner['id'], - ipAddr=netrunner.get('ip_addr', "")) - attach_list.append(net2attach) - - # detach is meaningful only if compute's interfaces list was not empty - if vins_id_list or enet_id_list: - # Build detach list by looking for ViNS/Ext net IDs that appear in current lists, but do not appear in new_networks - detach_list = [] # detach list holds both ViNS and Ext Net detachment specs, as API handles them the same way - - target_list = [rec['id'] for rec in new_networks if rec['type'] == 'VINS'] - - for netrunner in vins_iface_list: - if netrunner['id'] not in target_list: - net2detach = dict(computeId=comp_dict['id'], - ipAddr=netrunner['ipAddress'], - mac=netrunner['mac']) - detach_list.append(net2detach) - - target_list = [rec['id'] for rec in new_networks if rec['type'] == 'EXTNET'] - - for netrunner in enet_iface_list: - if netrunner['id'] not in target_list: - net2detach = dict(computeId=comp_dict['id'], - ipAddr=netrunner['ipAddress'], - mac=netrunner['mac']) - detach_list.append(net2detach) - - for api_params in detach_list: - self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/netDetach", api_params) - # On success the above call will return here. On error it will abort execution by calling fail_json. - self.result['changed'] = True - - for api_params in attach_list: - self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/netAttach", api_params) - # On success the above call will return here. On error it will abort execution by calling fail_json. - self.result['changed'] = True + @waypoint + @checkmode + def compute_networks( + self, + comp_dict: dict[str, Any], + new_networks: list[dict[str, Any]], + order_changing: bool = False, + ): + vm_id = comp_dict['id'] + ifaces = comp_dict['interfaces'] + + ifaces_for_delete = [] + nets_for_attach = [] + nets_for_change_ip = [] + + # Either only attaching or only detaching networks + if not ifaces or not new_networks: + ifaces_for_delete = ifaces + nets_for_attach = new_networks + else: + EMPTY = 'EMPTY' + + # Creating dictionaries in which the key is a net type + a net id + # For empty networks a net id is the number of the empty network + ifaces_dict = {} + empty_ifaces_count = 0 + for iface in ifaces: + net_type = iface['netType'] + if net_type == EMPTY: + empty_ifaces_count += 1 + net_id = empty_ifaces_count + else: + net_id = iface['netId'] + net_key = f'{net_type}{net_id}' + ifaces_dict[net_key] = iface + new_nets_dict = {} + empty_new_nets_count = 0 + for net in new_networks: + net_type = net["type"] + if net_type == EMPTY: + empty_new_nets_count += 1 + net_id = empty_new_nets_count + else: + net_id = net['id'] + net_key = f'{net_type}{net_id}' + new_nets_dict[net_key] = net + + # The networks that no need to be disconnected or reconnected + unchangeable_nets_dict = {} + + # Changing with taking into account sequence of + # target network list + if order_changing: + # We proceed from the fact that + # ifaces is sorted by PCI slot number in + # method self._compute_get_by_id + + # No need to change networks + if list(ifaces_dict.keys()) == list(new_nets_dict.keys()): + unchangeable_nets_dict = new_nets_dict + # Need to change networks + else: + ifaces_for_delete = ifaces + nets_for_attach = new_networks + # Changing without taking into account sequence of + # target network list (the faster way than with) + else: + # Adding interfaces for delete + for iface_net_key, iface in ifaces_dict.items(): + if iface_net_key not in new_nets_dict.keys(): + ifaces_for_delete.append(iface) + + # Adding networks for attach + for new_net_key, net in new_nets_dict.items(): + if new_net_key in ifaces_dict.keys(): + unchangeable_nets_dict[new_net_key] = net + else: + nets_for_attach.append(net) + + # Adding networks for change IP address + for net_key, net in unchangeable_nets_dict.items(): + if net['type'] in ('VINS', 'EXTNET'): + old_ip = ifaces_dict[net_key]['ipAddress'] + new_ip = net['ip_addr'] + if new_ip and old_ip != new_ip: + nets_for_change_ip.append(net) + + # Detaching networks + for iface in ifaces_for_delete: + self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/compute/netDetach', + arg_params={ + 'computeId': vm_id, + 'mac': iface['mac'], + 'ipAddr': iface['ipAddress'] or None, + }, + ) + self.set_changed() - self.result['failed'] = False + # Attaching networks + for net in nets_for_attach: + self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/compute/netAttach', + arg_params={ + 'computeId': vm_id, + 'netType': net['type'], + 'netId': net.get('id') or 0, + 'ipAddr': net.get('ip_addr'), + }, + ) + self.set_changed() - return + # Changing IP adresses + for net in nets_for_change_ip: + self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/compute/changeIp', + arg_params={ + 'computeId': vm_id, + 'netType': net['type'], + 'netId': net['id'], + 'ipAddr': net['ip_addr'], + }, + ) + self.set_changed() def compute_resize_vector(self, comp_dict, new_cpu, new_ram): """Check if the Compute new size parameters passed to this function are different from the @@ -1715,12 +1683,6 @@ class DecortController(object): INVALID_STATES_FOR_HOT_DOWNSIZE = ["RUNNING", "MIGRATING", "DELETED"] - # Values that are specified via Jinja templating engine (e.g. "{{ new_ram_size }}") may come - # as strings. To make sure comparison of new values against current compute size is done - # correcly, we explicitly cast them to type int here. - new_cpu = int(new_cpu) - new_ram = int(new_ram) - self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "compute_resize") if self.amodule.check_mode: @@ -1837,46 +1799,48 @@ class DecortController(object): """ self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "compute_affinity") - if tags: - for tag in tags.items(): - if tag not in comp_dict['tags'].items(): - api_params = dict(computeId=comp_dict['id'], - key=tag[0], - value=tag[1], ) - self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/tagAdd", api_params) - self.result['failed'] = False - self.result['changed'] = True - - if comp_dict['tags']: - for tag in comp_dict['tags'].items(): - if tag not in tags.items(): + if tags is not None: + if tags: + for tag in tags.items(): + if tag not in comp_dict['tags'].items(): + api_params = dict(computeId=comp_dict['id'], + key=tag[0], + value=tag[1], ) + self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/tagAdd", api_params) + self.result['failed'] = False + self.result['changed'] = True + + if comp_dict['tags']: + for tag in comp_dict['tags'].items(): + if tag not in tags.items(): + api_params = dict(computeId=comp_dict['id'], + key=tag[0],) + self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/tagRemove", api_params) + self.result['failed'] = False + self.result['changed'] = True + else: + if comp_dict['tags']: + for tag in comp_dict['tags'].items(): api_params = dict(computeId=comp_dict['id'], - key=tag[0],) + key=tag[0],) self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/tagRemove", api_params) self.result['failed'] = False self.result['changed'] = True - else: - if comp_dict['tags']: - for tag in comp_dict['tags'].items(): + + if label is not None: + if label: + if label != comp_dict['affinityLabel']: api_params = dict(computeId=comp_dict['id'], - key=tag[0],) - self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/tagRemove", api_params) + affinityLabel=label,) + self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/affinityLabelSet", api_params) + self.result['failed'] = False + self.result['changed'] = True + else: + if comp_dict['affinityLabel'] != "": + api_params = dict(computeId=comp_dict['id']) + self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/affinityLabelRemove", api_params) self.result['failed'] = False self.result['changed'] = True - - if label: - if comp_dict['affinityLabel'] == "": - api_params = dict(computeId=comp_dict['id'], - affinityLabel=label,) - self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/affinityLabelSet", api_params) - self.result['failed'] = False - self.result['changed'] = True - else: - if comp_dict['affinityLabel'] != "": - api_params = dict(computeId=comp_dict['id']) - self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/affinityLabelRemove", api_params) - self.result['failed'] = False - self.result['changed'] = True affrule_del = [] affrule_add = [] @@ -1884,28 +1848,31 @@ class DecortController(object): aaffrule_add = [] #AFFINITY - if comp_dict['affinityRules']: - for rule in comp_dict['affinityRules']: - del rule['guid'] - if not aff or rule not in aff: - affrule_del.append(rule) - - if aff: - for rule in aff: - if rule not in comp_dict['affinityRules']: - affrule_add.append(rule) + if aff is not None: + if comp_dict['affinityRules']: + # raise ValueError(f'affinityRules={comp_dict["affinityRules"]}, aff={aff}') + for rule in comp_dict['affinityRules']: + del rule['guid'] + if not aff or rule not in aff: + affrule_del.append(rule) + + if aff: + for rule in aff: + if rule not in comp_dict['affinityRules']: + affrule_add.append(rule) #ANTI AFFINITY - if comp_dict['antiAffinityRules']: - for rule in comp_dict['antiAffinityRules']: - del rule['guid'] - if not aaff or rule not in aaff: - aaffrule_del.append(rule) - - if aaff: - for rule in aaff: - if rule not in comp_dict['antiAffinityRules']: - aaffrule_add.append(rule) + if aaff is not None: + if comp_dict['antiAffinityRules']: + for rule in comp_dict['antiAffinityRules']: + del rule['guid'] + if not aaff or rule not in aaff: + aaffrule_del.append(rule) + + if aaff: + for rule in aaff: + if rule not in comp_dict['antiAffinityRules']: + aaffrule_add.append(rule) #AFFINITY if len (affrule_del): @@ -1955,6 +1922,32 @@ class DecortController(object): self.result['failed'] = False self.result['changed'] = True return + + @waypoint + @checkmode + def compute_update(self, compute_id: int, name: Optional[str] = None): + OBJ = 'compute' + + api_response = self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/compute/update', + arg_params={ + 'computeId': compute_id, + 'name': name, + }, + ) + + self.set_changed() + + if name is not None: + self.message( + self.MESSAGES.obj_renamed( + obj=OBJ, + id=compute_id, + new_name=name, + ) + ) + ################################### # OS image manipulation methods ################################### @@ -1963,11 +1956,16 @@ class DecortController(object): api_params = dict(imageId=image_id, showAll=False) - api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/image/get", api_params) - # On success the above call will return here. On error it will abort execution by calling fail_json. - ret_image_dict = json.loads(api_resp.content.decode('utf8')) + api_resp = self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/image/get', + arg_params=api_params, + not_fail_codes=[404], + ) + if api_resp.status_code == 404: + return 0, None - return image_id, ret_image_dict + return image_id, api_resp.json() def image_find(self, image_id, image_name, account_id, rg_id=0, sepid=0, pool=""): """Locates image specified by name and returns its facts as dictionary. @@ -1994,11 +1992,7 @@ class DecortController(object): self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "image_find") if image_id > 0: - ret_image_id, ret_image_dict = self._image_get_by_id(image_id) - if (ret_image_id and - (sepid == 0 or sepid == ret_image_dict['sepId']) and - (pool == "" or pool == ret_image_dict['pool'])): - return ret_image_id, ret_image_dict + return self._image_get_by_id(image_id) else: validated_acc_id = account_id if account_id == 0: @@ -2109,10 +2103,10 @@ class DecortController(object): self.result['changed'] = True return 0, None - def image_delete(self, imageId, permanently): + def image_delete(self, imageId): self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "image_delete") - api_params = dict(imageId=imageId, permanently=permanently,) + api_params = dict(imageId=imageId) api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/image/delete", api_params) # On success the above call will return here. On error it will abort execution by calling fail_json. image_dict = json.loads(api_resp.content.decode('utf8')) @@ -2121,12 +2115,12 @@ class DecortController(object): return 0, None - def image_create(self,img_name,url,gid,boottype,imagetype,architecture,drivers,hotresize,username,password,account_Id,usernameDL,passwordDL,sepId,poolName): + def image_create(self,img_name,url,gid,boottype,imagetype,drivers,hotresize,username,password,account_Id,usernameDL,passwordDL,sepId,poolName): self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "image_create") api_params = dict(name=img_name, url=url, gid=gid, boottype=boottype, - imagetype=imagetype, architecture=architecture, + imagetype=imagetype, drivers=drivers, accountId=account_Id, hotresize=hotresize, username=username, password=password, usernameDL=usernameDL, @@ -2166,7 +2160,7 @@ class DecortController(object): ################################### # Resource Group (RG) manipulation methods ################################### - def rg_delete(self, rg_id, permanently): + def rg_delete(self, rg_id, permanently, recursively: bool): """Deletes specified VDC. @param (int) rg_id: integer value that identifies the RG to be deleted. @@ -2182,12 +2176,8 @@ class DecortController(object): self.result['msg'] = "rg_delete() in check mode: delete RG ID {} was requested.".format(rg_id) return - # - # TODO: need decision if deleting a VDC with VMs in it is allowed (aka force=True) and implement accordingly. - # - api_params = dict(rgId=rg_id, - # force=True | False, + force=recursively, permanently=permanently, ) self.decort_api_call(requests.post, "/restmachine/cloudapi/rg/delete", api_params) # On success the above call will return here. On error it will abort execution by calling fail_json. @@ -2272,7 +2262,7 @@ class DecortController(object): self.result['changed'] = True return - def rg_find(self, arg_account_id, arg_rg_id, arg_rg_name="", arg_check_state=True): + def rg_find(self, arg_account_id=0, arg_rg_id=0, arg_rg_name="", arg_check_state=True): """Returns non zero RG ID and a dictionary with RG details on success, 0 and empty dictionary otherwise. This method does not fail the run if RG cannot be located by its name (arg_rg_name), because this could be an indicator of the requested RG never existed before. @@ -2301,11 +2291,11 @@ class DecortController(object): self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "rg_find") - ret_rg_id = arg_rg_id + ret_rg_id = 0 api_params = dict() ret_rg_dict = None - if arg_rg_id > 0: + if arg_rg_id is not None and arg_rg_id > 0: ret_rg_id, ret_rg_dict = self._rg_get_by_id(arg_rg_id) if not ret_rg_id: self.result['failed'] = True @@ -2358,13 +2348,25 @@ class DecortController(object): "requested.").format(arg_rg_id) return 0 + api_params = {'rgId': arg_rg_id} + if arg_net_type == "NONE": - arg_net_type = "PRIVATE" - api_params = dict(rgId=arg_rg_id, - netType=arg_net_type, - netId=arg_net_id,) - api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/rg/setDefNet", api_params) + api_route = '/restmachine/cloudapi/rg/removeDefNet' + else: + api_route = '/restmachine/cloudapi/rg/setDefNet' + api_params.update({ + 'netType': arg_net_type, + 'netId': arg_net_id, + }) + + self.decort_api_call( + arg_req_function=requests.post, + arg_api_name=api_route, + arg_params=api_params, + ) + self.result['changed'] = True + return @@ -2466,7 +2468,7 @@ class DecortController(object): # TODO: this method will not work in its current implementation. Update it for new .../rg/update specs. - def rg_update(self, arg_rg_dict, arg_quotas, arg_res_types, arg_newname): + def rg_update(self, arg_rg_dict, arg_quotas, arg_res_types, arg_newname, arg_sep_pools): """Manage quotas for an existing RG. @param arg_rg_dict: dictionary with RG facts as returned by rg_find(...) method or .../rg/get API @@ -2532,6 +2534,21 @@ class DecortController(object): # if quotas dictionary is None, it means that no quotas should be set - reset the limits api_params[set_key_map[new_limit]] = arg_rg_dict['resourceLimits'][query_key_map[new_limit]] + if arg_sep_pools is not None: + if arg_sep_pools: + sep_pools = set() + for sep in arg_sep_pools: + for pool_name in sep['pool_names']: + sep_pools.add( + f'{sep["sep_id"]}_{pool_name}' + ) + if set(arg_rg_dict['uniqPools']) != sep_pools: + api_params['uniqPools'] = sep_pools + update_required = True + elif arg_rg_dict['uniqPools']: + api_params['clearUniqPools'] = True + update_required = True + if update_required: self.decort_api_call(requests.post, "/restmachine/cloudapi/rg/update", api_params) # On success the above call will return here. On error it will abort execution by calling fail_json. @@ -3057,7 +3074,6 @@ class DecortController(object): def account_images( self, account_id: int, - deleted: bool = False, image_id: None | int = None, image_name: None | str = None, image_type: None | str = None, @@ -3095,7 +3111,6 @@ class DecortController(object): api_params = { 'accountId': account_id, 'imageId': image_id, - 'includedeleted': deleted, 'name': image_name, 'page': page_number if page_size else None, 'size': page_size, @@ -3462,7 +3477,8 @@ class DecortController(object): ext_traffic_quota: None | int = None, gpu_quota: None | int = None, public_ip_quota: None | int = None, - ram_quota: None | int = None,) -> None: + ram_quota: None | int = None, + sep_pools: None | Iterable[str] = None,) -> None: """ Implementation of functionality of the API method `/cloudapi/account/update`. @@ -3486,6 +3502,7 @@ class DecortController(object): 'maxVDiskCapacity': disks_size_quota, 'name': name, 'sendAccessEmails': access_emails, + 'uniqPools': sep_pools, }, not_fail_codes=[404] ) @@ -3531,101 +3548,6 @@ class DecortController(object): self.set_changed() - ################################### - # GPU resource manipulation methods - ################################### - def gpu_attach(self, arg_vmid, arg_type, arg_mode): - """Attach GPU of specified type and mode to the VM identidied by ID. - - @param arg_vmid: ID of the VM. - @param arg_type: type of GPU to allocate. Valid types are: NVIDIA, AMD, INTEL or DUMMY. - @param arg_mode: GPU mode to requues. Valid modes are: VIRTUAL or PASSTHROUGH. - - @returns: non-zero integer ID of the attached vGPU resource on success. - """ - - self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "gpu_attach") - - if self.amodule.check_mode: - self.result['failed'] = False - self.result['changed'] = False - self.result['msg'] = ("gpu_attach() in check mode: attaching GPU of type {} & mode {} to VM ID {} was " - "requested.").format(arg_type, arg_mode, arg_vmid) - return 0 - - api_params = dict( - machineId=arg_vmid, - gpu_type=arg_type, - gpu_mode=arg_mode, - ) - - api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/machines/attachGpu", api_params) - # On success the above call will return here. On error it will abort execution by calling fail_json. - self.result['failed'] = False - self.result['changed'] = True - ret_vgpuid = int(api_resp.content) - - return ret_vgpuid - - def gpu_detach(self, arg_vmid, arg_vgpuid=-1): - """Detach specified vGPU resource from the VM identidied by ID. - - @param arg_vmid: ID of the VM. - @param arg_vgpuid: ID of the vGPU to detach. If -1 is specified, all vGPUs (if any) will be detached. - - @returns: True on success. On failure this method will abort playbook execution. - """ - - self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "gpu_detach") - - if self.amodule.check_mode: - self.result['failed'] = False - self.result['changed'] = False - self.result['msg'] = ("gpu_detach() in check mode: detaching GPU ID {} from VM ID {} was " - "requested.").format(arg_vgpuid, arg_vmid) - return True - - api_params = dict( - machineId=arg_vmid, - vgpuid=arg_vgpuid, - ) - - self.decort_api_call(requests.post, "/restmachine/cloudapi/machines/detachGpu", api_params) - # On success the above call will return here. On error it will abort execution by calling fail_json. - self.result['failed'] = False - self.result['changed'] = True - - return True - - def gpu_list(self, arg_vmid, arg_list_destroyed=False): - """Lists GPU resrouces (if any) attached to the specified VM. - - @param arg_vmid: ID of the VM. - @param arg_list_destroyed: flag to control listing of vGPU resources in DESTROYED state that were once - attached to this VM. - - @returns: list of GPU object dictionaries, currently attached to the specified VM. If there are no GPUs, - an emtpy list will be returned. - """ - - self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "gpu_list") - - api_params = dict( - machineId=arg_vmid, - list_destroyed=arg_list_destroyed, - ) - - ret_gpu_list = [] - - api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/machines/listGpu", api_params) - # On success the above call will return here. On error it will abort execution by calling fail_json. - self.result['failed'] = False - self.result['changed'] = True - if api_resp.status_code == 200: - ret_gpu_list = json.loads(api_resp.content.decode('utf8')) - - return ret_gpu_list['data'] - ################################### # Workflow callback stub methods - not fully implemented yet ################################### @@ -4864,12 +4786,15 @@ class DecortController(object): self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "k8s_find") + api_params = dict(includedeleted=True) + if k8s_id is None: + api_params.update(name=k8s_name, rgId=rg_id) + else: + api_params.update(by_id=k8s_id) + ret_k8s_id = 0 - api_params = dict(includedeleted=True,name=k8s_name,rgId=rg_id) ret_k8s_dict = None - - api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/k8s/list", api_params) if api_resp.status_code == 200: @@ -5003,6 +4928,22 @@ class DecortController(object): self.result['changed'] = True return + def k8s_check_new_worker_groups_params( + self, + worker_groups: list[dict[str, Any]] + ): + check_error = False + for new_wg_params in worker_groups: + for new_wg_required_param in ['num', 'cpu', 'ram', 'disk']: + if new_wg_params[new_wg_required_param] is None: + self.message( + f'Parameter "{new_wg_required_param}" is required' + f' for new worker group "{new_wg_params["name"]}"' + ) + check_error = True + if check_error: + self.exit(fail=True) + def k8s_provision(self, k8s_name, k8ci_id, rg_id, @@ -5031,11 +4972,14 @@ class DecortController(object): self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "k8s_provision") + self.k8s_check_new_worker_groups_params(worker_groups=[default_worker]) + if self.amodule.check_mode: self.result['failed'] = False self.result['msg'] = ("k8s_provision() in check mode. Provision k8s '{}' in RG ID {} " "was requested.").format(k8s_name, rg_id) return 0 + def_wg_name = default_worker['name'] def_wg_count = default_worker['num'] def_wg_cpu = default_worker['cpu'] @@ -5043,11 +4987,13 @@ class DecortController(object): def_wg_disk = default_worker['disk'] def_wg_sepid = default_worker['sep_id'] def_wg_pool = default_worker['pool'] - def_wg_ud = json.dumps(default_worker['ci_user_data']) if \ - "ci_user_data" in default_worker else None - def_wg_lab = default_worker['labels'] if "labels" in default_worker else None - def_wg_taints = default_worker['taints'] if "taints" in default_worker else None - def_wg_ann = default_worker['annotations'] if "annotations" in default_worker else None + def_wg_ud = ( + json.dumps(default_worker['ci_user_data']) + if default_worker['ci_user_data'] else None + ) + def_wg_lab = default_worker['labels'] + def_wg_taints = default_worker['taints'] + def_wg_ann = default_worker['annotations'] api_url = "/restmachine/cloudapi/k8s/create" api_params = dict(name=k8s_name, @@ -5143,7 +5089,7 @@ class DecortController(object): if self.k8s_info['techStatus'] != "STARTED": self.result['msg'] = ("k8s_workers_modify(): Can't modify with TechStatus other then STARTED") return - + wg_del_list = [] wg_add_list = [] wg_modadd_list = [] @@ -5154,14 +5100,19 @@ class DecortController(object): for rec in arg_k8swg['k8sGroups']['workers']: if rec['name'] not in wg_outer: wg_del_list.append(rec['id']) + for rec in arg_modwg: if rec['name'] not in wg_inner: wg_add_list.append(rec) - + self.k8s_check_new_worker_groups_params(worker_groups=wg_add_list) + for rec_inn in arg_k8swg['k8sGroups']['workers']: for rec_out in arg_modwg: if rec_inn['name'] == rec_out['name']: - if rec_inn['num'] != rec_out['num'] and rec_out['num'] != 0: + if ( + rec_out['num'] is not None + and rec_inn['num'] != rec_out['num'] + ): count = rec_inn['num']-rec_out['num'] cmp_list = [] if count > 0: @@ -5178,21 +5129,81 @@ class DecortController(object): self.result['changed'] = True if wg_add_list: for wg in wg_add_list: - api_params = dict(k8sId=self.k8s_id, - name=wg['name'], - workerNum=wg['num'], - workerCpu=wg['cpu'], - workerRam=wg['ram'], - workerDisk=wg['disk'], - workerSepId=wg['sep_id'] if "sep_id" in wg else None, - workerSepPool=wg['pool'] if "pool" in wg else None, - labels=wg['labels'] if "labels" in wg else None, - taints=wg['taints'] if "taints" in wg else None, - annotations=wg['annotations'] if "annotations" in wg else None, - userData=json.dumps(wg['ci_user_data']) if 'ci_user_data' in wg else None + api_params = { + 'k8sId': self.k8s_id, + 'name': wg['name'], + 'workerNum': wg['num'], + 'workerCpu': wg['cpu'], + 'workerRam': wg['ram'], + 'workerDisk': wg['disk'], + 'workerSepId': wg['sep_id'], + 'workerSepPool': wg['pool'], + 'labels': wg['labels'], + 'taints': wg['taints'], + 'annotations': wg['annotations'], + 'userData': ( + json.dumps(wg['ci_user_data']) + if wg['ci_user_data'] else None + ), + } + wg_add_response = self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/k8s/workersGroupAdd', + arg_params=api_params, + ) + self.set_changed() + audit_id = wg_add_response.text.strip('"') + task_link = ( + f'{self.controller_url}/portal/#/system/tasks/{audit_id}' + ) + params = {'auditId': audit_id} + + # average time to add a single worker group * reserve + wg_add_avg_time = 210 * 2 + wg_add_timeout = wg_add_avg_time * wg['num'] + task_schedule_timeout = 600 + sleep_interval = 5 + while True: + task_response = self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/tasks/get', + arg_params=params, + ) + response_data = task_response.json() + match response_data['status']: + case 'SCHEDULED': + if task_schedule_timeout <= 0: + self.message( + f'Time to schedule task' + f'to add worker group {wg["name"]}' + f'has been exceeded.' + f'\nTask details: {task_link}' ) - api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/k8s/workersGroupAdd", api_params) - self.result['changed'] = True + self.exit(fail=True) + time.sleep(sleep_interval) + task_schedule_timeout -= sleep_interval + case 'PROCESSING': + if wg_add_timeout <= 0: + self.message( + f'Time to add worker group {wg["name"]} ' + f'has been exceeded.' + f'\nTask details: {task_link}' + ) + self.exit(fail=True) + time.sleep(sleep_interval) + wg_add_timeout -= sleep_interval + case 'ERROR': + self.result['msg'] = ( + f'Adding worker group {wg["name"]} failed: ' + f'{response_data["error"]}.' + f'\nTask details: {task_link}' + ) + self.exit(fail=True) + case 'OK': + self.message( + f'Worker group {wg["name"]} created successful' + ) + break if wg_modadd_list: for wg in wg_modadd_list: for key in wg: @@ -5434,11 +5445,11 @@ class DecortController(object): "response {}.").format(g_id, api_resp.status_code, api_resp.reason) return ret_gr_id,ret_gr_dict - def group_find(self,bs_id,bs_info,group_id=0,group_name=""): + def group_find(self,bs_id,bs_info,group_id=None,group_name=""): self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "group_find") - if group_id == 0: + if not group_id: for group in bs_info['groups']: if group['name'] == group_name: return self._group_get_by_id(bs_id=bs_id, @@ -5488,43 +5499,31 @@ class DecortController(object): self.decort_api_call(requests.post, api_url, api_params) self.result['failed'] = False self.result['changed'] = True - self.need_update_group_info = True else: self.result['failed'] = False self.result['msg'] = ("group_resize_count(): no need resize Group ID {}.").format(gr_dict['id']) return - def group_update_hw(self,bs_id,gr_dict,arg_cpu,arg_disk,arg_name,arg_role,arg_ram): - - self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "group_update_hw") + @waypoint + def group_update(self,bs_id,gr_dict,arg_cpu,arg_disk,arg_name,arg_role,arg_ram): api_params=dict( serviceId=bs_id, compgroupId=gr_dict['id'], force=True, + cpu=arg_cpu, + ram=arg_ram, + role=arg_role, + disk=arg_disk, + name=arg_name, ) - if gr_dict['cpu'] != arg_cpu: - api_params.update({'cpu': arg_cpu}) - if gr_dict['ram'] != arg_ram: - api_params.update({'ram': arg_ram}) - if gr_dict['role'] != arg_role: - api_params.update({'role': arg_role}) - if gr_dict['disk'] != arg_disk: - api_params.update({'disk': arg_disk}) - if gr_dict['name'] != arg_name: - api_params.update({'name': arg_name}) - - api_url = "/restmachine/cloudapi/bservice/groupUpdate" - if len(api_params) > 3: - # - self.decort_api_call(requests.post, api_url, api_params) - self.result['failed'] = False - self.result['changed'] = True - self.need_update_group_info = True - else: - self.result['failed'] = False - self.result['msg'] = ("group_update_hw(): no need update Group ID {}.").format(gr_dict['id']) - return + self.decort_api_call( + arg_req_function=requests.post, + arg_api_name='/restmachine/cloudapi/bservice/groupUpdate', + arg_params=api_params, + ) + + self.set_changed() def group_update_net(self,bs_id,gr_dict,arg_net): @@ -5560,6 +5559,8 @@ class DecortController(object): self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "group_provision") + arg_network = arg_network or [] + api_url = "/restmachine/cloudapi/bservice/groupAdd" api_params = dict( serviceId = bs_id, @@ -6055,65 +6056,70 @@ class DecortController(object): self.result['msg'] = result_msg return - #lists from module and cloud - mod_backs_list = [back['name'] for back in mod_backends] - lb_backs_list = [back['name'] for back in lb_backends] - #ADD\DEL\UPDATE LISTS OF BACKENDS - del_list_backs = set(lb_backs_list).difference(mod_backs_list) - add_back_list = set(mod_backs_list).difference(lb_backs_list) - upd_back_list = set(lb_backs_list).intersection(mod_backs_list) - - #FE + if mod_backends is None: + upd_back_list = [back['name'] for back in lb_backends] + else: + #lists from module and cloud + mod_backs_list = [back['name'] for back in mod_backends] + lb_backs_list = [back['name'] for back in lb_backends] + #ADD\DEL\UPDATE LISTS OF BACKENDS + del_list_backs = set(lb_backs_list).difference(mod_backs_list) + add_back_list = set(mod_backs_list).difference(lb_backs_list) + upd_back_list = set(lb_backs_list).intersection(mod_backs_list) - if del_list_backs: - - self._lb_delete_backends( - del_list_backs, - lb_frontends - ) + #FE - if add_back_list: - self._lb_create_backends( - add_back_list, - mod_backends, - mod_servers - ) + if del_list_backs: + + self._lb_delete_backends( + del_list_backs, + lb_frontends + ) + + if add_back_list: + self._lb_create_backends( + add_back_list, + mod_backends, + mod_servers + ) if upd_back_list: - self._lb_update_backends( - upd_back_list, - lb_backends, - mod_backends, - mod_servers - ) + if mod_backends is not None or mod_servers is not None: + self._lb_update_backends( + upd_back_list, + lb_backends, + mod_backends, + mod_servers, + ) - mod_front_list = [front['name'] for front in mod_frontends] - lb_front_list = [front['name'] for front in lb_frontends] + if mod_frontends is not None: + mod_front_list = [front['name'] for front in mod_frontends] + lb_front_list = [front['name'] for front in lb_frontends] - del_list_fronts = set(lb_front_list).difference(mod_front_list) - add_list_fronts = set(mod_front_list).difference(lb_front_list) - upd_front_list = set(lb_front_list).intersection(mod_front_list) + del_list_fronts = set(lb_front_list).difference(mod_front_list) + add_list_fronts = set(mod_front_list).difference(lb_front_list) + upd_front_list = set(lb_front_list).intersection(mod_front_list) - if del_list_fronts: - self._lb_delete_fronts(del_list_fronts) - - #set bind_ip - if front_ha_ip != "": - bind_ip = front_ha_ip - - if front_ha_ip == "" and back_ha_ip != "": - bind_ip = back_ha_ip + if del_list_fronts: + self._lb_delete_fronts(del_list_fronts) - if front_ha_ip == "" and back_ha_ip == "": - if prime["frontendIp"] != "": - bind_ip = prime["frontendIp"] - else: - bind_ip = prime["backendIp"] + #set bind_ip + if front_ha_ip != "": + bind_ip = front_ha_ip + + if front_ha_ip == "" and back_ha_ip != "": + bind_ip = back_ha_ip + + if front_ha_ip == "" and back_ha_ip == "": + if prime["frontendIp"] != "": + bind_ip = prime["frontendIp"] + else: + bind_ip = prime["backendIp"] - if add_list_fronts: - self._lb_add_fronts(add_list_fronts,mod_frontends,bind_ip) - if upd_front_list: - self._lb_update_fronts(upd_front_list,lb_frontends,mod_frontends,bind_ip) + if add_list_fronts: + self._lb_add_fronts(add_list_fronts,mod_frontends,bind_ip) + if upd_front_list: + self._lb_update_fronts(upd_front_list,lb_frontends,mod_frontends,bind_ip) return diff --git a/wiki/6.0.0/Home.md b/wiki/6.0.0/Home.md new file mode 100644 index 0000000..2835851 --- /dev/null +++ b/wiki/6.0.0/Home.md @@ -0,0 +1,23 @@ +1. [Введение](./введение.md) + - [Введение](./введение.md#введение) + - [Системные требования](./введение.md#системные-требования) + - [Подготовка к работе](./введение.md#подготовка-к-работе) + - [Авторизация](./введение.md#авторизация) + - [Общие параметры модулей для авторизации](./введение.md#общие-параметры-модулей-для-авторизации) + - [Пример авторизации с помощью app_id и app_secret](./введение.md#пример-авторизации-с-помощью-app_id-и-app_secret) + - [Пример авторизации с помощью JSON Web Token](./введение.md#пример-авторизации-с-помощью-json-web-token) +1. Ansible модули DECORT: + - [Модуль decort_kvmvm](./модуль-decort_kvmvm.md) - управление виртуальными машинами + - [Модуль decort_osimage](./модуль-decort_osimage.md) - управление образами + - [Модуль decort_disk](./модуль-decort_disk.md) - управление дисками + - [Модуль decort_pfw](./модуль-decort_pfw.md) - управление правилами переадресации портов + - [Модуль decort_rg](./модуль-decort_rg.md) - управление ресурсными группами + - [Модуль decort_vins](./модуль-decort_vins.md) - управление внутренними сетями + - [Модуль decort_jwt](./модуль-decort_jwt.md) - получение авторизационного токена + - [Модуль decort_bservice](./модуль-decort_bservice.md) - управление базовыми службами + - [Модуль decort_group](./модуль-decort_group.md)- управление группами базовой службы + - [Модуль decort_k8s](./модуль-decort_k8s.md) - управление кластерами Kubernetes + - [Модуль decort_lb](./модуль-decort_lb.md) - управление балансировщиками нагрузки + - [Модуль decort_account_info](./модуль-decort_account_info.md) - получение информации об аккаунте + - [Модуль decort_account](./модуль-decort_account.md) - управление аккаунтами + - [Модуль decort_user_info](./модуль-decort_user_info.md) - получение информации о пользователе \ No newline at end of file diff --git a/wiki/6.0.0/введение.md b/wiki/6.0.0/введение.md new file mode 100644 index 0000000..9626538 --- /dev/null +++ b/wiki/6.0.0/введение.md @@ -0,0 +1,181 @@ +# Модули Ansible для управления облачными ресурсами в платформе DECORT +## Введение + +Настоящая документация содержит руководство пользователя по библиотеке модулей decort для Ansible. С помощью этих модулей Вы сможете управлять созданием и конфигурированием облачных ресурсов в платформе DECORT (Digital Energy Cloud Orchestration Technology). + +По каждому модулю есть своя документация, в которой вы можете найти список доступных действий, подробную информацию о входных параметрах и возвращаемых данных, а также примеры использования. + +## Системные требования +Убедитесь, что Ваша система соответствует требованиям для работы модуля DECORT. +Системные требования для работы модуля: +- Ansible 10.5.0 +- Python 3.10.12 +- PyJWT 2.9.0 Python module +- requests 2.32.3 Python module +- DynamiX Enterprise 4.1.0 + +## Подготовка к работе + +Для начала работы необходимо, чтобы Ansible было известно местоположение файлов модулей. Для этого необходимо: +- либо разместить директории **library** и **module_utils** в одной директории с плейбуками +- либо в рабочей директории, из которой будет запускаться Ansible, разместить файл **ansible.cfg**, в котором задать пути к файлам модулей, например: +``` +[defaults] +library=./library +module_utils=./module_utils +``` + +## Авторизация + +### Общие параметры модулей для авторизации + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ПараметрТипОписание
+ app_id + + (str) + + Идентификатор приложения, использующийся для подключения к контроллеру + облачной платформы DECORT в режиме authenticator: oauth2. + Данный параметр является обязательным для указанного режима. Если + параметр не задан в playbook, модуль будет использовать значение + переменной окружения DECORT_APP_ID. +
+ app_secret + + (str) + + Секретный ключ приложения, который используется для подключения к + контроллеру облачной платформы DECORT в режиме + authenticator: oauth2. Данный параметр является + обязательным для указанного режима. Так как он содержит секретную + информацию, то его не рекомендуется задавать непосредственно в + playbook. Если параметр не задан в playbook, то модуль будет + использовать значение переменной окружения + DECORT_APP_SECRET. +
+ authenticator + + (str) +
Значения: +
oauth2 +
jwt +
+ Режим аутентификации при подключении к контроллеру облачной платформы + DECORT. Обязательный параметр. +
+ controller_url + + (str) + + URL контроллера, соответствующего экземпляру облачной платформы + DECORT. Данный параметр является обязательным. +
+ jwt + + (str) + + JSON Web Token (JWT), который будет использоваться для подключения + к контроллеру облачной платформы DECORT в режиме + authenticator: jwt. Данный параметр является + обязательным для указанного режима. Так как он содержит + потенциально секретную информацию, а сам JWT, как правило, + имеет ограниченное время жизни, то его не рекомендуется задавать + непосредственно в playbook. Если этот параметр не определен в + playbook, то модуль будет использовать значение переменной + окружения DECORT_JWT. +
+ oauth2_url + + (str) + + URL авторизационного сервера, работающего по протоколу Oauth2, + который должен использоваться в режиме + authenticator: oauth2. Данный параметр является + обязательным для указанного режима. Если параметр не задан в + playbook, модуль будет использовать значение переменной + окружения DECORT_OAUTH2_URL. +
+ verify_ssl + + (bool) +
Default: true +
+ Позволяет отключить проверку SSL сертификатов при выполнении API + вызовов в адрес контроллера облачной инфраструктуры, например, + при работе с изолированной облачной инфраструктурой, использующей + самоподписанные сертификаты. Применяйте данный параметр с + осторожностью, предпочтительно в защищенных средах. +
+ +### Пример авторизации с помощью app_id и app_secret + +``` +- name: Example + hosts: localhost + tasks: + - name: Auth with app_id and app_secret + decort_module_name: + # Специфичные для модулей параметры упущены + # Пример демонстрирует только параметры для авторизации + app_id: "{{ app_id }}" + app_secret: "{{ app_secret }}" + authenticator: oauth2 + controller_url: "{{ controller_url }}" + oauth2_url: "{{ oauth2_url }}" +``` + +### Пример авторизации с помощью JSON Web Token + +``` +- name: Example + hosts: localhost + tasks: + - name: Auth with JWT + decort_module_name: + # Специфичные для модулей параметры упущены + # Пример демонстрирует только параметры для авторизации + authenticator: jwt + controller_url: "{{ controller_url }}" + jwt: "{{ jwt }}" +``` \ No newline at end of file diff --git a/wiki/6.0.0/модуль-decort_account.md b/wiki/6.0.0/модуль-decort_account.md new file mode 100644 index 0000000..528e5ce --- /dev/null +++ b/wiki/6.0.0/модуль-decort_account.md @@ -0,0 +1,992 @@ +# Модуль decort_account +## Обзор модуля + +Модуль **decort_account** предназначен для выполнения следующих действий над аккаунтом: +- **удалить в корзину** (см. [параметр state](#state) и [примеры](#в-корзину)) +- **удалить безвозвратно** (см. [параметр state](#state) и [примеры](#безвозвратно)) +- **восстановить из корзины** (см. [параметр state](#state) и [примеры](#восстановить-из-корзины)) +- **выключить/включить** (см. [параметр state](#state) и [примеры](#выключитьвключить)) +- **изменить права доступа** (см. [параметр acl](#acl) и [примеры](#изменить-права-доступа)) +- **изменить имя** (см. [параметр name](#name) и [примеры](#переименовать)) +- **изменить квоты** (см. [параметр quotas](#quotas) и [примеры](#изменить-квоты)) +- **выключить/включить отправку уведомлений о предоставлении доступа к ресурсам** (см. [параметр access_emails](#access_emails) и [примеры](#выключитьвключить-отправку-уведомлений-о-предоставлении-доступа-к-ресурсам)) +- **изменить доступные пулы СХД** (см. [параметр sep_pools](#sep_pools) и [примеры](#изменить-доступные-пулы-схд)) + +## Параметры модуля +Ниже приведен список параметров для модуля **decort_account** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ПараметрТипОписание
+ + access_emails + + + (bool) + + Выключение/включение отправки пользователям на эл. почту уведомлений о предоставлении доступа к ресурсам. +
+ + acl + + + (dict) + + Целевые права доступа. +
+ mode + + (str) +
Значения: +
match +
revoke +
update +
Default: update +
+ Режим изменения прав доступа для указанных пользователей. +
match - привести в соответствие для указанных + пользователей, удалить предоставленные для других. +
revoke - отозвать для указанных пользователей, + если предоставлены. +
update - привести в соответствие для указанных + пользователей, оставить без изменения предоставленные для + других. +
+ users + + (list) + + Список словарей, описывающих права доступа пользователей. +
Обязательный параметр. +
+ rights + + (str) +
Значения: +
R +
RCX +
ARCXDU +
Default: R +
+ Права доступа. +
При mode: revoke не используется. +
При mode: match и mode: update + права ARCXDU считаются соответствующими + правам CXDRAU. +
+ id + + (str) + + Идентификатор пользователя. +
Обязательный параметр. +
+ id + + (int) + + Идентификатор целевого аккаунта. +
Обязательный параметр, если не задан параметр + name. +
+ + name + + + (str) + + Имя целевого аккаунта. +
Может быть альтернативой параметру id, + за исключением случая, когда необходимо получить + информацию о безвозвратно удалённом объекте. +
Если задан совместно с параметром id, + то используется для переименования (целевое имя). +
+ + quotas + + + (dict) + + Целевые квоты. +
+ cpu + + (int) + + Количество виртуальных процессоров. +
-1 - удалить квоту. +
+ disks_size + + (int) + + Объём дисков в ГБ. +
-1 - удалить квоту. +
+ ext_traffic + + (int) + + Объём трафика внешних сетей. +
-1 - удалить квоту. +
+ gpu + + (int) + + Количество графических процессоров. +
-1 - удалить квоту. +
+ public_ip + + (int) + + Количество внешних IP-адресов. +
-1 - удалить квоту. +
+ ram + + (int) + + Объём оперативной памяти в МБ. +
-1 - удалить квоту. +
+ + sep_pools + + + (list) + + Список словарей, описывающих доступные пулы СХД. +
+ sep_id + + (int) + + Идентификатор системы хранения данных. +
+ pool_names + + (list) + + Список названий пулов системы хранения данных. +
+ + state + + + (str) +
Значения: +
absent +
absent_permanently +
confirmed +
disabled +
present +
Default: present +
+ Целевое состояние. +
absent - удалён в корзину, безвозвратно удалён + или не существует. Если существует и не удалён, то будет удалён + в корзину. +
absent_permanently - безвозвратно удалён или + не существует. Если существует и не удалён или удалён в корзину, + то будет безвозвратно удалён. +
При значениях absent и absent_permanently + использование других параметров модуля, вызывающих изменение объекта, + не допускается. +
confirmed - включён. Если выключен, то будет включён. + Если удалён в корзину, то будет восстановлен из корзины. +
disabled - выключен. Если включён, то будет выключен. + Если удалён в корзину, то будет восстановлен из корзины и выключен. +
present - существует и не удалён. Если удалён в + корзину, то будет восстановлен из корзины. +
+ +## Возвращаемые значения + +Модуль **decort_account** возвращает информацию об аккаунте в виде словаря `facts` со следующими ключами: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ acl + + list + + Список словарей, описывающих доступы пользователей. +
+ canBeDeleted + + bool + + Может ли быть удалён. +
+ right + + str + + Права. +
+ status + + str + + Статус. +
+ type + + str + + Тип. +
+ userGroupId + + str + + Идентификатор пользователя или группы пользователей. +
+ company + + str + + Название компании. +
+ companyurl + + str + + URL компании. +
+ computeFeatures + + list + + Список дополнительных возможностей гипервизора, доступных ВМ. +
+ computes_amount + + dict + + Количество ВМ по состоянию. +
+ started + + int + + Количество запущенных ВМ. +
+ stopped + + int + + Количество остановленных ВМ. +
+ cpu_allocation_parameter + + str + + Режим выделения ЦП. +
+ cpu_allocation_ratio + + str + + Коэффициент для режима выделения ЦП. +
+ createdBy + + str + + Идентификатор пользователя, который создал. +
+ createdTime + + int + + Unix-время создания. +
+ createdTime_readable + + str + + Дата и время создания. +
+ deactivationTime + + int + + Unix-время выключения. +
+ deactivationTime_readable + + str + + Дата и время выключения. +
+ deletedBy + + str + + Идентификатор пользователя, который удалил. +
+ deletedTime + + int + + Unix-время удаления. +
+ deletedTime_readable + + str + + Дата и время удаления. +
+ displayname + + str + + Отображаемое имя. +
+ id + + int + + Идентификатор. +
+ name + + str + + Имя. +
+ resourceLimits + + dict + + Квоты на ресурсы. +
+ CU_C + + int + + Количество виртуальных процессоров. +
+ CU_D + + int + + Объём диска в ГБ. +
+ CU_DM + + int + + Объём дисков в ГБ. +
+ CU_I + + int + + Количество внешних IP-адресов. +
+ CU_M + + float + + Объём оперативной памяти в МБ. +
+ CU_NP + + int + + Объём трафика внешних сетей. +
+ gpu_units + + int + + Количество графических процессоров. +
+ sendAccessEmails + + bool + + Отправка пользователям на эл. почту уведомлений о предоставлении доступа. +
+ status + + str + + Статус. +
+ uniqPools + + list + + Список доступных пулов СХД. +
+ updatedTime + + int + + Unix-время обновления. +
+ updatedTime_readable + + str + + Дата и время обновления. +
+ vins + + list + + Список идентификаторов внутренних сетей на уровне аккаунта. +
+ vinses_amount + + int + + Количество внутренних сетей. +
+ +## Примеры использования + +### Удалить + +#### В корзину +``` +- name: Example + hosts: localhost + tasks: + - name: Delete account + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + state: absent +``` + +#### Безвозвратно +``` +- name: Example + hosts: localhost + tasks: + - name: Delete account + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + state: absent_permanently +``` + +### Восстановить из корзины +``` +- name: Example + hosts: localhost + tasks: + - name: Restore account from recycle bin + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + state: present +``` + +### Выключить/включить + +#### Выключить +``` +- name: Example + hosts: localhost + tasks: + - name: Disable account + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + state: disabled +``` + +#### Включить +``` +- name: Example + hosts: localhost + tasks: + - name: Enable account + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + state: confirmed +``` + +### Изменить права доступа + +#### Отозвать +``` +- name: Example + hosts: localhost + tasks: + - name: Revoke user access rights + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + acl: + mode: revoke + users: + - id: "{{ user1_id }}" + - id: "{{ user2_id }}" +``` + +#### Обновить +``` +- name: Example + hosts: localhost + tasks: + - name: Update user access rights + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + acl: + mode: update + users: + - id: "{{ user1_id }}" + rights: R + - id: "{{ user2_id }}" + rights: RCX +``` + +#### Привести в соответствие +``` +- name: Example + hosts: localhost + tasks: + - name: Match user access rights + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + acl: + mode: match + users: + - id: "{{ user1_id }}" + rights: ARCXDU + - id: "{{ user2_id }}" + rights: RCX +``` + +### Переименовать +``` +- name: Example + hosts: localhost + tasks: + - name: Rename account + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + name: "{{ account_new_name }}" +``` + +### Изменить квоты + +#### На объём дисков +``` +- name: Example + hosts: localhost + tasks: + - name: Update account quota of disks size + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + quotas: + disks_size: 500 +``` + +#### На количество внешних IP-адресов +``` +- name: Example + hosts: localhost + tasks: + - name: Update account quota of public IP amount + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + quotas: + public_ip: 10 +``` + +### Выключить/включить отправку уведомлений о предоставлении доступа к ресурсам + +#### Выключить +``` +- name: Example + hosts: localhost + tasks: + - name: Disable sending access emails + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + access_emails: false +``` + +#### Включить +``` +- name: Example + hosts: localhost + tasks: + - name: Enable sending access emails + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + access_emails: true +``` + +### Изменить доступные пулы СХД +``` +- name: Example + hosts: localhost + tasks: + - name: Change available sep pools + decort_account: + # Параметры для авторизации упущены + id: "{{ account_id }}" + sep_pools: + - sep_id: 1 + pool_names: + - pool1 +``` diff --git a/wiki/6.0.0/модуль-decort_account_info.md b/wiki/6.0.0/модуль-decort_account_info.md new file mode 100644 index 0000000..ff5563d --- /dev/null +++ b/wiki/6.0.0/модуль-decort_account_info.md @@ -0,0 +1,3805 @@ +# Модуль decort_account_info +## Обзор модуля + +Модуль **decort_account_info** предназначен для получения следующей информации об аккаунте: +- **основная информация** (см. [возвращаемые значения](#основная-информация) и [примеры](#получение-основной-информации-об-аккаунте)) +- **используемые и зарезервированные ресурсы** (см. [параметр resource_consumption](#resource_consumption), [возвращаемые значения](#используемые-и-зарезервированные-ресурсы) и [примеры](#получение-информации-об-используемых-и-зарезервированных-ресурсах-аккаунта)) +- **ресурсные группы** (см. [параметр resource_groups](#resource_groups), [возвращаемые значения](#ресурсные-группы) и [примеры](#получение-информации-о-ресурсных-группах)) +- **виртуальные машины** (см. [параметр computes](#computes), [возвращаемые значения](#виртуальные-машины) и [примеры](#получение-информации-о-виртуальных-машинах)) +- **внутренние сети** (см. [параметр vinses](#vinses), [возвращаемые значения](#внутренние-сети) и [примеры](#получение-информации-о-внутренних-сетях)) +- **диски** (см. [параметр disks](#disks), [возвращаемые значения](#диски) и [примеры](#получение-информации-о-дисках)) +- **доступные образы** (см. [параметр images](#param_images), [возвращаемые значения](#образы) и [примеры](#получение-информации-об-образах)) +- **группы с плавающим IP-адресом** (см. [параметр flip_groups](#flip_groups), [возвращаемые значения](#группы-с-плавающим-ip-адресом) и [примеры](#получение-информации-о-группах-с-плавающим-ip-адресом)) +- **аудиты** (см. [параметр audits](#audits), [возвращаемые значения](#аудиты) и [примеры](#получение-информации-об-аудитах)) + +## Параметры модуля +Ниже приведен список параметров для модуля **decort_account_info** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ПараметрТипОписание
+ + audits + + + (bool) +
Default: false +
+ Получить информацию об аудитах. +
+ + computes + + + (dict) + + Получить информацию о виртуальных машинах, к которым имеет доступ пользователь, + с учётом заданных параметров вывода. +
Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {}. +
+ filter + + (dict) + + Фильтр. +
+ ext_net_id + + (int) + + По идентификатору внешней сети. +
+ ext_net_name + + (str) + + По имени внешней сети. +
+ id + + (int) + + По идентификатору. +
+ ip + + (str) + + По IP-адресу. +
+ name + + (str) + + По имени. +
+ rg_id + + (int) + + По идентификатору ресурсной группы. +
+ rg_name + + (str) + + По имени ресурсной группы. +
+ tech_status + + (str) +
Значения: +
BACKUP_RUNNING +
BACKUP_STOPPED +
DOWN +
MIGRATING +
PAUSED +
PAUSING +
SCHEDULED +
STARTED +
STARTING +
STOPPED +
STOPPING +
+ По техническому статусу. +
+ pagination + + (dict) + + Постраничный вывод. +
+ number + + (int) +
Default: 1 +
+ Номер страницы. +
+ size + + (int) + + Размер страниц. +
Обязательный параметр. +
+ sorting + + (dict) + + Сортировка. +
+ asc + + (bool) +
Default: true +
+ Сортировать по возрастанию. +
true - по возрастанию. +
false - по убыванию. +
+ field + + (str) +
Значения: +
cpus +
createdBy +
createdTime +
deletedBy +
deletedTime +
id +
name +
ram +
registered +
rgId +
rgName +
status +
techStatus +
totalDisksSize +
updatedBy +
updatedTime +
userManaged +
vinsConnected +
+ Название поля, по которому сортировать. +
Обязательный параметр. +
+ + disks + + + (dict) + + Получить информацию о неподключённых дисках, к которым имеет доступ пользователь, + с учётом заданных параметров вывода. +
Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {}. +
+ filter + + (dict) + + Фильтр. +
+ id + + (int) + + По идентификатору. +
+ name + + (str) + + По имени. +
+ size + + (int) + + По объёму. +
+ type + + (str) +
Значения: +
B +
D +
+ По типу. +
+ pagination + + (dict) + + Постраничный вывод. +
+ number + + (int) +
Default: 1 +
+ Номер страницы. +
+ size + + (int) + + Размер страниц. +
Обязательный параметр. +
+ sorting + + (dict) + + Сортировка. +
+ asc + + (bool) +
Default: true +
+ Сортировать по возрастанию. +
true - по возрастанию. +
false - по убыванию. +
+ field + + (str) +
Значения: +
id +
name +
pool +
sepId +
shareable +
sizeMax +
type +
+ Название поля, по которому сортировать. +
Обязательный параметр. +
+ + flip_groups + + + (dict) + + Получить информацию о группах с плавающим IP-адресом, к которым имеет + доступ пользователь, с учётом заданных параметров вывода. +
Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {}. +
+ filter + + (dict) + + Фильтр. +
+ ext_net_id + + (int) + + По идентификатору внешней сети. +
+ id + + (int) + + По идентификатору. +
+ ip + + (str) + + По IP-адресу. +
+ name + + (str) + + По имени. +
+ vins_id + + (int) + + По идентификатору внутренней сети. +
+ vins_name + + (str) + + По имени внутренней сети. +
+ pagination + + (dict) + + Постраничный вывод. +
+ number + + (int) +
Default: 1 +
+ Номер страницы. +
+ size + + (int) + + Размер страниц. +
Обязательный параметр. +
+ id + + (int) + + Идентификатор целевого аккаунта. +
Обязательный параметр, если не задан параметр + name. +
+ + images + + + (dict) + + Получить информацию об образах, которые доступны к использованию + в аккаунте, с учётом заданных параметров вывода. +
Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {}. +
+ filter + + (dict) + + Фильтр. +
+ id + + (int) + + По идентификатору. +
+ name + + (str) + + По имени. +
+ type + + (str) +
Значения: +
cdrom +
linux +
other +
virtual +
windows +
+ По типу. +
+ pagination + + (dict) + + Постраничный вывод. +
+ number + + (int) +
Default: 1 +
+ Номер страницы. +
+ size + + (int) + + Размер страниц. +
Обязательный параметр. +
+ sorting + + (dict) + + Сортировка. +
+ asc + + (bool) +
Default: true +
+ Сортировать по возрастанию. +
true - по возрастанию. +
false - по убыванию. +
+ field + + (str) +
Значения: +
UNCPath +
desc +
id +
name +
public +
size +
status +
type +
username +
+ Название поля, по которому сортировать. +
Обязательный параметр. +
+ name + + (str) + + Имя целевого аккаунта. +
Может быть альтернативой параметру id, + за исключением случая, когда необходимо получить + информацию о безвозвратно удалённом объекте. +
+ + resource_groups + + + (dict) + + Получить информацию о ресурсных группах, к которым имеет доступ пользователь, + с учётом заданных параметров вывода. +
Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {}. +
+ filter + + (dict) + + Фильтр. +
+ id + + (int) + + По идентификатору. +
+ name + + (str) + + По имени. +
+ status + + (str) +
Значения: +
CREATED +
DELETED +
DELETING +
DESTROYED +
DESTROYING +
DISABLED +
DISABLING +
ENABLED +
ENABLING +
MODELED +
RESTORING +
+ По статусу. +
+ vins_id + + (int) + + По идентификатору внутренней сети. +
+ vm_id + + (int) + + По идентификатору виртуальной машины. +
+ pagination + + (dict) + + Постраничный вывод. +
+ number + + (int) +
Default: 1 +
+ Номер страницы. +
+ size + + (int) + + Размер страниц. +
Обязательный параметр. +
+ sorting + + (dict) + + Сортировка. +
+ asc + + (bool) +
Default: true +
+ Сортировать по возрастанию. +
true - по возрастанию. +
false - по убыванию. +
+ field + + (str) +
Значения: +
createdBy +
createdTime +
deletedBy +
deletedTime +
id +
milestones +
name +
status +
updatedBy +
updatedTime +
vinses +
+ Название поля, по которому сортировать. +
Обязательный параметр. +
+ + resource_consumption + + + (bool) +
Default: false +
+ Получить информацию об используемых и зарезервированных ресурсах. +
+ + vinses + + + (dict) + + Получить информацию о внутренних сетях, к которым имеет доступ пользователь, + с учётом заданных параметров вывода. +
Чтобы получить информацию без использования параметров вывода, + необходимо задать пустой словарь {}. +
+ filter + + (dict) + + Фильтр. +
+ ext_ip + + (str) + + По внешнему IP-адресу. +
+ id + + (int) + + По идентификатору. +
+ name + + (str) + + По имени. +
+ rg_id + + (int) + + По идентификатору ресурсной группы. +
+ pagination + + (dict) + + Постраничный вывод. +
+ number + + (int) +
Default: 1 +
+ Номер страницы. +
+ size + + (int) + + Размер страниц. +
Обязательный параметр. +
+ sorting + + (dict) + + Сортировка. +
+ asc + + (bool) +
Default: true +
+ Сортировать по возрастанию. +
true - по возрастанию. +
false - по убыванию. +
+ field + + (str) +
Значения: +
computes +
createdBy +
createdTime +
deletedBy +
deletedTime +
externalIP +
extnetId +
freeIPs +
id +
name +
network +
priVnfDevId +
rgId +
rgName +
status +
updatedBy +
updatedTime +
+ Название поля, по которому сортировать. +
Обязательный параметр. +
+ +## Возвращаемые значения + +Модуль **decort_account_info** возвращает информацию об аккаунте в виде словаря `facts` со следующими ключами: + +### Основная информация + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ acl + + list + + Список словарей, описывающих доступы пользователей. +
+ canBeDeleted + + bool + + Может ли быть удалён. +
+ right + + str + + Права. +
+ status + + str + + Статус. +
+ type + + str + + Тип. +
+ userGroupId + + str + + Идентификатор пользователя или группы пользователей. +
+ company + + str + + Название компании. +
+ companyurl + + str + + URL компании. +
+ computeFeatures + + list + + Список дополнительных возможностей гипервизора, доступных ВМ. +
+ computes_amount + + dict + + Количество ВМ по состоянию. +
+ started + + int + + Количество запущенных ВМ. +
+ stopped + + int + + Количество остановленных ВМ. +
+ cpu_allocation_parameter + + str + + Режим выделения ЦП. +
+ cpu_allocation_ratio + + str + + Коэффициент для режима выделения ЦП. +
+ createdBy + + str + + Идентификатор пользователя, который создал. +
+ createdTime + + int + + Unix-время создания. +
+ createdTime_readable + + str + + Дата и время создания. +
+ deactivationTime + + int + + Unix-время выключения. +
+ deactivationTime_readable + + str + + Дата и время выключения. +
+ deletedBy + + str + + Идентификатор пользователя, который удалил. +
+ deletedTime + + int + + Unix-время удаления. +
+ deletedTime_readable + + str + + Дата и время удаления. +
+ displayname + + str + + Отображаемое имя. +
+ id + + int + + Идентификатор. +
+ name + + str + + Имя. +
+ resourceLimits + + dict + + Квоты на ресурсы. +
+ CU_C + + int + + Количество виртуальных процессоров. +
+ CU_D + + int + + Объём диска в ГБ. +
+ CU_DM + + int + + Объём дисков в ГБ. +
+ CU_I + + int + + Количество внешних IP-адресов. +
+ CU_M + + float + + Объём оперативной памяти в МБ. +
+ CU_NP + + int + + Объём трафика внешних сетей. +
+ gpu_units + + int + + Количество графических процессоров. +
+ sendAccessEmails + + bool + + Отправка пользователям на эл. почту уведомлений о предоставлении доступа. +
+ status + + str + + Статус. +
+ uniqPools + + list + + Список доступных пулов СХД. +
+ updatedTime + + int + + Unix-время обновления. +
+ updatedTime_readable + + str + + Дата и время обновления. +
+ vins + + list + + Список идентификаторов внутренних сетей на уровне аккаунта. +
+ vinses_amount + + int + + Количество внутренних сетей. +
+ +### Используемые и зарезервированные ресурсы + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ + resource_consumed + + + dict + + Используемые ресурсы. +
+ cpu + + int + + Количество виртуальных процессоров. +
+ disksize + + int + + Объём дисков в ГБ. +
+ extips + + int + + Количество внешних IP-адресов. +
+ exttraffic + + int + + Объём трафика внешних сетей. +
+ gpu + + int + + Количество графических процессоров. +
+ ram + + int + + Объём оперативной памяти в МБ. +
+ seps + + dict + + Объём дисков по пулам СХД. +
+ (идентификатор СХД) + + dict + + Пулы СХД. +
+ (название пула) + + dict + + Словарь пула СХД. +
+ disksize + + int + + Объём дисков в ГБ. +
+ resource_reserved + + dict + + Зарезервированные ресурсы. +
Структура словаря аналогична словарю + + resource_consumed + . +
+ +### Ресурсные группы + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ resource_groups + + list + + Список словарей, описывающих ресурсные группы. +
+ Computes + + dict + + Количество ВМ по состоянию. +
+ Started + + int + + Количество запущенных ВМ. +
+ Stopped + + int + + Количество остановленных ВМ. +
+ Resources + + dict + + Используемые и зарезервированные ресурсы. +
+ Consumed + + dict + + Используемые ресурсы. +
Структура словаря аналогична словарю + + resource_consumed + . +
+ Limits + + dict + + Квоты на ресурсы. +
+ cpu + + int + + Количество виртуальных процессоров. +
+ disksize + + int + + Объём дисков в ГБ. +
+ disksizemax + + int + + Объём диска в ГБ. +
+ extips + + int + + Количество внешних IP-адресов. +
+ exttraffic + + int + + Объём трафика внешних сетей. +
+ gpu + + int + + Количество графических процессоров. +
+ ram + + float + + Объём оперативной памяти в МБ. +
+ Reserved + + dict + + Зарезервированные ресурсы. +
Структура словаря аналогична словарю + + resource_consumed + . +
+ createdBy + + str + + Идентификатор пользователя, который создал. +
+ createdTime + + int + + Unix-время создания. +
+ createdTime_readable + + str + + Дата и время создания. +
+ deletedBy + + str + + Идентификатор пользователя, который удалил. +
+ deletedTime + + int + + Unix-время удаления. +
+ deletedTime_readable + + str + + Дата и время удаления. +
+ id + + int + + Идентификатор. +
+ milestones + + int + + Количество событий. +
+ name + + str + + Имя. +
+ status + + str + + Статус. +
+ updatedBy + + str + + Идентификатор пользователя, который обновил. +
+ updatedTime + + int + + Unix-время обновления. +
+ updatedTime_readable + + str + + Дата и время обновления. +
+ vinses + + int + + Количество внутренних сетей. +
+ +### Виртуальные машины + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ computes + + list + + Список словарей, описывающих виртуальные машины. +
+ accountId + + int + + Идентификатор аккаунта. +
+ accountName + + str + + Имя аккаунта. +
+ cpus + + int + + Количество виртуальных процессоров. +
+ createdBy + + str + + Идентификатор пользователя, который создал. +
+ createdTime + + int + + Unix-время создания. +
+ createdTime_readable + + str + + Дата и время создания. +
+ deletedBy + + str + + Идентификатор пользователя, который удалил. +
+ deletedTime + + int + + Unix-время удаления. +
+ deletedTime_readable + + str + + Дата и время удаления. +
+ id + + int + + Идентификатор. +
+ name + + str + + Имя. +
+ ram + + int + + Объём оперативной памяти в МБ. +
+ registered + + bool + + Зарегистрирована ли ВМ как используемая. +
+ rgId + + int + + Идентификатор ресурсной группы. +
+ rgName + + str + + Имя ресурсной группы. +
+ status + + str + + Статус. +
+ techStatus + + str + + Технический статус. +
+ totalDisksSize + + int + + Общий объём дисков. +
+ updatedBy + + str + + Идентификатор пользователя, который обновил. +
+ updatedTime + + int + + Unix-время обновления. +
+ updatedTime_readable + + str + + Дата и время обновления. +
+ vinsConnected + + int + + Количество подключенных внутренних сетей. +
+ +### Внутренние сети + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ vinses + + list + + Список словарей, описывающих внутренние сети. +
+ accountId + + int + + Идентификатор аккаунта. +
+ accountName + + str + + Имя аккаунта. +
+ computes + + int + + Количество виртуальных машин. +
+ createdBy + + str + + Идентификатор пользователя, который создал. +
+ createdTime + + int + + Unix-время создания. +
+ createdTime_readable + + str + + Дата и время создания. +
+ deletedBy + + str + + Идентификатор пользователя, который удалил. +
+ deletedTime + + int + + Unix-время удаления. +
+ deletedTime_readable + + str + + Дата и время удаления. +
+ externalIP + + str + + Внешний IP-адрес. +
+ extnetId + + int + + Идентификатор внешней сети. +
+ freeIPs + + int + + Количество свободных IP-адресов. +
+ id + + int + + Идентификатор. +
+ name + + str + + Имя. +
+ network + + str + + Адрес сети. +
+ priVnfDevId + + int + + Идентификатор виртуального маршрутизатора. +
+ rgId + + int + + Идентификатор ресурсной группы. +
+ rgName + + str + + Имя ресурсной группы. +
+ status + + str + + Статус. +
+ updatedBy + + str + + Идентификатор пользователя, который обновил. +
+ updatedTime + + int + + Unix-время обновления. +
+ updatedTime_readable + + str + + Дата и время обновления. +
+ +### Диски + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ disks + + list + + Список словарей, описывающих диски. +
+ id + + int + + Идентификатор. +
+ name + + str + + Имя. +
+ pool + + str + + Пул СХД. +
+ sepId + + int + + Идентификатор СХД. +
+ shareable + + bool + + Общий доступ. +
+ sizeMax + + int + + Объём. +
+ type + + str + + Тип. +
+ +### Образы + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ images + + list + + Список словарей, описывающих образы. +
+ UNCPath + + str + + Путь к файлу. +
+ desc + + str + + Описание. +
+ id + + int + + Идентификатор. +
+ name + + str + + Имя. +
+ public + + bool + + Общий доступ. +
+ size + + int + + Размер в ГБ. +
+ status + + str + + Статус. +
+ type + + str + + Тип. +
+ username + + str + + Имя пользователя. +
+ +### Группы с плавающим IP-адресом + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ flip_groups + + list + + Список словарей, описывающих группы с плавающим IP-адресом. +
+ clientType + + str + + Тип клиентов. +
+ connType + + str + + Тип соединения. +
+ createdBy + + str + + Идентификатор пользователя, который создал. +
+ createdTime + + int + + Unix-время создания. +
+ createdTime_readable + + str + + Дата и время создания. +
+ deletedBy + + str + + Идентификатор пользователя, который удалил. +
+ deletedTime + + int + + Unix-время удаления. +
+ deletedTime_readable + + str + + Дата и время удаления. +
+ desc + + str + + Описание. +
+ gid + + int + + Идентификатор ЦОД. +
+ id + + int + + Идентификатор. +
+ ip + + str + + IP-адрес. +
+ milestones + + int + + Количество событий. +
+ name + + str + + Имя. +
+ netId + + int + + Идентификатор сети. +
+ netType + + str + + Тип сети. +
+ netmask + + int + + Маска подсети (длина префикса). +
+ status + + str + + Статус. +
+ updatedBy + + str + + Идентификатор пользователя, который обновил. +
+ updatedTime + + int + + Unix-время обновления. +
+ updatedTime_readable + + str + + Дата и время обновления. +
+ +### Аудиты + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ audits + + list + + Список словарей, описывающих аудиты. +
+ call + + str + + Метод API. +
+ responsetime + + float + + Время отклика в секундах. +
+ statuscode + + int + + Код ответа. +
+ timestamp + + float + + Unix-время. +
+ timestamp_readable + + str + + Дата и время. +
+ user + + str + + Идентификатор пользователя. +
+ +## Примеры использования + +### Получение основной информации об аккаунте + +#### По идентификатору +``` +- name: Example + hosts: localhost + tasks: + - name: Get basic account info by ID + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" +``` + +#### По имени +``` +- name: Example + hosts: localhost + tasks: + - name: Get basic account info by name + decort_account_info: + # Параметры для авторизации упущены + name: "{{ account_name }}" +``` + +### Получение информации об используемых и зарезервированных ресурсах аккаунта +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with resource consumption + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + resource_consumption: true +``` + +### Получение информации о ресурсных группах + +#### Без использования параметров вывода +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with resource groups + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + resource_groups: {} +``` + +#### С фильтрацией по статусу +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with resource groups + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + resource_groups: + filter: + status: CREATED +``` + +#### С сортировкой по имени +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with resource groups + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + resource_groups: + sorting: + field: name +``` + +#### С постраничным выводом +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with resource groups + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + resource_groups: + pagination: + size: 2 +``` + +### Получение информации о виртуальных машинах + +#### Без использования параметров вывода +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with computes + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + computes: {} +``` + +#### С фильтрацией по IP-адресу +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with computes + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + computes: + filter: + ip: 192.168.1.2 +``` + +#### С сортировкой по имени +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with computes + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + computes: + sorting: + field: name +``` + +#### С постраничным выводом +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with computes + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + computes: + pagination: + size: 2 +``` + +### Получение информации о внутренних сетях + +#### Без использования параметров вывода +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with vinses + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + vinses: {} +``` + +#### С фильтрацией по идентификатору ресурсной группы +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with vinses + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + vinses: + filter: + rg_id: "{{ rg_id }}" +``` + +#### С сортировкой по времени создания +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with vinses + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + vinses: + sorting: + field: createdTime +``` + +#### С постраничным выводом +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with vinses + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + vinses: + pagination: + size: 2 +``` + +### Получение информации о дисках + +#### Без использования параметров вывода +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with disks + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + disks: {} +``` + +#### С фильтрацией по типу +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with disks + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + disks: + filter: + type: D +``` + +#### С сортировкой по объёму +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with disks + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + disks: + sorting: + field: sizeMax +``` + +#### С постраничным выводом +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with disks + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + disks: + pagination: + size: 2 +``` + +### Получение информации об образах + +#### Без использования параметров вывода +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with images + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + images: {} +``` + +#### С фильтрацией по типу +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with images + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + images: + filter: + type: linux +``` + +#### С сортировкой по статусу +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with images + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + images: + sorting: + field: status +``` + +#### С постраничным выводом +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with images + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + images: + pagination: + size: 2 +``` + +### Получение информации о группах с плавающим IP-адресом + +#### Без использования параметров вывода +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with flip groups + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + flip_groups: {} +``` + +#### С фильтрацией по IP-адресу +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with flip groups + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + flip_groups: + filter: + ip: 192.168.1.5 +``` + +#### С постраничным выводом +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with flip groups + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + flip_groups: + pagination: + size: 2 +``` + +### Получение информации об аудитах +``` +- name: Example + hosts: localhost + tasks: + - name: Get account info with audits + decort_account_info: + # Параметры для авторизации упущены + id: "{{ account_id }}" + audits: true +``` diff --git a/wiki/6.0.0/модуль-decort_bservice.md b/wiki/6.0.0/модуль-decort_bservice.md new file mode 100644 index 0000000..2348c45 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_bservice.md @@ -0,0 +1,92 @@ +# Модуль decort_bservice + +## Обзор модуля decort_bservice + +Базовая служба (Basic Service) это несколько групп виртуальных серверов (compute), создаваемых и управляемых как единое целое. + +Все compute(s) в группе имеют одни и те же характеристики (cpu/ram/boot disk size/OS image + сетевые подключения). Для разных групп эти характеристики могут быть разными. + +Группы в составе Basic Service могут иметь отношения parent-child с другими группами. Наличие таких отношений определяет последовательность запуска групп ("сначала parents"). + +На основе ресурсов, предоставляемых и управляемых через Basic Service, могут создаваться другие сервисы. + +`Для взаимодействия с группами виртуальных серверов используется модуль decort_group.` + +Модуль decort_bservice предназначен для управления базовыми службами, в которых находятся группы виртуальных серверов. +Данный модуль позволяет: +- Создавать Basic Service +- Удалять Basic Service (безвозвратно). +- Включать/выключать Basic Service +- Запускать Basic Service +- Запрашивать информацию о Basic Service. + + +## Параметры модуля decort_bservice + +Ниже в алфавитном порядке приведен полный список параметров для модуля decort_bservice. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на Вашем Ansible-сервере, можно получить командой: +`ansible-doc -t module decort_bservice` + + +| Параметр | Тип, допустимые значения | Описание | +| ------ | ------ | ------ | +| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит ресурсная группа. При идентификации базовой службы и ресурсной группы по именам (см. параметры `name` и `rg_name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.| +|account_name | (string) | Имя аккаунта, которому принадлежит ресурсная группа. При идентификации базовой службы и ресурсной группы по именам (см. параметры `name` и `rg_name`) должен быть задан либо идентификатор (см. `account_id`), либо имя аккаунта. Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. | +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.| +|app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.| +| authenticator | Значения:
`oauth2`
`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным. | +|controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должна быть создана (или уже существует) данная базовая служба. Данный параметр является обязательным.| +| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`
Данный параметр является обязательным для указанного режима.
Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в _playbook_.
Если этот параметр не определен в _playbook_, то модуль будет использовать значение переменной окружения `DECORT_JWT`. | +|oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`.| +|state | Значения: `absent`, `disabled`, `enabled`, `present`, `check`.
Default: `present`| Целевое состояние базовой службы. Значения `present` и `enabled` равнозначны.| +| started | (bool)
Default: `true` | Параметр, определяющий состояние добавленных виртуальных серверов в Basic Service. Запускать их, или нет. | +| name | (string) | Имя базовой службы. Данный параметр является обязательным при создании базовой службы и при изменении если не задан `id`. | +| sshuser | (string) | Имя пользователя, который будет создан на всех виртуальных серверах базовой службы. Используется в паре с `sshkey`. | +| sshkey | (string) | SSH ключ, который будет загружен на все виртуальные сервера базовой службы. Используется в паре с `sshuser`. | +| id | (int) | Уникальный целочисленный идентификатор базовой службы. Используется для поиска, изменения и удаления базовой службы. | +| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы базовой службы. | +| rg_name | (string) | Имя ресурсной группы базовой службы. | +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.
Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | + +## Возвращаемые значения модуля decort_bservice + +Модуль decort_bservice возвращает информацию о базовой службе в виде словаря facts со следующими ключами: + + +|Ключ | Тип данных | Описание| +| ------ | ------ | ------ | +|id | int | Уникальный целочисленный идентификатор базовой службы.| +|name | string | Имя базовой службы.| +| techStatus | string | Технический статус базовой службы. | +|state | string | Статус базовой службы.| +| rg_id | int | Уникальный целочисленный идентификатор ресурсной группы, в которой находится базовая служба.| +| account_id | int | Уникальный целочисленный идентификатор аккаунта, в котором находится ресурсная группа.| +| groups | list | Список словарей с информацией о группах базовой службы.| + + +## Пример использования модуля decort_bservice + +Данный пример создаёт базовую службу с именем databases. + +``` + - name: Create Basic Service + decort_bservice: + authenticator: jwt + controller_url: "{{ controller_url }}" + jwt: "{{ auth_token }}" + name: databases + rg_id: "{{ rg_id }}" + register: db_bservice +``` + +Данный пример удаляет базовую службу с названием databases. +``` + - name: Delete Basic Service + decort_bservice: + authenticator: jwt + controller_url: "{{ controller_url }}" + jwt: "{{ auth_token }}" + state: absent + name: databases + rg_id: "{{ rg_id }}" + register: db_bservice +``` \ No newline at end of file diff --git a/wiki/6.0.0/модуль-decort_disk.md b/wiki/6.0.0/модуль-decort_disk.md new file mode 100644 index 0000000..2c460ca --- /dev/null +++ b/wiki/6.0.0/модуль-decort_disk.md @@ -0,0 +1,177 @@ +# Модуль decort_disk +## Обзор модуля decort_disk + +Модуль decort_disk предназначен для управления дисками и позволяет производить с ними следующие действия: +- создавать +- удалять (в корзину или безвозвратно) +- восстановливать из корзины +- изменять: + - имя + - размер + - лимиты ввода/вывода + - включать/отключать общий доступ + + +Обратите внимание: + +- Загрузочный диск для виртуальной машины создаётся и подключается автоматически в процессе создания этой машины. +- Модуль decort_disk служит для управления дополнительными дисками (т.н. data-дисками); +- Подключение дополнительных дисков, созданных посредством decort_disk, к виртуальным машинам выполняется с помощью модуля управления виртуальными машинами (см. модуль decort_kvmvm). + +## Параметры модуля decort_disk + +Ниже в алфавитном порядке приведен полный список параметров для модуля decort_disk. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: +`ansible-doc -t module decort_disk` + + +| Параметр | Тип, допустимые значения | Описание | +| ------ | ------ | ------ | +| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр `name`) должно быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.| +|account_name | (string) | Имя аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр name) должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. | +| annotation | (string)
Default: `Disk by decort_disk` | Текстовое описание диска. Данный параметр является опциональным и учитывается только при создании диска, а при всех прочих операциях игнорируется.| +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.| +|app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.| +| authenticator | Значения:
`oauth2`
`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным. | +|controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный диск. Данный параметр является обязательным.| +|id | (int) | Уникальный целочисленный идентификатор диска. Соответствующий диск должен существовать (таким образом, с помощью id нельзя создать новый диск, а только управлять уже имеющимися). Если задан данный параметр, то параметры `name`, `account_name` и `account_id` игнорируются.| +| iops | (int)
Default: `2000` | Ограничение ввода/вывода диска. Используется при создании диска. | +| force_detach | (bool)
Default: `false` | Задаёт поведение платформы при попытке удалить диск, подключённый к виртуальной машине.
По умолчанию, удаление подключённых дисков не разрешается, и попытка удалить такой диск приведёт к аварийному завершению модуля. Чтобы изменить это поведение, явно установите `force_detach: true`. | +|jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt` Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.| +| limitIO | (dict) | Параметр, позволяющий ограничить скорость ввода/вывода диска как в iops, так и в байтах в секунду. Обратите внимание, что параметры с total не задаются вместе с read/write. Все возможные подпараметры можно увидеть в примерах. | +| name | (string) | Имя диска. Для идентификации диска требуется либо его `name` и информация об аккаунте (`account_id` или `account_name`), которому принадлежит диск, либо его `id`.| +|oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`.| +| permanently | (bool)
Default: `false` | Параметр, использующийся при удалении диска, при значении `true` - диск удалится навсегда, а при `false` - попадёт в корзину. | +| place_with | (int) | Идентификатор образа диска, из которого следует взять параметр `sep_id`, чтобы разместить данный диск на той же системе хранения данных, что и указанный образ диска. Данный параметр является опциональным и используется только на стадии создания диска. Если задан `place_with`, то `sep_id` игнорируется.| +| pool | (string) | Название пула на системе хранения данных, в рамках которой следует создать данный диск. Этот параметр используется только на стадии создания диска и игнорируется при операциях над уже существующими дисками. Параметр является опциональным, если не задан, то платформа будет использовать пул, который сконфигурирован на целевой системе хранения как пул по умолчанию. | +| reason | (string)
Default: `Managed by Ansible decort_disk` | Причина, по которой было выполнено какое-либо действие. В данном модуле используется только при удалении диска. | +| sep_id | (int) | Идентификатор системы хранения данных (Storage End-point). Данный параметр определяет систему хранения данных, на ресурсах которой создаётся диск. Используется только при создании диска и игнорируется при прочих операциях. Альтернативой данному параметру является `place_with`, позволяющий разместить диск на той же системе хранения, что и указанный образ диска, на базе которого создаётся виртуальная машина.| +| shareable | (bool)
Default: `false` | Включение/отключение общего доступа к диску. +| size | (int) | Размер диска в ГБ. Этот параметр является обязательным при создании диска. Если он задан для уже существующего диска, а текущий размер диска меньше заданного, то будет предпринята попытка увеличить размер диска. При прочих операциях данный параметр игнорируется.| +| state | (str)
Значения:
`present`
`absent`
Default: `present` | Целевое состояние диска. | +| type | (string)
Значения:
`B`
`D`
Default: `D` | Тип создаваемого диска. `B` - Boot/загрузочный, `D` - Data/с данными. | +| verify_ssl | (bool)
Default: `false` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.
Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | + +## Возвращаемые значения модуля decort_disk + +Модуль decort_disk возвращает информацию о диске в виде словаря facts со следующими ключами: + + +|Ключ | Тип данных | Описание| +| ------ | ------ | ------ | +| account_id | int | Уникальный целочисленный идентификатор аккаунта, которому принадлежит диск.| +| computes | dict | Словарь, в котором ключ - идентификатор, а значение - имя виртуальной машины, к которой в настоящий момент подключён диск. Если диск не подключён, то возвращается пустой словарь.| +| gid | int | Идентификатор физического кластера (Grid ID), на ресурсах которого создан диск.| +| id | int | Уникальный целочисленный идентификатор данного диска.| +| iotune | dict | Текущие ограничения ввода/вывода диска. | +| name | string | Имя диска. Обратите внимание, что имя диска не является уникальным с точки зрения системы хранения данных, на которой этот диск расположен.| +| pool | string | Имя пула на системе хранения данных, в котором размещаются ресурсы диска.| +|sep_id | int | Идентификатор системы хранения данных (Storage Endpoint), на которой размещаются ресурсы данного диска.| +| size | int | Размер диска в ГБ.| +| state | string | Текущий статус диска. | + + +## Пример использования модуля decort_disk + +В данном примере создаётся диск размером 50ГБ (`size: 50`), с ограничением ввода/вывода в 2000 iops, на ресурсах системы хранения данных под номером 1 (`sep_id: 1`) в пуле "data01". + +``` +- name: Manage disk + decort_disk: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + name: "DataDisk01" + size: 50 + account_name: "MyAccount" + sep_id: 1 + iops: 2000 + annotation: "Disk example" + pool: data01 + register: my_data_disk01 +``` +В следующих двух примерах для существующего диска с именем "DataDisk01" задаются все доступные лимиты на операции ввода/вывода. + +``` +- name: Manage disk + decort_disk: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + name: "DataDisk01" + account_name: "MyAccount" + limitIO: + read_bytes_sec: 10000 + write_bytes_sec: 5000 + read_iops_sec и write_iops_sec + read_iops_sec: 2500 + write_iops_sec: 1000 + read_bytes_sec_max: 11000 + write_bytes_sec_max: 6000 + read_iops_sec_max: 3000 + write_iops_sec_max: 1500 + size_iops_sec: 1000 + register: my_data_disk01 + +- name: Manage disk + decort_disk: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + name: "DataDisk01" + account_name: "MyAccount" + limitIO: + total_bytes_sec: 15000 + total_iops_sec: 3500 + total_bytes_sec_max: 17000 + total_iops_sec_max: 4500 + size_iops_sec: 1000 + register: my_data_disk01 +``` + +В данном примере выполняется восстановление удаленного диска с id 111 из корзины. + +``` +- name: Manage disk + decort_disk: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + id: 111 + size: 10 + register: my_data_disk01 +``` + +В данном примере выполняется переименование диска с id 111 на новое имя "NewExampleDisk". + +``` +- name: Manage disk + decort_disk: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + id: 111 + name: "NewExampleDisk" + size: 10 + register: my_data_disk01 +``` + +Здесь результат работы модуля decort_disk записывается в переменную my_data_disk01. Для получения идентификатора диска, например, при подключении его к виртуальной машине, следует воспользоваться показанной ниже конструкцией: + +``` +- name: Manage compute + decort_kvmvm: + << для краткости фрагмент опущен >> + data_disks: + - "{{ my_data_disk01.facts.id }}" + << для краткости фрагмент опущен >> +``` \ No newline at end of file diff --git a/wiki/6.0.0/модуль-decort_group.md b/wiki/6.0.0/модуль-decort_group.md new file mode 100644 index 0000000..d010816 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_group.md @@ -0,0 +1,105 @@ +# Модуль decort_group +## Обзор модуля decort_group +Модуль **decort_group** позволяет производить следующие действия над группами базовой службы: +- создать +- получить информацию +- запустить/остановить +- подключить/отключить сети (для существующей группы только внутренние сети) +- изменить + - имя + - объём загрузочного диска + - количество ВМ + - роль + - количество виртуальных процессоров + - объём ОЗУ +- удалить (безвозвратно) + +## Параметры модуля decort_group +Ниже приведен полный список параметров для модуля **decort_group**. + + +| Параметр | Тип, допустимые значения | Описание | +| ------ | ------ | ------ | +| account_id | (int) | Идентификатор аккаунта. При идентификации группы по имени (см. параметр `name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. | +| account_name | (string) | Имя аккаунта. При идентификации группы по имени (см. параметр `name`) должно быть задано либо имя, либо идентификатор аккаунта (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. | +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. | +| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. | +| authenticator | (str)
Значения:
`oauth2`
`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. | +| boot_disk | (int) | Обьём загрузочного диска. | +| bservice_id | (int) | Идентификатор базовой службы. Обязательный параметр. | +| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT. Данный параметр является обязательным. | +| count | (int) | Количество виртуальных машин. | +| cpu | (int) | Количество виртуальных процессоров. | +| driver | (string)
Значения:
`KVM_X86`
`SVA_KVM_X86`
Default: `KVM_X86` | Драйвер. | +| id | (int) | Идентификатор группы. | +| image_id | (int) | Идентификатор образа. | +| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt` Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`. | +| name | (str) | Имя группы.
Используется для идентификации группы, если не задан параметр `id`, а также для переименования группы, если параметр `id` задан. | +| networks | (list) | Список словарей, описывающих сети, которые должны быть подключены.
Ключи словаря:
• `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя) или `EXTNET` (внешняя)
• `id` (int) (обязательный) - идентификатор сети | +| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. | +| ram | (int) | Объём оперативной памяти. | +| role | (string) | Тег роли. | +| state | (str)
Значения:
`present`
`absent`
`started`
`stopped`
`check`
Default: `present` | +| timeoutStart | (int) | Время отсрочки запуска группы после создания в секундах. | +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | + +## Возвращаемые значения модуля decort_group + +Модуль **decort_group** возвращает информацию о группе в виде словаря facts со следующими ключами: + + +|Ключ | Тип данных | Описание| +| ------ | ------ | ------ | +| account_id | int | Идентификатор аккаунта. | +| Computes | list | Список словарей, содержащих информацию о виртуальных машинах группы.
Ключи словаря:
• `id` (int) - идентификатор ВМ
• `ipAddresses` (list) - список IP-адресов ВМ
• `name` (str) - имя ВМ
• `osUsers` (list) - список словарей, содержащих учётные данные пользователей ОС ВМ по умолчанию; ключи: `login` (str) и `password` (str) | +| id | int | Идентификатор группы.| +| name | string | Имя группы.| +| rg_id | int | Идентификатор ресурсной группы. | +| state | string | Состояние группы. | +| techStatus | string | Технический статус группы. | + +## Пример использования модуля decort_group + +Данный пример создаёт группу с именем `test_group`. +``` +- hosts: localhost + tasks: + - name: Create BS group + decort_group: + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + authenticator: oauth2 + boot_disk: 10 + bservice_id: 1823 + controller_url: "https://ds1.digitalenergy.online" + count: 2 + cpu: 2 + image_id: 518 + name: test_group + networks: + - type: VINS + id: 1987 + oauth2_url: "https://sso.digitalenergy.online" + ram: 2 + verify_ssl: false + register: group_test +``` + +Данный пример удаляет группу с именем `test_group`. + +``` +- hosts: localhost + tasks: + - name: Delete BS group + decort_group: + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + authenticator: oauth2 + bservice_id: 1823 + controller_url: "https://ds1.digitalenergy.online" + name: test_group + oauth2_url: "https://sso.digitalenergy.online" + state: absent + verify_ssl: False + register: group_test +``` \ No newline at end of file diff --git a/wiki/6.0.0/модуль-decort_jwt.md b/wiki/6.0.0/модуль-decort_jwt.md new file mode 100644 index 0000000..4cd124b --- /dev/null +++ b/wiki/6.0.0/модуль-decort_jwt.md @@ -0,0 +1,53 @@ +# Вспомогательный модуль для получения авторизационного JWT токена decort_jwt +## Обзор модуля decort_jwt + +Модуль **decort_jwt** предназначен для получения авторизационного токена JWT (JSON Web Token). Данный модуль может быть полезен при массовом создании ресурсов (например, виртуальных машин), так как позволяет оптимизировать количество API вызовов, инициируемых в адрес контроллера облачной платформы. + +По сути, данный модуль является провайдером информации и не управляет облачными ресурсами (всегда возвращает `changed: False`). +## Параметры модуля decort_jwt + +Ниже в алфавитном порядке приведен полный список параметров для модуля **decort_jwt**. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: +`ansible-doc -t module decort_jwt` + + +|Параметр | Тип, допустимые значения | Описание| +| ------ | ------ | ------ | +| app_id | (string) | Идентификатор приложения, использующийся для подключения к авторизационному серверу. Данный параметр является обязательным. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. | +| app_secret | (string) | Секретный ключ приложения, который используется для подключения к авторизационному серверу. Данный параметр является обязательным. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. | +| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, у которого запрашивается JWT. Данный параметр является обязательным. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. | +| validity | (int)
Default: `3600` | Срок действия JWT в секундах. | +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес авторизационного сервера, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.
Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | + +## Возвращаемые значения модуля decort_jwt + +При успешном выполнении модуль **decort_jwt** возвращает JWT-токен, который доступен по ключу `jwt` (str). + +## Пример использования модуля decort_jwt + +В данном примере сначала запрашивается JWT со сроком действия 1200 сек., а затем этот JWT используется для создания виртуальной машины в режиме авторизации `jwt` (подробнее о данном режиме см. в разделе «Примеры различных режимов авторизации»). +``` +- hosts: localhost + tasks: + - name: Obtain JWT with validity of 1200 sec from the OAuth2 provider + decort_jwt: + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + validity: 1200 + register: my_token +``` +``` + - name: Create VM in JWT authorization mode + decort_kvmvm: + authenticator: jwt + jwt: "{{ my_token.jwt }}" + controller_url: "https://cloud.digitalenergy.online" + name: NewVM01 + cpu: 2 + ram: 4096 + <<<дальнейшие детали опущены>>> +``` +Обратите внимание, как используется JWT при создании новой ВМ (в предположении, что результат выполнения task для модуля **decort_jwt** был сохранен в переменной my_token): +``` + jwt: "{{ my_token.jwt }}" +``` \ No newline at end of file diff --git a/wiki/6.0.0/модуль-decort_k8s.md b/wiki/6.0.0/модуль-decort_k8s.md new file mode 100644 index 0000000..c351148 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_k8s.md @@ -0,0 +1,108 @@ +# Модуль decort_k8s +## Обзор модуля decort_k8s + +Модуль **decort_k8s** предназначен для выполнения следующих действий над кластерами Kubernetes: +- создать +- получить информацию +- отключить/включить/запустить +- изменить группы Worker-узлов +- удалить (в корзину или безвозвратно) +- восстановить из корзины + +## Параметры модуля decort_k8s +Ниже приведен полный список параметров для модуля **decort_k8s**: + + +| Параметр | Тип, допустимые значения | Описание | +| ------ | ------ | ------ | +| account_id | (int) | Идентификатор аккаунта. | +| account_name | (string) | Имя аккаунта. | +| additionalSANs | (list) | Список дополнительных SAN (Subject Alternative Names) для использования в процессе автоматического выписывания сертификата Кластера Kubernetes. Можно использовать IP-адреса и доменные имена. +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. | +| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. | +| authenticator | (str)
Значения:
`oauth2`
`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. | +| cluster_conf | (dict) | Словарь с глобальными настройками и конфигурацией для всего кластера. Включает в себя такие настройки, как имя кластера, настройки DNS, методы аутентификации и другие конфигурации всего кластера. | +| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT. Данный параметр является обязательным. | +| description | (string)
Default: `Created by decort ansible module` | Описание кластера. | +| extnet_id | (int)
Default: `0` | Идентификатор внешней сети. Если задан `0`, то внешняя сеть выбирается автоматически. Если задан параметр `vins_id`, то значение данного параметра будет проигнорировано. Если задан `extnet_only: false`, то внешняя сеть будет подключена к создаваемой внутренней сети, а если `extnet_only: true`, то либо напрямую к каждому узлу кластера (если `with_lb: false`), либо напрямую к балансировщику нагрузки (если `with_lb: true`). | +| extnet_only | (bool)
Default: `false` | Не использовать внутреннюю сеть, подключать напрямую к внешней. | +| getConfig | (bool)
Default: `false` | Получить данные конфигурации для доступа к кластеру Kubernetes. | +| ha_lb | (bool)
Default: `false` | Использовать схему высокой доступности для создаваемого балансировщика нагрузки (если `with_lb: true`). | +| id | (int) | Идентификатор кластера Kubernetes. | +| init_conf | (dict) | Словарь для определения настроек и действий, которые должны быть выполнены перед запуском любого другого компонента в кластере. Позволяет настраивать такие процессы, как регистрация узла, настройка сети и другие задачи инициализации. +| join_conf | (dict) | Словарь для настройки поведения и параметров присоединения узла к кластеру. Включает в себя такие параметры, как control-plane-endpoint кластера, токен и certificate-key. | +| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`. | +| k8ci_id | (int) | Идентификатор конфигурации кластера Kubernetes. | +| kubeproxy_conf | (dict) | Словарь для настройки поведения и настроек Kube-proxy, отвечающего за сетевое проксирование и балансировку нагрузки внутри кластера. Включает в себя такие параметры, как режим прокси, диапазоны IP-адресов кластера и другие конфигурации, специфичные для Kube-proxy. | +| kublet_conf | (dict) | Словарь для настройки поведения и настроек Kubelet, который является агентом основного узла, работающим на каждом узле кластера. Включает в себя такие параметры, как IP-адрес узла, распределение ресурсов, политики вытеснения модулей и другие конфигурации, специфичные для Kubelet. | +| master_count | (int)
Default: `1` | Количество Master-узлов. | +| master_cpu | (int)
Default: `2` | Количество виртуальных процессоров на Master-узле. | +| master_disk | (int)
Default: `10` | Объём загрузочного диска на Master-узле. | +| master_pool | (str) | Пул СХД, заданной параметром `master_sepid`. | +| master_ram | (int)
Default: `2048` | Объём оперативной памяти на Master-узле. | +| master_sepid | (int) | Идентификатор СХД для Master-узла. Если не задан, то используется СХД образа Master-узла. | +| name | (string) | Имя кластера Kubernetes. | +| network_plugin | (str)
Значения:
`flannel`
`calico`
`weavenet`
Default: `flannel` | CNI plugin (модуль для управления сетевыми интерфейсами контейнера). Возможные значения могут быть ограничены в используемой конфигурации кластера Kubernetes (параметр `k8ci_id`) | +| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. | +| oidc_cert | (raw) | Сертификат X.509 для OIDC-провайдера. +| permanent | (bool)
Default: `false` | Если выполняется удаление, то выполнить безвозвратное удаление (минуя корзину). | +| rg_id | (int) | Идентификатор ресурсной группы. | +| rg_name | (str) | Имя ресурсной группы. | +| started | (bool)
Default: `true` | Запустить кластер.
Используется только для существующего кластера. | +| state | (string)
Значения:
`present`
`absent`
`enabled`
`disabled`
`check`
Default: `present` | Целевое состояние кластера. | +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | +| vins_id | (int) | Идентификатор внутренней сети. Если не задан, то будет создана новая внутренняя сеть. Если задан, то заданная внутренняя сеть должна иметь подключение к внешней сети. Если задано `extnet_only: true`, то параметр игнорируется. +| with_lb | (bool)
Default: `true` | Создание кластера Kubernetes с размещением Master-узлов за балансировщиком нагрузки. В ином случае каждый узел получит отдельный адрес из внешней сети. +| workers | (list) | Список словарей, описывающих группы Worker-узлов.
Ключи словаря:
• `annotations` (list) (необязательный) - список строк с annotations в формате: `key1=value1`
• `ci_user_data` (dict) (необязательный) - конфигурация для cloud-init
• `cpu` (int) (необязательный) - количество виртуальных процессоров на узле; обязателен при создании группы
• `disk` (int) (необязательный) - объём загрузочного диска на узле; обязателен при создании группы
• `labels` (list) (необязательный) - список строк с labels в формате: `label1=value1`
• `name` (string) (обязательный) - имя группы Worker-узлов
• `num` (int) (необязательный) - количество узлов; обязателен при создании группы
• `pool` (str) (необязательный) - пул СХД, заданной ключом `sep_id`; если не задан, то пул будет выбран платформой
• `ram` (int) (необязательный) - объём оперативной памяти на узле; обязателен при создании группы
• `sep_id` (int) (необязательный) - идентификатор СХД; если не задан, то используется СХД образа узла
• `taints` (list) (необязательный) - список строк с taints в формате: `key1=value1:NoSchedule` | + + +## Возвращаемые значения модуля decort_k8s + +Модуль **decort_k8s** возвращает информацию о кластере в виде словаря `facts` со следующими ключами: + + +| Ключ | Тип данных | Описание | +| ------ | ------ | ------ | +| account_id | int | Идентификатор аккаунта. | +| config | str | Kuber config кластера. +| id | int | Идентификатор кластера. | +| k8s_Masters | dict | Словарь с информацией о группе Master-узлов.
Ключи словаря:
• `cpu` (int) - количество виртуальных процессоров
• `detailedInfo` (list) - список словарей с информацией об узлах; ключи словаря: `id` (int) - идентификатор ВМ, `name` (str) - имя ВМ, `status` (str) - статус ВМ, `techStatus` (str) - технический статус ВМ
• `disk` (int) - объём загрузочного диска
• `id` (int) - идентификатор группы
• `name` (str) - имя группы
• `num` (int) - количество узлов
• `ram` (int) - объём оперативной памяти +| k8s_Workers | dict | Список словарей с информацией о группах Worker-узлов.
Ключи словаря:
• `cpu` (int) - количество виртуальных процессоров
• `detailedInfo` (list) - список словарей с информацией об узлах; ключи словаря: `id` (int) - идентификатор ВМ, `name` (str) - имя ВМ, `status` (str) - статус ВМ, `techStatus` (str) - технический статус ВМ
• `disk` (int) - объём загрузочного диска
• `id` (int) - идентификатор группы
• `labels` (list) - список строк с labels
• `name` (str) - имя группы
• `num` (int) - количество узлов
• `ram` (int) - объём оперативной памяти
• `taints` (list) - список строк с taints +| name | string | Имя кластера. | +| rg_id | int | Идентификатор ресурсной группы. | +| state | string | Статус кластера. | +| techStatus | string | Технический статус кластера. | +| vins_id | int | Идентификатор внутренней сети кластера. | + + +## Пример использования модуля decort_k8s + + +Пример создания кластера Kubernetes с именем `cluster-test` с получением Kuber config. +``` + - name: Create a k8s cluster named cluster-test + decort_k8s: + authenticator: jwt + controller_url: "https://ds1.digitalenergy.online" + getConfig: true + jwt: "{{ token.jwt }}" + k8ci_id: 18 + name: cluster-test + rg_id: 125 + workers: + - cpu: 10 + disk: 10 + name: wg1 + num: 1 + pool: null + ram: 1024 + sep_id: null + - cpu: 10 + disk: 10 + name: wg2 + num: 2 + pool: null + ram: 1024 + sep_id: null + register: k8s_cluster +``` \ No newline at end of file diff --git a/wiki/6.0.0/модуль-decort_kvmvm.md b/wiki/6.0.0/модуль-decort_kvmvm.md new file mode 100644 index 0000000..4360531 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_kvmvm.md @@ -0,0 +1,109 @@ +# Модуль decort_kvmvm +## Обзор модуля decort_kvmvm + +Модуль **decort_kvmvm** предназначен для выполнения следующих действий над виртуальными машинами: +- создать +- получить информацию +- остановить/приостановить/запустить +- подключить/отключить диски с данными +- подключить/отключить сети +- изменить + - объём загрузочного диска в большую сторону + - количество CPU + - объём ОЗУ + - тэги + - affinity метку + - affinity правила + - anti-affinity правила +- удалить (безвозвратно) + +## Параметры модуля decort_kvmvm + +Ниже в алфавитном порядке приведен полный список параметров для модуля **decort_kvmvm**. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: +`ansible-doc -t module decort_kvmvm` + + +| Параметр | Тип, допустимые значения | Описание | +| ------ | ------ | ------ | +| aaff_rule | (list) | Список словарей, описывающих anti-affinity правила.
Ключи словаря:
• `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)
• `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`
• `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)
• `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила
• `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`).
Чтобы очистить anti-affinity правила, нужно указать пустой список `[]`. | +| account_id | (int) | Идентификатор аккаунта. Этот параметр является опциональным и используется в сценариях, когда уже существующая ресурсная группа задается комбинацией `account_id` и `rg_name`. Если задан `account_id`, то `account_name` игнорируется.| +| account_name | (string) | Имя аккаунта. Этот параметр является опциональным и используется в сценариях, когда уже существующая ресурсная группа задается комбинацией `account_name` и `rg_name`. Если задан `account_id`, то `account_name` игнорируется. | +| aff_rule | (list) | Список словарей, описывающих affinity правила.
Ключи словаря:
• `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)
• `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`
• `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)
• `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила
• `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`).
Чтобы очистить affinity правила, нужно указать пустой список `[]`. | +| affinity_label | (str) | Метка affinity.
Чтобы очистить метку affinity, нужно указать пустую строку `""`. | +| annotation | (string) | Опциональное описание виртуальной машины. Этот параметр используется только при создании.| +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_APP_ID`.| +| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DCORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_APP_SECRET`.| +| authenticator | (str)
Значения:
`oauth2`
`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. | +| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ.
Если параметр не задан, размер будет равен размеру образа.
Если не заданы этот параметр и параметры `image_id` и `image_name`, то виртуальная машина будет создана без загрузочного диска. | +| chipset | (string)
Значения:
`q35`
`i440fx`
Default: `i440fx` | Эмулируемый чипсет. | +| ci_user_data | (dict) | конфигурация для cloud-init +| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данная виртуальная машина. Данный параметр является обязательным. | +| cpu | (int) | Количество виртуальных процессоров, выделяемых виртуальной машине. | +| data_disks | (list) | Список идентификаторов дисков, которые следует подключить к данной виртуальной машине как дополнительные.
Чтобы отключить все диски, нужно указать пустой список `[]`.| +| id | (int) | Уникальный цифровой идентификатор виртуальной машины. Этот параметр используется как один из методов идентификации существующей ВМ (альтернатива – по комбинации `name`, `rg_name` и `account_name`). Если при вызове модуля **decort_kvmvm** существующая ВМ идентифицируется по `id`, то параметры `account_id`, `account_name`, `rg_id` и `rg_name` игнорируются. | +| image_id | (int) | Уникальный цифровой идентификатор образа, на базе которого следует создать виртуальную машину.
При создании задать этот параметр или параметр `image_name`. При любых других операциях данные параметры игнорируются.
Если заданы оба этих параметра (`image_id` и `image_name`), то `image_name` игнорируется.
Если этот параметр и параметр `image_name` не заданы, то виртуальная машина будет создана без образа. | +| image_name | (string) | Название образа, на базе которого следует создать ВМ.
При создании требуется задать этот параметр или параметр `image_id`. При любых других операциях данные параметры игнорируются.
Если этот параметр и параметр `image_id` не заданы, то виртуальная машина будет создана без образа. | +| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_JWT`. +| name | (string) | Имя ВМ. Чтобы модуль **decort_kvmvm** мог управлять сервером по его названию, также необходимо задать комбинацию `account_name` и `rg_name` или `rg_id`.
Если для существующей ВМ указаны и `name`, и `id`, то параметр `name` используется для переименования. | +| network_order_changing | (bool)
Default:
`false` | Соблюдение очерёдности сетей при их изменении.
Если `true`, то сравнение списка уже подключённых к ВМ сетей со списком из параметра `networks` будет производится с учётом очерёдности сетей и, при выявлении несоответствия, сначала будет произведено отключение всех сетей от ВМ, а затем подключение сетей в соответствии с параметром `networks`.
Если `false`, то очерёдность при сравнении учитываться не будет. Соответственно, сети, которые имеются в списке параметра `networks` и уже подключены к ВМ, переподключаться не будут, что может кратно уменьшить время выполнения изменения сетей. | +| networks | (list) | Список словарей, описывающих сети ВМ.
Ключи словаря:
• `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя), `EXTNET` (внешняя), `VFNIC` (вирт. функция), `DPDK`, `EMPTY` (без подключения к сети)
• `id` (int) (необязательный) - идентификатор внутренней/внешней/DPDK сети или пула вирт. функций
• `ip_addr` (string) (необязательный) - IP-адрес, используемый для подключения к данной сети; применимо только для `VINS` и `EXTNET`.
ВМ не может одновременно быть подключена к сети DPDK и к сети другого типа.
Чтобы отключить все сети, нужно указать пустой список `[]`. | +| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. | +| pool | (str) | Пул СХД, заданной параметром `sep_id`. Если пул не задан, то он будет выбран платформой. | +| ram | (int) | Объем оперативной памяти в МБ, выделенной данной ВМ. Параметр является обязательным при создании. Если указать его для уже существующей ВМ, то будет выполнена попытка изменить объем выделенной памяти. | +| rg_id | (int) | Уникальный цифровой идентификатор уже существующей ресурсной группы, в которой будет создана новая или находится уже существующая ВМ. Данный параметр является одним из методов идентификации существующей РГ (альтернативой является задание комбинации `account_name` и `rg_name`).| +| rg_name | (string) | Имя уже существующей ресурсной группы, в которой будет создаа новая или находится уже существующая ВМ. Данный параметр является одним из методов идентификации существующей РГ, когда задается пара `account_name` и `rg_name` (альтернативой является задание `rg_id`). Если заданы и `rg_id`, и `rg_name`, то параметр `rg_name` игнорируется.| +| sep_id | (int) | Идентификатор СХД для загрузочного диска ВМ. Если не задан, то будет использоваться СХД образа.| +| ssh_key | (string) | Открытая часть SSH-ключа, который необходимо добавить на создаваемую ВМ для пользователя, заданного параметром `ssh_key_user`. Данный параметр применим только для ОС Linux, используется только при создании и игнорируется при других операциях. | +| ssh_key_user | (string) | Имя пользователя в гостевой ОС (только для Linux), для которого добавляется SSH-ключ, заданный параметром `ssh_key`. Данный параметр является обязательным, если задан `ssh_key`. Используется только при создании и игнорируется при других операциях. | +| state | (str)
Значения:
`present`
`absent`
`poweredon`
`poweredoff`
`halted`
`paused`
`check`
Default: `present` | Целевое состояние ВМ.
Значение `halted` - синоним к `poweredoff`. Значения `present` и `poweredon` равнозначны.
Значение `check` вызывает модуль в _read-only_ режиме и считывает характеристики существующей ВМ. | +| tag | (dict) | Словарь, пары ключ-значение которого, описывают тэги для ВМ.
Чтобы очистить теги, нужно указать пустой словарь `{}`.| +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.
Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | + +## Возвращаемые значения модуля decort_kvmvm + +Модуль **decort_kvmvm** возвращает информацию о виртуальной машине в виде словаря `facts` со следующими ключами: + + +| Ключ | Тип данных | Описание | +| ------ | ------ | ------ | +| account_id | int | Идентификатор аккаунта. | +| arch | string | Архитектура ВМ. | +| chipset | string | Эмулируемый чипсет. | +| cpu | int | Количество виртуальных процессоров. | +| data_disks | list | Список идентификаторов дисков с данными, подключенных к ВМ. | +| disk_size | int | Размер загрузочного диска в ГБ. | +| id | int | Идентификатор ВМ. | +| image_id | id | Идентификатор образа. +| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ, отсортированный по номеру слота PCI. | +| name | string | Имя ВМ. | +| password | string | Пароль пользователя ОС по умолчанию. | +| private_ips | list | Список IP-адресов на сетевых интерфейсах ВМ, которые подключены к внутренним сетям. | +| public_ips | list | Список IP адресов на сетевых интерфейсах ВМ, которые подключены к внешним сетям. | +| ram | int | Объём ОЗУ ВМ в МБ. | +| rg_id | int | Идентификатор ресурсной группы, которой принадлежит данная ВМ. | +| state | string | Состояние ВМ.| +| tags | dict | Словарь, пары ключ-значение которого, описывают тэги ВМ. +| tech_status | str | Технический статус ВМ. +| username | string | Имя пользователя ОС по умолчанию. | + +## Пример использования модуля decort_kvmvm + +В данном примере создается ВМ с именем MyFirstVM. +``` +- name: Сreate VM + decort_kvmvm: + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + authenticator: oauth2 + controller_url: "https://cloud.digitalenergy.online" + cpu: 2 + image_id: "{{ my_img.facts.id }}" + name: MyFirstVM + networks: + - type: VINS + id: "{{ my_vins.facts.id }}" + oauth2_url: "https://sso.digitalenergy.online" + ram: 4096 + rg_id: "{{ my_rg.facts.id }}" + register: my_vm +``` \ No newline at end of file diff --git a/wiki/6.0.0/модуль-decort_lb.md b/wiki/6.0.0/модуль-decort_lb.md new file mode 100644 index 0000000..3678b85 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_lb.md @@ -0,0 +1,893 @@ +# Модуль decort_lb +## Обзор модуля decort_lb + +Модуль **decort_lb** предназначен для выполнения следующих действий над балансировщиками нагрузки: +- создать +- получить информацию +- отключить/включить/запустить/перезапустить +- изменить конфигурации backend и frontend +- удалить (в корзину или безвозвратно) +- восстановить из корзины + +## Параметры модуля decort_lb +Ниже приведен полный список параметров для модуля **decort_lb**: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ПараметрТипОписание
+ account_id + + (int) + + Идентификатор аккаунта. +
+ account_name + + (str) + + Имя аккаунта. +
Может быть альтернативой параметру account_id. +
+ annotation + + (str) +
Default: Managed by Ansible module decort_lb +
+ Описание балансировщика. +
+ app_id + + (str) + + Идентификатор приложения, использующийся для подключения к контроллеру + облачной платформы DECORT в режиме authenticator: oauth2. + Данный параметр является обязательным для указанного режима. Если + параметр не задан в playbook, модуль будет использовать значение + переменной окружения DECORT_APP_ID. +
+ app_secret + + (str) + + Секретный ключ приложения, который используется для подключения к + контроллеру облачной платформы DECORT в режиме + authenticator: oauth2. Данный параметр является + обязательным для указанного режима. Так как он содержит секретную + информацию, то его не рекомендуется задавать непосредственно в + playbook. Если параметр не задан в playbook, то модуль будет + использовать значение переменной окружения + DECORT_APP_SECRET. +
+ authenticator + + (str) +
Значения: +
oauth2 +
jwt +
+ Режим аутентификации при подключении к контроллеру облачной платформы + DECORT. Обязательный параметр. +
+ backends + + (list) + + Список словарей, описывающих конфигурации backend. +
+ algorithm + + (str) +
Значения: +
leastconn +
roundrobin +
static-rr +
Default: roundrobin +
+ Используемый алгоритм. +
+ + default_settings + + + (dict) + + Cловарь, описывающий параметры по умолчанию для backend-серверов. +
+ downinter + + (int) +
Default: 1000 +
+ Интервал в миллисекундах между двумя последовательными проверками + доступности сервера, который считается недоступным. +
+ fall + + (int) +
Default: 2 +
+ Количество последовательных неудачных проверок доступности, после + которых сервер, ранее считавшийся доступным, начинает считаться + недоступным и временно исключается из схемы балансировки. +
+ inter + + (int) +
Default: 5000 +
+ Интервал в миллисекундах между двумя последовательными проверками + доступности сервера, который считается доступным. +
+ maxconn + + (int) +
Default: 250 +
+ Лимит одновременных подключений к серверу. При достижении этого лимита + сервер временно исключается из схемы балансировки. +
+ maxqueue + + (int) +
Default: 256 +
+ Лимит соединений, ожидающих в очереди. Когда этот предел будет + достигнут, все последующие подключения будут перенаправлены + на другие серверы. +
+ rise + + (int) +
Default: 2 +
+ Количество проверок, которые должен пройти сервер, считавшийся + недоступным, чтобы начать считаться доступным и снова быть + включенным в схему балансировки. +
+ slowstart + + (int) +
Default: 60000 +
+ Интервал в миллисекундах с момента когда сервер начинает считаться + доступным, по истечении которого количество фактически разрешенных + подключений к этому серверу будет возвращено до 100% от + установленного лимита. +
+ weight + + (int) +
Default: 100 +
+ Вес сервера для использования в алгоритмах балансировки. +
+ name + + (str) + + Название backend. Обязательный параметр. +
+ controller_url + + (str) + + URL контроллера, соответствующего экземпляру облачной платформы + DECORT. Данный параметр является обязательным. +
+ ext_net_id + + (int) + + Идентификатор внешней сети. +
Может быть не задан, если задан vins_id - + в таком случае балансировщик будет подключён только к + внутренней сети. +
+ + frontends + + + (list) + + Список словарей, описывающих конфигурации frontend. +
+ backend + + (str) + + Название используемого backend. Обязательный параметр. +
+ bindings + + (list) + + Список словарей, описывающих конфигурации binding. +
+ address + + (str) + + IP-адрес. +
Если не задан, то будет использоваться основной IP-адрес + балансировщика во внешней сети или, если подключена только + внутренняя сеть, основной IP-адрес балансировщика во внутренней сети. +
+ name + + (str) + + Название. Обязательный параметр. +
+ port + + (int) +
Значения: +
1-65535 +
+ Порт. Обязательный параметр. +
+ ha_lb + + bool +
Default: false +
+ Использовать схему высокой доступности для создаваемого балансировщика. +
+ jwt + + (str) + + JSON Web Token (JWT), который будет использоваться для подключения + к контроллеру облачной платформы DECORT в режиме + authenticator: jwt. Данный параметр является + обязательным для указанного режима. Так как он содержит + потенциально секретную информацию, а сам JWT, как правило, + имеет ограниченное время жизни, то его не рекомендуется задавать + непосредственно в playbook. Если этот параметр не определен в + playbook, то модуль будет использовать значение переменной + окружения DECORT_JWT. +
+ lb_id + + (int) + + Идентификатор балансировщика нагрузки. +
+ lb_name + + (str) + + Имя балансировщика. +
+ oauth2_url + + (str) + + URL авторизационного сервера, работающего по протоколу Oauth2, + который должен использоваться в режиме + authenticator: oauth2. Данный параметр является + обязательным для указанного режима. Если параметр не задан в + playbook, модуль будет использовать значение переменной + окружения DECORT_OAUTH2_URL. +
+ permanently + + (bool) +
Default: false +
+ Если выполняется удаление, то выполнить безвозвратное удаление + (минуя корзину). +
+ rg_id + + (int) + + Идентификатор ресурсной группы. +
+ rg_name + + (str) + + Имя ресурсной группы. +
В комбинации с заданным аккаунтов может быть альтернативой + параметру rg_id +
+ servers + + (list) + + Список словарей, описывающих конфигурации backend-серверов. +
+ address + + (str) + + IP-адрес. Обязательный параметр. +
+ backends + + (list) + + Список словарей, описывающих параметры backend-сервера для разных + конфигураций backend. +
Обязательный параметр. +
+ check + + (str) +
Значения: +
enabled +
disabled +
Default: enabled +
+ Проверка доступности сервера. +
+ name + + (str) + + Название конфигурации backend. Обязательный параметр. +
+ port + + (int) +
Значения: +
1-65535 +
+ Порт. Обязательный параметр. +
+ server_settings + + (dict) + + Словарь, описывающий параметры backend-сервера. +
Ключи данного словаря аналогичны ключам словаря + + default_settings + . +
+ name + + (str) + + Название. Обязательный параметр. +
+ state + + (str) +
Значения: +
present +
absent +
enabled +
disabled +
restart +
Default: present +
+ Целевое состояние балансировщика нагрузки. +
Выполнение с state=restart позволяет выполнить + перезапуск балансировщика, соответственно, всегда возвращает + changed: true. +
Значения present и enabled равнозначны + и соответствуют включённому и запущенному балансировщику. +
+ verify_ssl + + (bool) +
Default: true +
+ Позволяет отключить проверку SSL сертификатов при выполнении API + вызовов в адрес контроллера облачной инфраструктуры, например, + при работе с изолированной облачной инфраструктурой, использующей + самоподписанные сертификаты. Применяйте данный параметр с + осторожностью, предпочтительно в защищенных средах. +
+ vins_id + + (int) + + Идентификатор внутренней сети. +
Может быть не задан, если задан ext_net_id - + в таком случае балансировщик будет подключён только к + внешней сети. +
+ vins_name + + (str) + + Имя внутренней сети. +
В комбинации с заданной РГ может быть альтернативой для + параметра vins_id. +
+ +## Возвращаемые значения модуля decort_lb + +Модуль **decort_lb** возвращает информацию о балансировщике в виде словаря `facts` со следующими ключами: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ backends + + list + + Список словарей, описывающих конфигурации backend. +
+ algorithm + + str + + Используемый алгоритм. +
+ name + + str + + Название конфигурации backend. +
+ serverDefaultSettings + + dict + + Cловарь, описывающий параметры по умолчанию для backend-серверов. +
Ключи данного словаря аналогичны ключам словаря + + default_settings + . +
+ servers + + list + + Список словарей, описывающих конфигурации backend-серверов. +
+ address + + str + + IP-адрес. +
+ check + + str + + Проверка доступности сервера. +
+ name + + str + + Название. +
+ port + + int + + Порт. +
+ serverSettings + + dict + + Cловарь, описывающий параметры backend-сервера. +
Ключи данного словаря аналогичны ключам словаря + + default_settings + . +
+ frontends + + list + + Список словарей, описывающих конфигурации frontend. +
Ключи данного словаря аналогичны ключам словарей списка + + frontends + . +
+ gid + + int + + Идентификатор физического кластера (Grid ID). +
+ id + + int + + Идентификатор балансировщика. +
+ name + + str + + Имя балансировщика. +
+ rg_id + + int + + Идентификатор ресурсной группы. +
+ state + + str + + Статус балансировщика. +
diff --git a/wiki/6.0.0/модуль-decort_osimage.md b/wiki/6.0.0/модуль-decort_osimage.md new file mode 100644 index 0000000..0574bc9 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_osimage.md @@ -0,0 +1,131 @@ +# Модуль decort_osimage +## Обзор модуля decort_osimage + +Модуль decort_osimage предназначен для выполнения следующих действий над образами, созданными в облачной платформе DECORT: +- шаблонные образы: + - создать + - получить информацию + - изменить имя + - удалить +- виртуальные образы + - создать + - получить информацию + - изменить + - имя + - целевой образ + +## Параметры модуля decort_osimage +Ниже приведен полный список параметров для модуля decort_osimage. + +| Параметр | Тип, допустимые значения | Описание | +| ------ | ------ | ------ | +| account_Id | (int) | Уникальный целочисленный идентификатор аккаунта. Используется для поиска образов, а тажке для их создания. | +| account_name | (string) | Имя аккаунта. Используется для получения уникального целочисленного идентификатора аккаунта. | +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. | +| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. | +| authenticator | (str)
Значения:
`oauth2`
`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. | +| boottype | (string)
Default: `uefi` | Тип загрузки образа. Используется при создании образа.| +| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) образ. Данный параметр является обязательным. | +| drivers | (string)
Default: `KVM_X86` | Тип виртуальных машин, подходящих для образа. Используется при создании образа.| +| hotresize | (bool)
Default: `false` | Поддерживает ли образ "горячее" изменение размера. По умолчанию установлено `false`. Используется при создании образа операционной системы. | +| image_id | (int) | Идентификатор шаблонного образа. +| image_name | (str) | Имя шаблонного образа. +| image_password | (string) | Опциональный пароль для образа. Используется при создании образа.| +| image_username | (string) | Опциональное имя пользователя для образа. Используется при создании образа. | +| imagetype | (string)
Default: `linux` | Тип образа. Используется при создании образа.| +| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.| +| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. | +| passwordDL | (string) | Пароль для скачивания по URL-адресу. Используется при создании образа. | +| pool | (str) | Имя пула СХД. Используется для поиска существующего образа. +| poolName | (string) | Имя пула СХД. Используется при создании образа. | +| sepId | (integer) | Уникальный целочисленный идентификатор СХД. Используется при создании образа. | +| sep_id | (int) | Идентификатор СХД. Используется для поиска существующего образа. +| state | (string)
Значения:
`present`
`absent`
Default: `present` | Целевое состояние образа. `present` - существует, `absent` - удалён. | +| url | (string) | URL-адрес, с которого будет загружен образ. Используется при создании образа.| +| usernameDL | (string) | Имя пользователя для загрузки образа с заданного URL-адреса. Используется при создании образа. | +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | +| virt_id | (integer) | Уникальный целочисленный идентификатор виртуального образа. Может использоваться для получения информации о виртуальном образе, а также для привязки к нему другого образа.| +| virt_name | (string) | Имя виртуального образа. Используется для получения `virt_id`, а в последствии информации о виртуальном образе, а также для создания виртуального образа и привязки к нему другого образа.| + + +## Возвращаемые значения модуля decort_osimage + +Модуль decort_osimage возвращает информацию об образе в виде словаря facts со следующими ключами: + + +| Ключ | Тип данных | Описание | +| ------ | ------ | ------ | +| accountId | int | Идентификатор аккаунта. +| id | int | Уникальный целочисленный идентификатор данного образа. | +| linkto | int | Уникальный целочисленный идентификатор образа, который привязан к данному виртуальному. | +| name | string | Имя образа. | +| pool | string | Имя пула на системе хранения данных, в котором находится данный образ.| +| sep_id | int | Идентификатор системы хранения данных, на которой хранится данный образ. | +| size | int | Размер образа в ГБ. | +| state | string | Текущий статус образа. | +| type | string | Тип образа. | + + + +## Пример использования модуля decort_osimage + + +Пример создания шаблонного образа с операционной системой Alpine Linux. +``` + - name: Create template image + decort_osimage: + account_Id: 12345 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + authenticator: oauth2 + controller_url: "https://ds1.digitalenergy.online" + image_name: alpine_linux_3.19.1 + url: https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/cloud/nocloud_alpine-3.19.1-x86_64-uefi-cloudinit-r0.qcow2 + verify_ssl: false + register: osimage +``` + +Пример получения информации о существующем шаблонном образе по его имени. + +``` + - name: Get template image + decort_osimage: + account_Id: 12345 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + authenticator: oauth2 + controller_url: "https://ds1.digitalenergy.online" + image_name: alpine_linux_3.19.1 + verify_ssl: false + register: osimage +``` + +Пример создания виртуального образа. Также в случае, если виртуальный образ уже существует, но к нему привязан другой шаблонный образ, он привяжет к себе указанный в примере шаблонный образ. + +``` + - name: Create virtual image + decort_osimage: + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + authenticator: oauth2 + controller_url: "https://ds1.digitalenergy.online" + image_name: alpine_linux_3.19.1 + virt_name: alpine_last + register: osimage +``` +Обратите внимание, что в данном примере можно использовать как `image_name`, так и `image_id`. Также можно использовать либо `virt_name`, либо `virt_id`. + +Пример переименования образа. + +``` + - name: Rename template image + decort_osimage: + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + authenticator: oauth2 + controller_url: "https://ds1.digitalenergy.online" + image_name: alpine_linux_3.19.1_new_name + image_id: 54321 + register: osimage +``` + diff --git a/wiki/6.0.0/модуль-decort_pfw.md b/wiki/6.0.0/модуль-decort_pfw.md new file mode 100644 index 0000000..65ccf02 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_pfw.md @@ -0,0 +1,76 @@ +# Модуль decort_pfw +## Обзор модуля decort_pfw + +Модуль **decort_pfw** предназначен для настройки правил переадресации портов (port forwarding, destination NAT) на виртуальном маршрутизаторе заданной внутренней сети для заданной виртуальной машины. +Модуль поддерживает выполнение следующих действий над правилами: +- добавить +- получить информацию +- удалить + +## Параметры модуля decort_pfw + +Ниже в алфавитном порядке приведен полный список параметров для модуля **decort_pfw**. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: +`ansible-doc -t module decort_pfw` + + +| Параметр | Тип, допустимые значения | Описание| +| ------ | ------ | ------ | +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. | +| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. | +| authenticator | (str)
Значения:
`oauth2`
`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. | +| compute_id | (int) | Идентификатор виртуальной машины. IP-адрес, который данная ВМ имеет во внутренней сети, заданной параметром `vins_id`, будет использоваться как внутренний IP-адрес в правилах. Обязательный параметр. | +| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT. Данный параметр является обязательным. | +| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`. | +| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. | +| rules | (list) | Список словарей, описывающих правила переадресации портов для заданной ВМ (параметр `compute_id`) на виртуальном маршрутизаторе заданной внутренней сети (параметр `vins_id`).
Ключи словаря:
• `local_port` (int) (обязательный) - внутренний порт; значения: от `1` до `65535`
• `proto` (str) (обязательный) - протокол; значения: `tcp` или `udp`
• `public_port_end` (int) (необязательный) - верхняя граница диапазона внешних портов; значения: от значения ключа `public_port_start` до `65535`;
• `public_port_start` (int) (обязательный) - нижняя граница диапазона внешних портов; значения: от `1` до `65535` | +| state | (str)
Значения:
`present`
`absent`
Default: `present` | Целевое состояние правил.
Если `state=absent`, то, независимо от содержания параметра `rules`, будут удалены все правила для заданной ВМ (параметр `compute_id`) на виртуальном маршрутизаторе заданной внутренней сети (параметр `vins_id`). | +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.
Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | +| vins_id | (int) | Идентификатор внутренней сети, на виртуальном маршрутизаторе которой настраиваются правила переадресации портов. Заданная ВМ (параметр `compute_id`) должна быть подключена к этой сети. Обязательный параметр. | + + +## Возвращаемые значения модуля decort_pfw + +Модуль **decort_pfw** возвращает информацию о правилах переадресации портов и сопутствующую информацию в виде словаря `facts` со следующими ключами: + + +|Ключ | Тип данных | Описание| +| ------ | ------ | ------ | +| compute_id | int | Идентификатор ВМ. | +| public_ip | string | IP-адрес во внешней сети, настроенный на виртуальном маршрутизаторе внутренней сети. | +| rules | list | Список словарей, описывающих правила переадресации портов.
Ключи словаря:
• `id` (int) - идентификатор правила
• `localIp` (str) - IP-адрес ВМ
• `localPort` (int) - внутренний порт
• `protocol` (str) - протокол
• `publicPortEnd` (int) - верхняя граница диапазона внешних портов
• `publicPortStart` (int) - нижняя граница диапазона внешних портов
• `vmId` (int) - идентификатор ВМ
• `vmName` (str) - имя ВМ | +| state | string | Статус правил. Значения: `PRESENT` или `ABSENT`. | +| vins_id | int | Идентификатор внутренней сети. | + +## Пример использования модуля decort_pfw + +В данном примере для существующей ВМ (параметр `compute_id`), подключённой к внутренней сети (параметр `vins_id`), настраиваются два правила переадресации портов: + +- Правило для одного порта: внешний порт `30022` на внутренний порт `22` по протоколу `tcp`. +- Правило для диапазона портов: внешние порты с `30080` по `30085` на внутренние порты с `30080` по протоколу `udp`. + +``` +- name: Add port forwarding rules + decort_pfw: + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + authenticator: oauth2 + compute_id: "{{ my_vm.facts.id }}" + controller_url: "https://cloud.digitalenergy.online" + oauth2_url: "https://sso.digitalenergy.online" + rules: + - local_port: 22 + proto: tcp + public_port_start: 30022 + - local_port: 30080 + proto: udp + public_port_end: 30085 + public_port_start: 30080 + vins_id: "{{ my_vins.facts.id }}" + register: my_pfw_rules +``` + +В данном примере результат выполнения модуля **decort_pfw** записывается в переменную `my_pfw_rules`. Для доступа к списку правил используйте следующую конструкцию: + +``` +"{{ my_pfw_rules.facts.rules }}" +``` diff --git a/wiki/6.0.0/модуль-decort_rg.md b/wiki/6.0.0/модуль-decort_rg.md new file mode 100644 index 0000000..0b48956 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_rg.md @@ -0,0 +1,229 @@ +# Модуль decort_rg + +## Обзор модуля decort_rg + +Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет: + +- создавать ресурсные группы +- удалять ресурсные группы (в корзину или безвозвратно, с удалением содержимого или без) +- восстанавливать ресурсные группы из корзины +- включать/отключать ресурсные группы +- запрашивать информацию об уже существующих ресурсных группах +- изменять ресурсные группы: + - переименовывать + - настраивать квоты + - задавать стандартную сеть + - настраивать права доступа для пользователей + - изменять доступные пулы СХД + +## Параметры модуля decort_rg + +Ниже в алфавитном порядке приведен полный список параметров для модуля decort_rg. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: `ansible-doc -t module decort_rg` + +| Параметр | Тип, допустимые значения | Описание | +|----------|--------------------------|----------| +| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то account_name игнорируется. | +| account_name | (string) | Имя аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. | +| access | (dict) | Параметр, позволяющий выдать, забрать или изменить права у пользователя в ресурсной группе. | +| annotation | (string) | Текстовое описание ресурсной группы. Данный параметр является опциональным и учитывается только при создании ресурсной группы, а при всех прочих операциях игнорируется. | +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. | +| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения DECORT_APP_SECRET. | +| authenticator | Значения:
`oauth2`
`jwt`| Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным.| +| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должна быть создана (или уже существует) данная ресурсная группа. Данный параметр является обязательным. | +| def_netId | (int) | Уникальный целочисленный идентификатор внутренней или внешней сети. Используется для изменения сети по умолчанию в ресурсной группе. | +| def_netType | (string)
Значения:
`PRIVATE`
`PUBLIC`
`NONE`
Default: `PRIVATE` | Тип сети по умолчанию в ресурсной группе. Используется при создании ресурсной группы, а также при изменении. | +| extNetId | (int) | Уникальный целочисленный идентификатор внешней сети.
Если `def_netType: PRIVATE`, то указывает какую внешнюю сеть подключить к создаваемой внутренней сети, которая будет задана как сеть по умолчанию для создаваемой РГ.
Если `def_netType: PUBLIC`, то указывает какую внешнюю сеть задать как сеть по умолчанию для создаваемой РГ. | +| extNetIp | (string) | IP-адрес для внешней сети, которая задана в параметре `extNetId`. | +| ipcidr | (string) | IP-адрес внутренней сети. Используется при создании ресурсной группы, чтобы задать IP-адрес сети для создаваемой внутренней сети, которая создастся вместе с ресурсной группой. Используется при параметре `def_netType` в значении `PRIVATE`. | +| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`
Данный параметр является обязательным для указанного режима.
Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в _playbook_.
Если этот параметр не определен в _playbook_, то модуль будет использовать значение переменной окружения `DECORT_JWT`. | +| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. | +| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. | +| permanently | (bool)
Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. | +| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. | +| recursive_deletion | (bool)
Default: `false` | Рекурсивное удаление.
Если `true`, то при удалении РГ будет удалено всё её содержимое.
Если `false`, то при удалении непустой РГ работа модуля завершится ошибкой. | +| rename | (string) | Новое имя ресурсной группы.
Возможно переименование только включенной ресурсной группы. | +| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. Является обязательным при изменении РГ если не заданы `rg_name` и `account_id`/`account_name` | +| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным при создании. | +| sep_pools| (list) | Список словарей, описывающих доступные пулы СХД.
Ключи словаря:
• `sep_id` (int) - идентификатор системы хранения данных.
• `pool_names` (list) - список названий пулов системы хранения данных.
Чтобы очистить список доступных пулов, нужно указать пустой список `[]`.| +| state | Значения:
`present`
`absent`
`enabled`
`disabled`
Default: `present` | Целевое состояние ресурсной группы. | +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.
Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | + +## Возвращаемые значения модуля decort_rg + +Модуль decort_rg возвращает информацию о ресурсной группе в виде словаря facts со следующими ключами: +| Ключ | Тип данных | Описание | +|------|------------|----------| +| account_id | int | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данная ресурсная группа. | +| gid | int | Идентификатор физического кластера (Grid ID), на базе которого развёрнута ресурсная группа. | +| id | int | Уникальный целочисленный идентификатор ресурсной группы. | +| name | string | Имя ресурсной группы. Обратите внимание, что это имя уникально только в рамках аккаунта, которому принадлежит данная ресурсная группа. | +| state | string | Текущее состояние ресурсной группы. | +| quota | dict | Текущие квоты ресурсной группы. | +| resTypes | list | Список типов ресурсов, разрешенных к созданию в данной ресурсной группе. | +| defNetId | int | Уникальный целочисленный идентификатор сети по умолчанию в данной ресурсной группе. | +| defNetType | string | Тип сети по умолчанию в данной ресурсной группе. | +| ViNS | list | Список идентификаторов внутренних сетей ресурсной группы. | +| computes | list | Список идентификаторов виртуальных машин ресурсной группы. | +| uniqPools | list | Список доступных пулов СХД. | + +## Пример использования модуля decort_rg + +В данном примере показано, как создать ресурсную группу по имени MyRG в аккаунте MyAccount. + +``` +- name: manage resource group + decort_rg: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + account_name: "MyAccount" + rg_name: "MyRG" + state: present + register: my_rg + delegate_to: localhost +``` + +В данном примере показано, как создать ресурсную группу по имени MyRG в аккаунте MyAccount, также задать квоты и выдать права на чтение пользователю MyUser. + +``` +- name: manage resource group + decort_rg: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + account_name: "MyAccount" + rg_name: "MyRG" + access: + action: "grant" + user: "MyUser" + right: "R" + quotas: + cpu: 16 + ram: 16384 + disk: 100 + ext_ips: 20 + net_transfer: 1000 + state: present + register: my_rg + delegate_to: localhost +``` + +В данном примере показано, как выдать доступ на чтение и запись пользователю MyUser в ресурсной группе по имени MyRG в аккаунте MyAccount. + +``` +- name: manage resource group + decort_rg: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + account_name: "MyAccount" + rg_name: "MyRG" + access: + action: "grant" + user: "MyUser" + right: "RCX" + state: present + register: my_rg + delegate_to: localhost +``` + +В данном примере показано, как сменить квоту в ресурсной группе по имени MyRG в аккаунте MyAccount. + +``` +- name: manage resource group + decort_rg: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + account_name: "MyAccount" + rg_name: "MyRG" + quotas: + cpu: 16 + ram: 16384 + disk: 100 + ext_ips: 20 + net_transfer: 1000 + state: present + register: my_rg + delegate_to: localhost +``` + +В данном примере показано, как изменить сеть по умолчанию в ресурсной группе по имени MyRG в аккаунте MyAccount. + +``` +- name: manage resource group + decort_rg: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + account_name: "MyAccount" + rg_name: "MyRG" + def_netType: "PRIVATE" + def_netId: 99 + state: present + register: my_rg + delegate_to: localhost +``` + +В данном примере показано, как переименовать ресурсную группу по имени MyRG на новое имя "NewRg" в аккаунте MyAccount. + +``` +- name: manage resource group + decort_rg: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + account_name: "MyAccount" + rg_name: "MyRG" + rename: "NewRg" + rg_id: 27 + state: present + register: my_rg + delegate_to: localhost +``` + +В данном примере результат работы модуля decort_rg записывается в переменную my_rg. + +Модули DECORT, которым для работы требуется ресурсная группа, в качестве одного из параметров, как правило, принимают идентификатор `rg_id`. Так, например, используя модуль `decort_kvmvm` для создания виртуального сервера необходимо указать ресурсную группу, к которой будет принадлежать этот виртуальный сервер. Сделать это можно следующим образом: + +``` + <прочие детали опущены> + rg_id: "{{ my_rg.facts.id }}" +``` + +В данном примере показано, как изменить доступные пулы СХД в ресурсной группе по имени MyRG в аккаунте MyAccount. + +``` +- name: change available sep pools + decort_rg: + authenticator: oauth2 + app_id: "{{ my_app_id }}" + app_secret: "{{ my_app_secret }}" + oauth2_url: "https://sso.digitalenergy.online" + controller_url: "https://cloud.digitalenergy.online" + account_name: "MyAccount" + rg_name: "MyRG" + sep_pools: + - sep_id: 1 + pool_names: + - sep1_pool1 + - sep1_pool2 + - sep_id: 2 + pool_names: + - sep2_pool1 + state: present + register: my_rg + delegate_to: localhost +``` diff --git a/wiki/6.0.0/модуль-decort_user_info.md b/wiki/6.0.0/модуль-decort_user_info.md new file mode 100644 index 0000000..c463324 --- /dev/null +++ b/wiki/6.0.0/модуль-decort_user_info.md @@ -0,0 +1,1338 @@ +# Модуль decort_user_info +## Обзор модуля + +Модуль **decort_user_info** предназначен для получения следующей информации о пользователе: +- **основная информация** (см. [возвращаемые значения](#основная-информация) и [примеры](#получение-основной-информации-о-пользователе)) +- **используемые и зарезервированные ресурсы** (см. [параметр resource_consumption](#resource_consumption), [возвращаемые значения](#используемые-и-зарезервированные-ресурсы) и [примеры](#получение-информации-об-используемых-и-зарезервируемых-ресурсах)) +- **доступные аккаунты** (см. [параметр accounts](#accounts), [возвращаемые значения](#доступные-аккаунты) и [примеры](#получение-информации-о-доступных-аккаунтах)) +- **аудиты** (см. [параметр audits](#audits), [возвращаемые значения](#аудиты) и [примеры](#получение-информации-об-аудитах)) +- **доступные методы API** (см. [параметр api_methods](#api_methods), [возвращаемые значения](#доступные-методы-api) и [примеры](#получение-доступных-методов-api)) +- **поиск доступных объектов по строке** (см. [параметр objects_search](#objects_search), [возвращаемые значения](#найденные-объекты) и [примеры](#поиск-доступных-объектов)) + +## Параметры модуля +Ниже приведен список параметров для модуля **decort_user_info** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ПараметрТипОписание
+ + accounts + + + (dict) + + Получить информацию об аккаунтах, к которым имеет доступ пользователь, + с учётом заданных параметров вывода. +
Чтобы получить информацию без указания параметров вывода, + необходимо задать пустой словарь {}. +
+ deleted + + (bool) +
Default: false +
+
false - вывод только неудалённых объектов. +
true - вывод только удалённых в корзину объектов. +
+ filter + + (dict) + + Фильтр. +
+ rights + + (str) +
Значения: +
R +
RCX +
ARCXDU +
CXDRAU +
+ По предоставленным правам доступа. +
+ id + + (int) + + По идентификатору. +
+ name + + (str) + + По имени. +
+ status + + (str) +
Значения: +
CONFIRMED +
DELETED +
DESTROYED +
DESTROYING +
DISABLED +
+ По статусу. +
+ pagination + + (dict) + + Постраничный вывод. +
+ number + + (int) +
Default: 1 +
+ Номер страницы. +
+ size + + (int) + + Размер страниц. +
Обязательный параметр. +
+ resource_consumption + + (bool) +
Default: false +
+ Получить информацию об используемых и зарезервированных ресурсах. +
+ sorting + + (dict) + + Сортировка. +
+ asc + + (bool) +
Default: true +
+ Сортировать по возрастанию. +
true - по возрастанию. +
false - по убыванию. +
+ field + + (str) +
Значения: +
createdTime +
deletedTime +
id +
name +
status +
updatedTime +
+ Название поля, по которому сортировать. +
Обязательный параметр. +
+ + api_methods + + + (bool) +
Default: false +
+ Получить методы API, к которым имеет доступ пользователь. +
+ + audits + + + (dict) + + Получить информацию об аудитах пользователя, с учётом + заданных параметров вывода. +
Чтобы получить информацию с параметрами вывода по умолчанию, + необходимо задать пустой словарь {}. +
+ filter + + (dict) + + Фильтр. +
+ api_method + + (str) + + По методу API. +
+ status_code + + (dict) + + По коду ответа HTTP. +
+ min + + (int) + + По минимальному коду ответа HTTP. +
+ max + + (int) + + По максимальному коду ответа HTTP. +
+ time + + (dict) + + По временному периоду. +
+ start + + (dict) + + Начало периода. +
+ unix + + (int) + + Unix-время. +
+ date_time + + (str) + + Дата и время в формате ггггммддччммсс. + Альтернатива параметру unix. +
Допустимо использовать любой разделитель между + группами цифр для повышения читаемости. Например, + гггг-мм-дд чч:мм:сс. +
+ end + + (dict) + + Конец периода. +
Структура словаря аналогична параметру + start. +
+ pagination + + (dict) + + Постраничный вывод. +
+ number + + (int) +
Default: 1 +
+ Номер страницы. +
+ size + + (int) +
Default: 50 +
+ Размер страниц. +
+ + objects_search + + + (str) + + Получить информацию о доступных пользователю объектах, + найденных по строчному значению данного параметра. +
+ + resource_consumption + + + (bool) +
Default: false +
+ Получить информацию об используемых и зарезервированных ресурсах, + к которым имеет доступ пользователь. +
+ +## Возвращаемые значения + +Модуль **decort_user_info** возвращает информацию о пользователе в виде словаря `facts` со следующими ключами: + +### Основная информация + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ admin + + bool + + Наличие административных прав. +
+ data + + dict + + Дополнительные данные. +
+ emailaddresses + + list + + Адреса эл. почты. +
+ name + + str + + Имя/идентификатор. +
+ roles + + list + + Группы доступа. +
+ +### Используемые и зарезервированные ресурсы + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ + resource_consumed + + + dict + + Используемые ресурсы. +
+ cpu + + int + + Количество виртуальных процессоров. +
+ disksize + + int + + Объём дисков в ГБ. +
+ extips + + int + + Количество внешних IP-адресов. +
+ exttraffic + + int + + Объём трафика внешних сетей. +
+ gpu + + int + + Количество графических процессоров. +
+ ram + + int + + Объём оперативной памяти в МБ. +
+ seps + + dict + + Объём дисков по пулам СХД. +
+ (идентификатор СХД) + + dict + + Пулы СХД. +
+ (название пула) + + dict + + Словарь пула СХД. +
+ disksize + + int + + Объём дисков в ГБ. +
+ resource_reserved + + dict + + Зарезервированные ресурсы. +
Структура словаря аналогична словарю + + resource_consumed + . +
+ +### Доступные аккаунты + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ accounts + + list + + Список словарей, описывающих аккаунты. +
+ acl + + list + + Список словарей, описывающих доступы пользователей. +
+ right + + str + + Права доступа. +
+ status + + str + + Статус. +
+ type + + str + + Тип. +
+ userGroupId + + str + + Идентификатор пользователя или группы пользователей. +
+ computeFeatures + + list + + Список дополнительных возможностей гипервизора, доступных ВМ. +
+ createdTime + + int + + Unix-время создания. +
+ createdTime_readable + + str + + Дата и время создания. +
+ deletedTime + + int + + Unix-время удаления. +
+ deletedTime_readable + + str + + Дата и время удаления. +
+ id + + int + + Идентификатор. +
+ name + + str + + Имя. +
+ resource_consumed + + list + + Используемые ресурсы. +
Только если + accounts.resource_consumption: true + и только для неудалённых объектов. +
Структура словаря аналогична словарю + + resource_consumed + . +
+ resource_reserved + + list + + Зарезервированные ресурсы. +
Только если + accounts.resource_consumption: true + и только для неудалённых объектов. +
Структура словаря аналогична словарю + + resource_consumed + . +
+ status + + str + + Статус. +
+ updatedTime + + int + + Unix-время обновления. +
+ updatedTime_readable + + str + + Дата и время обновления. +
+ +### Аудиты + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ audits + + list + + Список словарей, описывающих аудиты. +
+ Call + + str + + Метод API. +
+ Guid + + str + + Уникальный идентификатор аудита. +
+ Response Time + + float + + Время отклика в секундах. +
+ Status Code + + int + + Код ответа HTTP. +
+ Time + + float + + Unix-время. +
+ Time_readable + + str + + Дата и время. +
+ +### Доступные методы API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ api_methods + + list + + Список словарей, описывающих доступные методы API. +
+ (название группы методов API) + + dict + + Доступные методы группы. +
+ (название подгруппы методов API) + + list + + Методы подгруппы. +
+ ALL + + bool + + Доступ ко всем методам группы. +
+ +### Найденные объекты + + + + + + + + + + + + +
+ Ключ + + Тип +
данных +
+ Описание +
+ objects_search + + list + + Список словарей, описывающих найденные объекты. +
+ +## Примеры использования + +### Получение основной информации о пользователе +``` +- name: Example + hosts: localhost + tasks: + - name: Get basic user info + decort_user_info: + # Параметры для авторизации упущены +``` + +### Получение информации об используемых и зарезервируемых ресурсах +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with resource consumption + decort_user_info: + # Параметры для авторизации упущены + resource_consumption: true +``` + +### Получение информации о доступных аккаунтах + +#### Только неудалённые +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with not deleted accounts + decort_user_info: + # Параметры для авторизации упущены + accounts: {} +``` + +#### Только удалённые в корзину +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with deleted accounts + decort_user_info: + # Параметры для авторизации упущены + accounts: + deleted: true +``` + +#### С информацией об используемых и зарезервированных ресурсах +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with accounts + decort_user_info: + # Параметры для авторизации упущены + accounts: + resource_consumption: true +``` + +#### С фильтрацией по статусу +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with accounts + decort_user_info: + # Параметры для авторизации упущены + accounts: + filter: + status: CONFIRMED +``` + +#### С сортировкой по имени +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with accounts + decort_user_info: + # Параметры для авторизации упущены + accounts: + sorting: + field: name +``` + +#### С постраничным выводом +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with accounts + decort_user_info: + # Параметры для авторизации упущены + accounts: + pagination: + size: 2 +``` + +### Получение информации об аудитах + +#### Без использования параметров вывода +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with audits + decort_user_info: + # Параметры для авторизации упущены + audits: {} +``` + +#### С фильтрацией по методу API +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with audits + decort_user_info: + # Параметры для авторизации упущены + audits: + filter: + call: cloudapi/account +``` + +#### С фильтрацией по временному периоду +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with audits + decort_user_info: + # Параметры для авторизации упущены + audits: + filter: + time: + start: + unix: 1724668267 + end: + date_time: 2024-08-26_13-40 +``` + +#### С постраничным выводом +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with audits + decort_user_info: + # Параметры для авторизации упущены + audits: + pagination: + size: 2 +``` + +### Получение доступных методов API +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with API methods + decort_user_info: + # Параметры для авторизации упущены + api_methods: true +``` + +### Поиск доступных объектов +``` +- name: Example + hosts: localhost + tasks: + - name: Get user info with found objects + decort_user_info: + # Параметры для авторизации упущены + objects_search: test +``` diff --git a/wiki/6.0.0/модуль-decort_vins.md b/wiki/6.0.0/модуль-decort_vins.md new file mode 100644 index 0000000..43b95ce --- /dev/null +++ b/wiki/6.0.0/модуль-decort_vins.md @@ -0,0 +1,120 @@ +# Модуль decort_vins +## Обзор модуля decort_vins + +Модуль decort_vins предназначен для управления внутренними сетями (Virtual Network Segment, ViNS) и позволяет производить с ними следующие действия: +- создавать + - на уровне ресурсной группы (если РГ задана) + - на уровне аккаунта (если РГ не задана) +- удалять (безвозвратно) +- восстанавливать из корзины +- запрашивать информацию +- включать/отключать +- соединять (необходимы права администратора) +- изменять: + - включать/отключать SSH-доступ к виртуальному маршрутизатору (необходимы права администратора) + - включать/отключать режим **Custom Config** для виртуального маршрутизатора (необходимы права администратора) + - сохранять конфигурацию виртуального маршрутизатора для возможности последующего отката к ней (необходимы права администратора) + +## Параметры модуля decort_vins + +Ниже в алфавитном порядке приведен полный список параметров для модуля decort_vins. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: +`ansible-doc -t module decort_vins` + + +| Параметр | Тип, допустимые значения | Описание | +| ------ | ------ | ------ | +| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данная внутреняя сеть. При идентификации внутренней сети по имени (см. параметр `vins_name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.| +| account_name | (string) | Имя аккаунта, которому принадлежит данная внутренняя сеть. При идентификации внутренней сети по имени (см. параметр `vins_name`) должно быть задано либо имя, либо идентификатор аккаунта (см. параметр account_id). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.| +|annotation | (string)| Текстовое описание внутренней сети. Данный аргумент является опциональным и учитывается только при создании внутренней сети, а при всех прочих операциях игнорируется.| +| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.| +| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.| +| authenticator | Значения:
`oauth2`
`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным. | +| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должна быть создана (или уже существует) данный внутренняя сеть. Данный параметр является обязательным. +| ext_net_id | (int) | Идентификатор внешней сети, к которой должна быть подключена внутренняя сеть. Если задать значение `0`, то платформой будет выбрана внешняя сеть по умолчанию. | +| ext_ip_addr | (string) | IP-адрес внешней сети, заданной через параметр `ext_net_id`. Если не задан, то IP-адрес для внешней сети будет выбран платформой автоматически. +| ipcidr | (string) | Адрес сети для создаваемой внутренней сети. Если этот параметр не задан, то платформа назначит адрес автоматически. Обратите внимание, что внутренние сети, принадлежащие одному и тому же аккаунту, не могут иметь пересекающихся сетей.| +| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.| +| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу _Oauth2_, который должен использоваться в режиме `authenticator: oauth2`.
Данный параметр является обязательным для указанного режима.
Если параметр не задан в _playbook_, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. | +|rg_id | (int) | Идентификатор ресурсной группы, в которой должна быть создана или уже существует внутренняя сеть. Если одновременно заданы `rg_id` и `rg_name`, то `rg_name` игнорируется.| +| rg_name | (string) | Имя ресурсной группы, в которой должна быть создана или уже существует внутренняя сеть. Если одновременно заданы `rg_name` и `rg_id`, то `rg_name` игнорируется.| +| state | (string)
Значения:
`present`
`absent`
`enabled`
`disabled`
Default: `present` | Целевое состояние внутренней сети. | +| verify_ssl | (bool)
Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.
Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. | +| vins_id | (int) | Идентификатор внутренней сети. Соответствующая внутренная сеть должна существовать. Таким образом, с помощью `vins_id` нельзя создать новую внутреннюю сеть, а только управлять уже имеющимися. Если задан данный параметр, то параметры `vins_name`, `account_name`, `account_id`, `rg_name` и `rg_id` игнорируются.| +| vins_name| (string) | Имя внутренней сети. Для идентификации внутренней сети требуется либо `vins_name` и информация об аккаунте/ресурсной группе, которой принадлежит сеть, либо `vins_id`. Обратите внимание, что это имя уникально только в рамках ресурсной группы или аккаунта, на уровне которого существует данная внутренняя сеть.| +| mgmtaddr | (list) | Список существующих IP-адресов виртуального маршрутизатора во внутренней сети, через которые необходимо разрешить SSH-доступ к виртуальному маршрутизатору. +| custom_config | (bool)
Default: `false` | Включить/отключить режим пользовательской конфигурации виртуального маршрутизатора. | +| config_save | (bool)
Default: `false` | Выполнить сохранение текущей конфигурации виртуального маршрутизатора для возможности последующего отката к ней. | +| connect_to | (list) | Список словарей, содержащих информацию о внутренних сетях, к которым необходимо подключить данную. См. примеры. + +## Возвращаемые значения модуля decort_vins + +Модуль decort_vins возвращает информацию о внутренней сети в виде словаря facts со следующими ключами: + +| Ключ | Тип данных | Описание | +| --- | --- | --- | +| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит внутренняя сеть. | +| custom_net_addr | (list) | Список IP-адресов пользовательских интерфейсов виртуального маршрутизатора +| ext_ip_addr | (string) | IP-адрес интерфейса, которым виртуальный маршрутизатор подключён к внешней сети. | +| ext_net_id | (int) | Идентификатор внешней сети, к которой подключена внутренняя сеть. `-1` означает, что внутренняя сеть не подключёна к внешней сети. | +| gid | (int) | Идентификатор физического кластера (Grid ID), на базе которого развёрнуты ресурсы данной внутренней сети. | +| id | (int) | Уникальный целочисленный идентификатор внутренней сети. | +| name | (string) | Имя внутренней сети. | +| int_net_addr | (string) | Адрес внутренней сети. | +| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы, которой принадлежит данная внутренняя сеть. Если данная внутренняя сеть создана на уровне аккаунта, то `rg_id=0`. | +| ssh_ipaddr | (list) | Список IP-адресов виртуального маршрутизатора во внутренней сети, на которых включён SSH-доступ к нему. +| ssh_password | (str) | Пароль для SSH-доступа к виртуальному маршрутизатору. +| ssh_port | (int) | Номер порта для SSH-подключения к виртуальному маршрутизатору. +| state | (string) | Состояние внутренней сети. | + + + +## Пример использования модуля decort_vins + +В данном примере создаётся внутренняя сеть с именем "MyVins01" (vins_name: "MyVins01"). + +Внутренняя сеть создаётся на уровне ресурсной группы "MyRg01" (rg_name: "MyRg01"), принадлежащей аккаунту "MyMainAccount" (account_name: "MyMainAccount"). Внутренняя сеть будет иметь подключение во внешнюю сеть по умолчанию (ext_net_id: 0). +``` + - name: Manage ViNS on resource group level + decort_vins: + account_name: "MyMainAccount" + rg_name: "MyRg01" + authenticator: jwt + jwt: "{{ my_jwt.jwt }}" + controller_url: "https://ds1.digitalenergy.online" + ext_net_id: 0 + vins_name: "MyVins01" + register: my_vins + ``` + +Здесь результат исполнения модуля decort_vins записывается в переменную my_vins, которую можно дальше использовать в Ansible playbooks. Ниже показано, как получить и использовать идентификатор внутренней сети для подключения к нему виртуального сервера. +``` +- name: Manage virtual machine + decort_kvmvm: + << для краткости фрагмент опущен >> + networks: + - type: VINS + id: "{{ my_vins.facts.id }}" + << для краткости фрагмент опущен >> +``` + +В данном примере идёт создание внутренней сети, а потом её привязка к внутренним сетям с id 864 и 196. +``` + - name: Manage ViNS on resource group level + decort_vins: + authenticator: jwt + jwt: "{{ my_jwt.jwt }}" + controller_url: "https://cloud.digitalenergy.online" + vins_name: "ViNS_connected_by_decort_vins_module" + rg_id: 98 + connect_to: + - id: 864 + ipaddr: 192.168.5.66 + netmask: 24 + - id: 196 + ipaddr: 192.168.9.133 + netmask: 24 + register: managed_vins + +``` + + diff --git a/wiki/Home.md b/wiki/Home.md index f2be97e..13b8073 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -1,5 +1,6 @@ ## Документация: +- [Модули Ansible версии 6.0.0](./6.0.0/Home.md) - [Модули Ansible версии 5.6.0](./5.6.0/Home.md) - [Модули Ansible версии 5.5.0](./5.5.0/Home.md) - [Модули Ansible версии 5.4.0](./5.4.0/Home.md)