main 8.0.0
sskarimov 1 month ago
parent f8c32d609b
commit 4113719334

@ -1,47 +1,87 @@
# Список изменений в версии 7.2.0
# Список изменений в версии 8.0.0
## Добавлено
### Модуль decort_k8s
### Модуль decort_account
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-628 | Добавлен параметр `lb_sysctl` для установки параметров конфигурации sysctl балансировщика нагрузки. |
| BANS-701 | Модуль теперь позволяет задать параметр `master_chipset` для существующего кластера, если значение параметра соответствует чипсету master-узлов. |
| BANS-713 | Добавлен параметр `description` и возвращаемое значение `description`. |
### Модуль decort_osimage
### Модуль decort_account_info
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-714 | Добавлено возвращаемое значение `description` для аккаунта и ресурсных групп. |
### Модуль decort_user_info
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-308 | Добавлена возможность удаления виртуальных образов. |
| BANS-715 | Добавлено возвращаемое значение `description` для аккаунтов. |
| BANS-718 | Добавлен параметр `audits.sorting`. |
| BANS-725 | Добавлены параметры `audits.filter.time.start.timestamp`, `audits.filter.time.start.datetime`, `audits.filter.time.end.timestamp`, `audits.filter.time.end.datetime`. |
### Модуль decort_lb
### Модуль decort_k8s
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-627 | Добавлен параметр `sysctl`. |
| BANS-717 | Добавлено возвращаемое значение `description`. |
### Модуль decort_kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-651 | Добавлен параметр `get_console_url` для получения ссылки на консоль ВМ. |
| BANS-652 | Добавлены параметры `disks`, `boot.disk_id` и `boot.disk_size` для управления дисками ВМ. |
| BANS-629 | Добавлен параметр `clone_from` для создания ВМ путём клонирования другой ВМ. |
| BANS-719 | Добавлены параметры `boot.mode`, `boot.loader_type`, `network_interface_naming`, `hot_resize` и возвращаемые значения `boot_mode`, `boot_loader_type`, `network_interface_naming`, `hot_resize`. |
| BANS-746 | Добавлено возвращаемое значение `pinned_to_stack`. |
| BANS-744 | Добавлены возвращаемые значения `affinity_label`, `affinity_rules` и `anti_affinity_rules`. |
| BANS-724 | Для параметра `state` добавлены значение `started` вместо `poweredon` и значение `stopped` вместо значений `poweredoff` и `halted`. |
| BANS-763 | Добавлен параметр `networks.mac`. |
### Модуль decort_rg
### Модуль decort_osimage
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-424 | Добавлена возможность изменения описания ресурсной группы, а также добавлено возвращаемое значение `description`. |
| BANS-740 | Добавлены параметры `boot.mode`, `boot.loader_type`, `network_interface_naming`, `hot_resize` и возвращаемые значения `boot_mode`, `boot_loader_type`, `network_interface_naming`, `hot_resize`. |
### Модуль decort_group
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-721 | Добавлен параметр `chipset`. Добавлено возвращаемое значение `Computes.chipset`.|
## Удалено
### Модуль decort_disk
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-657 | Удалён параметр `type`. |
| BANS-773 | Добавлены возвращаемые значения `size_available` и `size_used`.|
## Удалено
### Общее
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-669 | Прекращено использование библиотеки `PyJWT`. |
### Модуль decort_k8s
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-711 | Удалена возможность задавать значение больше `1` для параметра `master_count` при `with_lb: false`. |
### Модуль decort_osimage
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-740 | Удалены параметры `hotresize`, `boottype`, `imagetype` в связи с переименованием в `hot_resize`, `boot.mode`, `boot.loader_type`. |
### Модуль decort_kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-652 | Удален параметр `data_disks` в связи с изменением логики (см. параметр `disks`). Удален параметр `boot_disk` в связи с переименованием в `boot.disk_size`. |
| BANS-724 | Для параметра `state` удалены значения `poweredoff` и `halted` в связи с заменой на `stopped` и значение `poweredon` в связи заменой на `started`. |
### Модуль decort_user_info
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-725 | Удалены параметры `audits.filter.time.start.unix`, `audits.filter.time.start.date_time`, `audits.filter.time.end.unix`, `audits.filter.time.end.date_time` в связи с переименованием. |
## Исправлено
### Модуль decort_k8s
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-661 | При создании кластера модуль возвращал информацию только о первой группе worker-узлов. |
| BANS-711 | Модуль завершал свою работу ошибкой запроса к API при недопустимом значении в параметре `master_count`. |
### Модуль decort_kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-736 | Модуль завершал свою работу ошибкой запроса к API при попытке отсоединить загрузочный диск у запущенной ВМ. |
| BANS-747 | При создании ВМ со `state: present` модуль запускал ВМ после создания. |
| BANS-733 | Исправлена ошибка при клонировании ВМ в режиме `check_mode: true`. |

@ -5,6 +5,7 @@
| Версия платформы | Версия модулей Ansible |
|:----------------:|:--------------------------:|
| 4.3.0 | 8.0.x |
| 4.2.0 | 7.0.x, 7.1.x, 7.2.x |
| 4.1.0 | 6.0.x, 6.1.x |
| 4.0.0 | 5.6.x, 5.5.x, 5.4.x, 5.3.x |

@ -111,6 +111,9 @@ class DecortAccount(DecortController):
),
),
),
description=dict(
type='str',
),
),
required_one_of=[
('id', 'name')
@ -358,6 +361,14 @@ class DecortAccount(DecortController):
)
if set(self.facts['uniqPools']) != sep_pools:
result_args['sep_pools'] = sep_pools
aparam_desc = self.aparams['description']
if (
aparam_desc is not None
and self.facts['description'] != aparam_desc
):
result_args['description'] = aparam_desc
return result_args

@ -173,6 +173,8 @@ class decort_disk(DecortController):
ret_dict['computes'] = self.disk_info['computes']
ret_dict['gid'] = self.disk_info['gid']
ret_dict['iotune'] = self.disk_info['iotune']
ret_dict['size_available'] = self.disk_info['sizeAvailable']
ret_dict['size_used'] = self.disk_info['sizeUsed']
return ret_dict

@ -39,6 +39,7 @@ class decort_group(DecortController):
if self.group_id:
self.group_should_exist = True
self.check_amodule_args_for_change()
return
def nop(self):
@ -74,22 +75,34 @@ class decort_group(DecortController):
return
def create(self):
chipset = self.aparams['chipset']
if chipset is None:
chipset = 'i440fx'
self.message(
msg=f'Chipset not specified, '
f'default value "{chipset}" will be used.',
warning=True,
)
self.group_id=self.group_provision(
self.bservice_id,
self.amodule.params['name'],
self.amodule.params['count'],
self.amodule.params['cpu'],
self.amodule.params['ram'],
self.amodule.params['boot_disk'],
self.amodule.params['image_id'],
self.amodule.params['driver'],
self.amodule.params['role'],
self.amodule.params['networks'],
self.amodule.params['timeoutStart'],
bs_id=self.bservice_id,
arg_name=self.amodule.params['name'],
arg_count=self.amodule.params['count'],
arg_cpu=self.amodule.params['cpu'],
arg_ram=self.amodule.params['ram'],
arg_boot_disk=self.amodule.params['boot_disk'],
arg_image_id=self.amodule.params['image_id'],
arg_driver=self.amodule.params['driver'],
arg_role=self.amodule.params['role'],
arg_network=self.amodule.params['networks'],
arg_timeout=self.amodule.params['timeoutStart'],
chipset=chipset,
)
if self.amodule.params['state'] in ('started','present'):
self.group_state(self.bservice_id,self.group_id,self.amodule.params['state'])
self.group_should_exist = True
return
def action(self):
@ -100,13 +113,26 @@ class decort_group(DecortController):
):
self.group_state(self.bservice_id,self.group_id,self.amodule.params['state'])
if self.aparams['count'] != None:
aparam_chipset = self.aparams['chipset']
if (
self.aparams['count'] is not None
and self.aparams['count'] != len(self.group_info['computes'])
):
self.group_resize_count(
bs_id=self.bservice_id,
gr_dict=self.group_info,
desired_count=self.aparams['count'],
chipset=aparam_chipset,
)
if aparam_chipset is not None:
for vm in self.group_info['computes']:
if vm['chipset'] != aparam_chipset:
self.compute_update(
compute_id=vm['id'],
chipset=aparam_chipset,
)
for aparam_name, info_key in {'cpu': 'cpu',
'boot_disk': 'disk',
'role': 'role',
@ -254,6 +280,13 @@ class decort_group(DecortController):
)
)
),
chipset=dict(
type='str',
choices=[
'Q35',
'i440fx',
]
),
),
supports_check_mode=True,
required_one_of=[
@ -268,6 +301,43 @@ class decort_group(DecortController):
],
)
def check_amodule_args_for_change(self):
check_errors = False
if (
self.aparams['chipset'] is None
and self.aparams['count'] > len(self.group_info['computes'])
):
check_errors = True
self.message(
msg='Check for parameter "chipset" failed: '
'Chipset must be specified when increasing '
'VM count in group'
)
if (
self.aparams['count'] is None
or self.aparams['count'] == len(self.group_info['computes'])
):
aparam_chipset = self.aparams['chipset']
if aparam_chipset is not None:
for vm in self.group_info['computes']:
if (
vm['chipset'] != aparam_chipset
and self.group_info['techStatus'] != 'STOPPED'
and self.amodule.params['state'] != 'stopped'
):
check_errors = True
self.message(
msg=f'Check for parameter "chipset" failed: '
f'group ID {self.group_id} must be stopped '
f'to change chipset',
)
break
if check_errors:
self.exit(fail=True)
def main():
subj = decort_group()
amodule = subj.amodule

@ -121,6 +121,18 @@ class decort_k8s(DecortController):
)
self.exit(fail=True)
if (
self.aparams['master_count'] is not None
and self.aparams['master_count'] > 1
and not self.aparams['with_lb']
):
self.message(
'Check for parameter "master_count" failed: '
'master_count can be more than 1 only if the parameter '
'"with_lb" is set to True.'
)
self.exit(fail=True)
return
def package_facts(self,check_mode=False):
@ -155,6 +167,7 @@ class decort_k8s(DecortController):
ret_dict['k8s_Masters'] = self.k8s_info['k8sGroups']['masters']
ret_dict['k8s_Workers'] = self.k8s_info['k8sGroups']['workers']
ret_dict['lb_id'] = self.k8s_info['lbId']
ret_dict['description'] = self.k8s_info['desc']
return ret_dict
@ -358,6 +371,7 @@ class decort_k8s(DecortController):
master_count=dict(
type='int',
default=1,
choices=[1, 3, 5, 7],
),
master_cpu=dict(
type='int',

@ -1,4 +1,6 @@
#!/usr/bin/python
import re
from typing import Sequence, Any, TypeVar
DOCUMENTATION = r'''
---
@ -12,6 +14,9 @@ from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
DefaultT = TypeVar('DefaultT')
class decort_kvmvm(DecortController):
def __init__(self):
# call superclass constructor first
@ -73,6 +78,8 @@ class decort_kvmvm(DecortController):
if not clone_id:
clone_id = self.clone()
if self.amodule.check_mode:
self.exit()
self.comp_id, self.comp_info, self.rg_id = self._compute_get_by_id(
comp_id=clone_id,
@ -178,8 +185,8 @@ class decort_kvmvm(DecortController):
'hp_backed must be set to True to connect a compute '
'to a DPDK network.'
)
# MTU for non-DPDK networks
for net in aparam_nets:
# MTU for non-DPDK networks
if (
net['type'] != self.VMNetType.DPDK.value
and net['mtu'] is not None
@ -191,6 +198,28 @@ class decort_kvmvm(DecortController):
' (remove parameter "mtu" for network'
f' {net["type"]} with ID {net["id"]}).'
)
# MAC address
if net['mac'] is not None:
if net['type'] == self.VMNetType.EMPTY.value:
check_error = True
self.message(
'Check for parameter "networks.mac" failed: '
'MAC-address cannot be specified for an '
'EMPTY type network.'
)
mac_validation_result = re.match(
'[0-9a-f]{2}([:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$',
net['mac'].lower(),
)
if not mac_validation_result:
check_error = True
self.message(
'Check for parameter "networks.mac" failed: '
f'MAC-address for network ID {net["id"]} must be '
'specified in quotes and in the format '
'"XX:XX:XX:XX:XX:XX".'
)
aparam_custom_fields = self.aparams['custom_fields']
if aparam_custom_fields is not None:
@ -215,6 +244,22 @@ class decort_kvmvm(DecortController):
'the list must contain only unique elements.'
)
aparam_state = self.aparams['state']
new_state = None
match aparam_state:
case 'halted' | 'poweredoff':
new_state = 'stopped'
case 'poweredon':
new_state = 'started'
if new_state:
self.message(
msg=f'"{aparam_state}" state is deprecated and might be '
f'removed in newer versions. '
f'Please use "{new_state}" instead.',
warning=True,
)
if check_error:
self.exit(fail=True)
@ -265,12 +310,40 @@ 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')
aparam_boot = self.aparams['boot']
validated_bdisk_size = 0
if self.amodule.params['boot'] is not None:
boot_mode = 'bios'
loader_type = 'unknown'
if aparam_boot is not None:
validated_bdisk_size = self.amodule.params['boot'].get(
'disk_size', 0
)
if aparam_boot['mode'] is None:
self.message(
msg=self.MESSAGES.default_value_used(
param_name='boot.mode',
default_value=boot_mode
),
warning=True,
)
else:
boot_mode = aparam_boot['mode']
if aparam_boot['loader_type'] is None:
self.message(
msg=self.MESSAGES.default_value_used(
param_name='boot.loader_type',
default_value=loader_type
),
warning=True,
)
else:
loader_type = aparam_boot['loader_type']
image_id, image_facts = None, None
if self.aparam_image:
# either image_name or image_id must be present
@ -308,7 +381,7 @@ class decort_kvmvm(DecortController):
# Once this "feature" is fixed, make sure VM is created according to the actual desired state
#
start_compute = False # change this once a workaround for the aforementioned libvirt "feature" is implemented
if self.amodule.params['state'] in ('halted', 'poweredoff'):
if self.amodule.params['state'] in ('halted', 'poweredoff', 'stopped'):
start_compute = False
if self.amodule.params['ssh_key'] and self.amodule.params['ssh_key_user'] and not self.amodule.params['ci_user_data']:
@ -334,7 +407,6 @@ class decort_kvmvm(DecortController):
if numa_affinity is None:
numa_affinity = 'none'
chipset = self.amodule.params['chipset']
if chipset is None:
chipset = 'i440fx'
@ -343,6 +415,28 @@ class decort_kvmvm(DecortController):
f'default value "{chipset}" will be used.',
warning=True,
)
network_interface_naming = self.aparams['network_interface_naming']
if network_interface_naming is None:
network_interface_naming = 'ens'
self.message(
msg=self.MESSAGES.default_value_used(
param_name='network_interface_naming',
default_value=network_interface_naming
),
warning=True,
)
hot_resize = self.aparams['hot_resize']
if hot_resize is None:
hot_resize = False
self.message(
msg=self.MESSAGES.default_value_used(
param_name='hot_resize',
default_value=hot_resize
),
warning=True,
)
# if we get through here, all parameters required to create new Compute instance should be at hand
# NOTE: KVM VM is created in HALTED state and must be explicitly started
@ -360,7 +454,11 @@ class decort_kvmvm(DecortController):
cpu_pin=cpu_pin,
hp_backed=hp_backed,
numa_affinity=numa_affinity,
preferred_cpu_cores=self.amodule.params['preferred_cpu_cores'],)
preferred_cpu_cores=self.amodule.params['preferred_cpu_cores'],
boot_mode=boot_mode,
boot_loader_type=loader_type,
network_interface_naming=network_interface_naming,
hot_resize=hot_resize,)
self.comp_should_exist = True
# Originally we would have had to re-read comp_info after VM was provisioned
@ -407,7 +505,7 @@ class decort_kvmvm(DecortController):
label=self.amodule.params['affinity_label'],)
# NOTE: see NOTE above regarding libvirt "feature" and new VMs created in HALTED state
if self.aparam_image:
if self.amodule.params['state'] not in ('halted', 'poweredoff'):
if self.amodule.params['state'] in ('poweredon', 'started'):
self.compute_powerstate(self.comp_info, 'started')
if self.aparams['custom_fields'] is None:
@ -553,14 +651,54 @@ class decort_kvmvm(DecortController):
'description': 'desc',
'auto_start': 'autoStart',
'preferred_cpu_cores': 'preferredCpu',
'boot.mode': 'bootType',
'boot.loader_type': 'loaderType',
'network_interface_naming': 'networkInterfaceNaming',
'hot_resize': 'hotResize',
}
def get_nested_value(
d: dict,
keys: Sequence[str],
default: DefaultT | None = None,
) -> Any | DefaultT:
if not keys:
raise ValueError
key = keys[0]
if key not in d:
return default
value = d[key]
if len(keys) > 1:
if isinstance(value, dict):
nested_d = value
return get_nested_value(
d=nested_d,
keys=keys[1:],
default=default,
)
if value is None:
return default
raise ValueError(
f'The key {key} found, but its value is not a dictionary.'
)
return value
for aparam_name, comp_field_name in params_to_check.items():
aparam_value = self.amodule.params[aparam_name]
if (
aparam_value is not None
and aparam_value != self.comp_info[comp_field_name]
):
result_args[aparam_name] = aparam_value
aparam_value = get_nested_value(
d=self.aparams,
keys=aparam_name.split('.'),
)
comp_value = get_nested_value(
d=self.comp_info,
keys=comp_field_name.split('.'),
)
if aparam_value is not None and aparam_value != comp_value:
result_args[aparam_name.replace('.', '_')] = (
aparam_value
)
return result_args
@ -679,15 +817,49 @@ class decort_kvmvm(DecortController):
ret_dict['clones'] = self.comp_info['clones']
ret_dict['clone_reference'] = self.comp_info['cloneReference']
ret_dict['boot_mode'] = self.comp_info['bootType']
ret_dict['boot_loader_type'] = self.comp_info['loaderType']
ret_dict['network_interface_naming'] = self.comp_info[
'networkInterfaceNaming'
]
ret_dict['hot_resize'] = self.comp_info['hotResize']
ret_dict['pinned_to_stack'] = self.comp_info['pinnedToStack']
ret_dict['affinity_label'] = self.comp_info['affinityLabel']
ret_dict['affinity_rules'] = self.comp_info['affinityRules']
ret_dict['anti_affinity_rules'] = self.comp_info['antiAffinityRules']
return ret_dict
def check_amodule_args_for_create(self):
check_errors = False
# Check for unacceptable parameters for a blank Compute
if (
self.aparams['image_id'] is not None
or self.aparams['image_name'] is not None
):
self.aparam_image = True
for param in (
'network_interface_naming',
'hot_resize',
):
if self.aparams[param] is not None:
check_errors = True
self.message(
f'Check for parameter "{param}" failed: '
'parameter can be specified only for a blank VM.'
)
if self.aparams['boot'] is not None:
for param in ('mode', 'loader_type'):
if self.aparams['boot'][param] is not None:
check_errors = True
self.message(
f'Check for parameter "boot.{param}" failed: '
'parameter can be specified only for a blank VM.'
)
else:
self.aparam_image = False
if (
@ -696,14 +868,15 @@ class decort_kvmvm(DecortController):
'present',
'poweredoff',
'halted',
'stopped',
)
):
check_errors = True
self.message(
'Check for parameter "state" failed: '
'state for a blank Compute must be either '
'"present", "poweredoff" or "halted".'
'"present" or "stopped".'
)
self.exit(fail=True)
for parameter in (
'ssh_key',
@ -711,38 +884,41 @@ class decort_kvmvm(DecortController):
'ci_user_data',
):
if self.aparams[parameter] is not None:
check_errors = True
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'] is None
and self.aparams['boot']['disk_size'] is None
):
check_errors = True
self.message(
'Check for parameter "sep_id" failed: '
'"image_id" or "image_name" or "boot.disk_size" '
'must be specified to set sep_id.'
)
self.exit(fail=True)
if self.aparams['rollback_to'] is not None:
check_errors = True
self.message(
'Check for parameter "rollback_to" failed: '
'rollback_to can be specified only for existing compute.'
)
self.exit(fail=True)
if self.aparam_networks_has_dpdk and not self.aparams['hp_backed']:
check_errors = True
self.message(
'Check for parameter "networks" failed:'
' hp_backed must be set to True to connect a compute'
' to a DPDK network.'
)
if check_errors:
self.exit(fail=True)
@property
@ -769,6 +945,21 @@ class decort_kvmvm(DecortController):
disk_size=dict(
type='int',
),
mode=dict(
type='str',
choices=[
'bios',
'uefi',
],
),
loader_type=dict(
type='str',
choices=[
'windows',
'linux',
'unknown',
],
),
),
),
sep_id=dict(
@ -840,6 +1031,9 @@ class decort_kvmvm(DecortController):
mtu=dict(
type='int',
),
mac=dict(
type='str',
),
),
required_if=[
('type', 'VINS', ('id',)),
@ -892,6 +1086,8 @@ class decort_kvmvm(DecortController):
'poweredoff',
'halted',
'poweredon',
'stopped',
'started',
'present',
],
),
@ -974,6 +1170,16 @@ class decort_kvmvm(DecortController):
),
),
),
network_interface_naming=dict(
type='str',
choices=[
'ens',
'eth',
],
),
hot_resize=dict(
type='bool',
),
),
supports_check_mode=True,
required_one_of=[
@ -1069,12 +1275,14 @@ class decort_kvmvm(DecortController):
if (
not comp_info['imageId']
and self.amodule.params['state'] in ('poweredon', 'paused')
and self.amodule.params['state'] in (
'poweredon', 'paused', 'started',
)
):
check_errors = True
self.message(
'Check for parameter "state" failed: '
'state for a blank Compute can not be "poweredon" or "paused".'
'state for a blank Compute can not be "started" or "paused".'
)
is_vm_stopped_or_will_be_stopped = (
@ -1083,14 +1291,14 @@ class decort_kvmvm(DecortController):
and (
self.amodule.params['state'] is None
or self.amodule.params['state'] in (
'halted', 'poweredoff', 'present',
'halted', 'poweredoff', 'present', 'stopped',
)
)
)
or (
comp_info['techStatus'] != 'STOPPED'
and self.amodule.params['state'] in (
'halted', 'poweredoff',
'halted', 'poweredoff', 'stopped',
)
)
)
@ -1120,6 +1328,7 @@ class decort_kvmvm(DecortController):
'cpu_pin': 'cpupin',
'hp_backed': 'hpBacked',
'numa_affinity': 'numaAffinity',
'hot_resize': 'hotResize',
}
for param_name, comp_field_name in params_to_check.items():
if (
@ -1159,13 +1368,13 @@ class decort_kvmvm(DecortController):
and (
self.amodule.params['state'] is None
or self.amodule.params['state'] in (
'poweredon', 'present',
'poweredon', 'present', 'started',
)
)
)
or (
comp_info['techStatus'] != 'STARTED'
and self.amodule.params['state'] == 'poweredon'
and self.amodule.params['state'] in ('poweredon', 'started')
)
)
@ -1179,30 +1388,55 @@ class decort_kvmvm(DecortController):
aparam_disks = self.aparams['disks']
if aparam_disks is not None:
if self.comp_info['snapSets']:
match aparam_disks['mode']:
case 'detach' | 'delete':
check_errors = True
self.message(
f'Check for parameter "disks" failed: '
f'cannot {aparam_disks["mode"]} disks for '
f'Compute ID {self.comp_id} while snapshots '
f'exist in compute.'
)
case 'match':
comp_disk_ids = {
disk['id'] for disk in self.comp_info['disks']
}
disks = set(aparam_disks['ids'])
disks_to_detach = comp_disk_ids - disks
if disks_to_detach:
check_errors = True
self.message(
f'Check for parameter "disks" failed: '
f'disks {disks_to_detach} cannot be detached '
f'from Compute ID {self.comp_id} while '
f'snapshots exist in compute.'
)
aparam_disks_ids = aparam_disks['ids']
comp_boot_disk_id = None
for comp_disk in self.comp_info['disks']:
if comp_disk['type'] == 'B':
comp_boot_disk_id = comp_disk['id']
break
disks_to_detach = []
match aparam_disks['mode']:
case 'detach' | 'delete':
disks_to_detach = aparam_disks_ids
case 'match':
comp_disk_ids = {
disk['id'] for disk in self.comp_info['disks']
}
disks = set(aparam_disks_ids)
disks_to_detach = comp_disk_ids - disks
if (
comp_boot_disk_id is not None
and comp_boot_disk_id in disks_to_detach
and not is_vm_stopped_or_will_be_stopped
):
check_errors = True
self.message(
f'Check for parameter "disks" failed: '
f'VM ID {comp_id} must be stopped to detach '
f'boot disk ID {comp_boot_disk_id}.'
)
if self.comp_info['snapSets'] and disks_to_detach:
check_errors = True
self.message(
f'Check for parameter "disks" failed: '
f'cannot detach disks {disks_to_detach} from '
f'Compute ID {self.comp_id} while snapshots exist.'
)
if (
(
self.aparams['cpu'] is not None
and self.aparams['cpu'] != comp_info['cpus']
) or (
self.aparams['ram'] is not None
and self.aparams['ram'] != comp_info['ram']
)
) and not (self.aparams['hot_resize'] or comp_info['hotResize']):
check_errors = True
self.message(
'Check for parameters "cpu" and "ram" failed: '
'Hot resize must be enabled to change CPU or RAM.'
)
if check_errors:
self.exit(fail=True)
@ -1323,7 +1557,8 @@ def main():
subj.destroy()
else:
if amodule.params['state'] in (
'paused', 'poweredon', 'poweredoff', 'halted'
'paused', 'poweredon', 'poweredoff',
'halted', 'started', 'stopped',
):
subj.compute_powerstate(
comp_facts=subj.comp_info,
@ -1331,7 +1566,7 @@ def main():
)
subj.modify(arg_wait_cycles=7)
elif subj.comp_info['status'] == "DELETED":
if amodule.params['state'] in ('present', 'poweredon'):
if amodule.params['state'] in ('present', 'poweredon', 'started'):
# TODO - check if restore API returns VM ID (similarly to VM create API)
subj.compute_restore(comp_id=subj.comp_id)
# TODO - do we need updated comp_info to manage port forwards and size after VM is restored?
@ -1345,10 +1580,15 @@ def main():
# subj.nop()
# subj.comp_should_exist = False
subj.destroy()
elif amodule.params['state'] in ('paused', 'poweredoff', 'halted'):
elif amodule.params['state'] in (
'paused', 'poweredoff', 'halted', 'stopped'
):
subj.error()
elif subj.comp_info['status'] == "DESTROYED":
if amodule.params['state'] in ('present', 'poweredon', 'poweredoff', 'halted'):
if amodule.params['state'] in (
'present', 'poweredon', 'poweredoff',
'halted', 'started', 'stopped',
):
subj.create() # this call will also handle data disk & network connection
elif amodule.params['state'] == 'absent':
subj.nop()
@ -1363,7 +1603,10 @@ def main():
# If requested state is 'absent' - nothing to do
if state == 'absent':
subj.nop()
elif state in ('present', 'poweredon', 'poweredoff', 'halted'):
elif state in (
'present', 'poweredon', 'poweredoff',
'halted', 'started', 'stopped',
):
subj.create() # this call will also handle data disk & network connection
elif state == 'paused':
subj.error()

@ -72,13 +72,61 @@ class decort_osimage(DecortController):
def decort_image_create(self,amodule):
aparam_boot = self.aparams['boot']
boot_mode = 'bios'
loader_type = 'unknown'
if aparam_boot is not None:
if aparam_boot['mode'] is None:
self.message(
msg=self.MESSAGES.default_value_used(
param_name='boot.mode',
default_value=boot_mode
),
warning=True,
)
else:
boot_mode = aparam_boot['mode']
if aparam_boot['loader_type'] is None:
self.message(
msg=self.MESSAGES.default_value_used(
param_name='boot.loader_type',
default_value=loader_type
),
warning=True,
)
else:
loader_type = aparam_boot['loader_type']
network_interface_naming = self.aparams['network_interface_naming']
if network_interface_naming is None:
network_interface_naming = 'ens'
self.message(
msg=self.MESSAGES.default_value_used(
param_name='network_interface_naming',
default_value=network_interface_naming
),
warning=True,
)
hot_resize = self.aparams['hot_resize']
if hot_resize is None:
hot_resize = False
self.message(
msg=self.MESSAGES.default_value_used(
param_name='hot_resize',
default_value=hot_resize
),
warning=True,
)
# function that creates OS image
image_facts = self.image_create(img_name=self.validated_image_name,
url=amodule.params['url'],
gid=amodule.params['gid'],
boottype=amodule.params['boottype'],
imagetype=amodule.params['imagetype'],
hotresize=amodule.params['hotresize'],
boot_mode=boot_mode,
boot_loader_type=loader_type,
hot_resize=hot_resize,
username=amodule.params['image_username'],
password=amodule.params['image_password'],
account_Id=self.validated_account_id,
@ -86,7 +134,8 @@ class decort_osimage(DecortController):
passwordDL=amodule.params['passwordDL'],
sepId=amodule.params['sepId'],
poolName=amodule.params['poolName'],
drivers=amodule.params['drivers'])
drivers=amodule.params['drivers'],
network_interface_naming=network_interface_naming)
self.result['changed'] = True
return image_facts
@ -126,7 +175,11 @@ class decort_osimage(DecortController):
image_id, image_facts = self.decort_virt_image_find(amodule)
return image_id, image_facts
def decort_osimage_package_facts(arg_osimage_facts, arg_check_mode=False):
@staticmethod
def decort_osimage_package_facts(
arg_osimage_facts: dict | None,
arg_check_mode=False,
):
"""Package a dictionary of OS image according to the decort_osimage module specification. This
dictionary will be returned to the upstream Ansible engine at the completion of the module run.
@ -154,13 +207,26 @@ class decort_osimage(DecortController):
ret_dict['id'] = arg_osimage_facts['id']
ret_dict['name'] = arg_osimage_facts['name']
ret_dict['size'] = arg_osimage_facts['size']
ret_dict['type'] = arg_osimage_facts['type']
# ret_dict['arch'] = arg_osimage_facts['architecture']
ret_dict['sep_id'] = arg_osimage_facts['sepId']
ret_dict['pool'] = arg_osimage_facts['pool']
ret_dict['state'] = arg_osimage_facts['status']
ret_dict['linkto'] = arg_osimage_facts['linkTo']
ret_dict['accountId'] = arg_osimage_facts['accountId']
ret_dict['boot_mode'] = arg_osimage_facts['bootType']
ret_dict['boot_loader_type'] = ''
match arg_osimage_facts['type']:
case 'cdrom' | 'virtual' as type:
ret_dict['type'] = type
case _ as boot_loader_type:
ret_dict['type'] = 'template'
ret_dict['boot_loader_type'] = boot_loader_type
ret_dict['network_interface_naming'] = arg_osimage_facts[
'networkInterfaceNaming'
]
ret_dict['hot_resize'] = arg_osimage_facts['hotResize']
return ret_dict
@property
@ -207,14 +273,6 @@ class decort_osimage(DecortController):
type='str',
default='KVM_X86',
),
imagetype=dict(
type='str',
default='linux',
),
boottype=dict(
type='str',
default='uefi',
),
url=dict(
type='str',
),
@ -229,9 +287,8 @@ class decort_osimage(DecortController):
poolName=dict(
type='str',
),
hotresize=dict(
hot_resize=dict(
type='bool',
default=False,
),
image_username=dict(
type='str',
@ -245,6 +302,33 @@ class decort_osimage(DecortController):
passwordDL=dict(
type='str',
),
boot=dict(
type='dict',
options=dict(
mode=dict(
type='str',
choices=[
'bios',
'uefi',
],
),
loader_type=dict(
type='str',
choices=[
'windows',
'linux',
'unknown',
],
),
),
),
network_interface_naming=dict(
type='str',
choices=[
'ens',
'eth',
],
),
),
supports_check_mode=True,
)

@ -117,29 +117,29 @@ class DecortUserInfo(DecortController):
start=dict(
type='dict',
options=dict(
unix=dict(
timestamp=dict(
type='int',
),
date_time=dict(
datetime=dict(
type='str',
),
),
mutually_exclusive=[
('unix', 'date_time'),
('timestamp', 'datetime'),
],
),
end=dict(
type='dict',
options=dict(
unix=dict(
timestamp=dict(
type='int',
),
date_time=dict(
datetime=dict(
type='str',
),
),
mutually_exclusive=[
('unix', 'date_time'),
('timestamp', 'datetime'),
],
),
),
@ -160,6 +160,23 @@ class DecortUserInfo(DecortController):
),
),
),
sorting=dict(
type='dict',
options=dict(
asc=dict(
type='bool',
default=True,
),
field=dict(
type='str',
choices=[
e.value
for e in self.AuditsSortableField
],
required=True,
),
),
),
),
),
objects_search=dict(
@ -184,7 +201,7 @@ class DecortUserInfo(DecortController):
match self.aparams['audits']:
case {'filter': {'time':
{'start': {'date_time': str() as dt_str}}
{'start': {'datetime': str() as dt_str}}
}
}:
if self.dt_str_to_sec(dt_str=dt_str) is None:
@ -192,7 +209,7 @@ class DecortUserInfo(DecortController):
check_error = True
match self.aparams['audits']:
case {'filter': {'time':
{'end': {'date_time': str() as dt_str}}
{'end': {'datetime': str() as dt_str}}
}
}:
if self.dt_str_to_sec(dt_str=dt_str) is None:
@ -283,16 +300,16 @@ class DecortUserInfo(DecortController):
mapped_args['max_status_code'] = max_status_code
match input_args_filter['time']:
case {'start': {'unix': int() as start_unix_time}}:
case {'start': {'timestamp': int() as start_unix_time}}:
mapped_args['start_unix_time'] = start_unix_time
case {'start': {'date_time': str() as start_dt_str}}:
case {'start': {'datetime': str() as start_dt_str}}:
mapped_args['start_unix_time'] = self.dt_str_to_sec(
dt_str=start_dt_str
)
match input_args_filter['time']:
case {'end': {'unix': int() as end_unix_time}}:
case {'end': {'timestamp': int() as end_unix_time}}:
mapped_args['end_unix_time'] = end_unix_time
case {'end': {'date_time': str() as end_dt_str}}:
case {'end': {'datetime': str() as end_dt_str}}:
mapped_args['end_unix_time'] = self.dt_str_to_sec(
dt_str=end_dt_str
)
@ -302,6 +319,16 @@ class DecortUserInfo(DecortController):
mapped_args['page_number'] = input_args_pagination['number']
mapped_args['page_size'] = input_args_pagination['size']
input_args_sorting = input_args['sorting']
if input_args_sorting:
mapped_args['sort_by_asc'] = input_args_sorting['asc']
input_args_sorting_field = input_args_sorting['field']
if input_args_sorting_field:
mapped_args['sort_by_field'] = (
self.AuditsSortableField(input_args_sorting_field)
)
return mapped_args
def run(self):

@ -3,14 +3,26 @@ from datetime import datetime
from enum import Enum
import json
import re
from typing import Any, Callable, Iterable, Literal, Optional, Tuple
from functools import wraps
from typing import (
Any,
Callable,
Iterable,
Literal,
Optional,
ParamSpec,
TypeVar,
)
import time
import jwt
import requests
from ansible.module_utils.basic import AnsibleModule, env_fallback
P = ParamSpec('P')
R = TypeVar('R')
class DecortController(object):
"""DecortController is a utility class that holds target controller context and handles API requests formatting
based on the requested authentication type.
@ -112,7 +124,7 @@ class DecortController(object):
IMAGE_TYPES = [
'cdrom',
'linux',
'other',
'unknown',
'virtual',
'windows',
]
@ -165,6 +177,14 @@ class DecortController(object):
DPDK = 'DPDK'
class AuditsSortableField(Enum):
Call = 'Call'
Guid = 'Guid'
ResponseTime = 'Response Time'
StatusCode = 'Status Code'
Time = 'Time'
class MESSAGES:
@staticmethod
def ssl_error(url: None | str = None):
@ -283,6 +303,13 @@ class DecortController(object):
return msg
@staticmethod
def default_value_used(param_name: str, default_value: Any) -> str:
return (
f'{param_name} parameter is not specified, '
f'default value "{default_value}" will be used.'
)
def __init__(self, arg_amodule: AnsibleModule):
"""
Instantiate DecortController() class at the beginning of any DECORT module run to have the following:
@ -325,10 +352,6 @@ class DecortController(object):
# if self.workflow_callback != "":
# self.workflow_callback_present = True
# The following will be initialized to the name of the user in DECORT controller, who corresponds to
# the credentials supplied as authentication information parameters.
self.decort_username = ''
# self.run_phase may eventually be deprecated in favor of self.results['waypoints']
self.run_phase = "Run phase: Initializing DecortController instance."
@ -392,40 +415,37 @@ class DecortController(object):
if self.authenticator == "jwt":
# validate supplied JWT on the DECORT controller
self.validate_jwt() # this call will abort the script if validation fails
jwt_decoded = jwt.decode(self.jwt, algorithms=["ES384"], options={"verify_signature": False})
self.decort_username = jwt_decoded['username'] + "@" + jwt_decoded['iss']
else:
# Oauth2 based authorization mode
# obtain JWT from Oauth2 provider and validate on the DECORT controller
self.obtain_jwt()
if self.controller_url is not None:
self.validate_jwt() # this call will abort the script if validation fails
jwt_decoded = jwt.decode(self.jwt, algorithms=["ES384"], options={"verify_signature": False})
self.decort_username = jwt_decoded['username'] + "@" + jwt_decoded['iss']
# self.run_phase = "Initializing DecortController instance complete."
return
@staticmethod
def waypoint(orig_f: Callable) -> Callable:
def waypoint(orig_f: Callable[P, R]) -> Callable[P, R]:
"""
A decorator for adding the name of called method to the string
`self.result['waypoints']`.
"""
@wraps(orig_f)
def new_f(self, *args, **kwargs):
self.result['waypoints'] += f' -> {orig_f.__name__}'
return orig_f(self, *args, **kwargs)
new_f.__name__ = orig_f.__name__
return new_f
@staticmethod
def checkmode(orig_f: Callable) -> Callable:
def checkmode(orig_f: Callable[P, R]) -> Callable[P, R | None]:
"""
A decorator for methods that should not executed in
Ansible Check Mode.
Instead of executing these methods, a message will be added
with the method name and the arguments with which it was called.
"""
@wraps(orig_f)
def new_f(self, *args, **kwargs):
if self.amodule.check_mode:
self.message(
@ -437,7 +457,6 @@ class DecortController(object):
)
else:
return orig_f(self, *args, **kwargs)
new_f.__name__ = orig_f.__name__
return new_f
@staticmethod
@ -978,6 +997,7 @@ class DecortController(object):
a['createdTime_readable'] = self.sec_to_dt_str(a['createdTime'])
a['deletedTime_readable'] = self.sec_to_dt_str(a['deletedTime'])
a['updatedTime_readable'] = self.sec_to_dt_str(a['updatedTime'])
a['description'] = a.pop('desc')
return accounts
@ -1009,12 +1029,19 @@ class DecortController(object):
start_unix_time: None | int = None,
end_unix_time: None | int = None,
page_number: int = 1,
sort_by_asc: bool = True,
sort_by_field: None | AuditsSortableField = None,
) -> dict[str, Any]:
"""
Implementation of the functionality of API method
`/cloudapi/user/getAudit`.
"""
sort_by = None
if sort_by_field:
sort_by_prefix = '+' if sort_by_asc else '-'
sort_by = f'{sort_by_prefix}{sort_by_field.value}'
api_params = {
'call': api_method,
'minStatusCode': min_status_code,
@ -1023,6 +1050,7 @@ class DecortController(object):
'timestampTo': end_unix_time,
'page': page_number,
'size': page_size,
'sortBy': sort_by,
}
api_resp = self.decort_api_call(
arg_req_function=requests.post,
@ -1457,7 +1485,11 @@ class DecortController(object):
cpu_pin: bool = False,
hp_backed: bool = False,
numa_affinity: Literal['none', 'loose', 'strict'] = 'none',
preferred_cpu_cores: list[int] | None = None):
preferred_cpu_cores: list[int] | None = None,
boot_mode: Literal['bios', 'uefi'] = 'bios',
boot_loader_type: Literal['linux', 'windows', 'unknown'] = 'unknown',
network_interface_naming: Literal['eth', 'ens'] = 'ens',
hot_resize: bool = False,):
"""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.
@ -1501,6 +1533,10 @@ class DecortController(object):
if not image_id:
api_url = '/restmachine/cloudapi/kvmx86/createBlank'
api_params['bootType'] = boot_mode
api_params['loaderType'] = boot_loader_type
api_params['networkInterfaceNaming'] = network_interface_naming
api_params['hotResize'] = hot_resize
else:
api_url = '/restmachine/cloudapi/kvmx86/create'
api_params['imageId'] = image_id
@ -1534,6 +1570,7 @@ class DecortController(object):
ifaces_for_delete = []
nets_for_attach = []
nets_for_change_ip = []
nets_for_change_mac_dict = {}
# Either only attaching or only detaching networks
if not ifaces or not new_networks:
@ -1607,14 +1644,21 @@ class DecortController(object):
else:
nets_for_attach.append(net)
# Adding networks for change IP address
for net_key, net in unchangeable_nets_dict.items():
# Adding networks for change IP address
if net['type'] in ('VINS', 'EXTNET'):
old_ip = ifaces_dict[net_key]['ipAddress']
current_ip = ifaces_dict[net_key]['ipAddress']
new_ip = net['ip_addr']
if new_ip and old_ip != new_ip:
if new_ip and current_ip != new_ip:
nets_for_change_ip.append(net)
# Adding networks for change MAC address
if net['type'] != self.VMNetType.EMPTY.value:
current_mac = ifaces_dict[net_key]['mac']
new_mac = net['mac']
if new_mac and current_mac != new_mac:
nets_for_change_mac_dict[net_key] = net
# Detaching networks
for iface in ifaces_for_delete:
self.decort_api_call(
@ -1639,6 +1683,7 @@ class DecortController(object):
'netId': net.get('id') or 0,
'ipAddr': net.get('ip_addr'),
'mtu': net.get('mtu'),
'mac_addr': net.get('mac'),
},
)
self.set_changed()
@ -1649,10 +1694,23 @@ class DecortController(object):
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'],
'compute_id': vm_id,
'net_type': net['type'],
'net_id': net['id'],
'ip_addr': net['ip_addr'],
},
)
self.set_changed()
# Changing MAC adresses
for net_key, net in nets_for_change_mac_dict.items():
self.decort_api_call(
arg_req_function=requests.post,
arg_api_name='/restmachine/cloudapi/compute/changeMac',
arg_params={
'compute_id': vm_id,
'current_mac_address': ifaces_dict[net_key]['mac'],
'new_mac_address': net['mac'],
},
)
self.set_changed()
@ -1717,8 +1775,7 @@ class DecortController(object):
self.result['msg'] = "compute_restore() in check mode: restore Compute ID {} was requested.".format(comp_id)
return
api_params = dict(computeId=comp_id,
reason="Restored on user {} request by Ansible DECORT module.".format(self.decort_username))
api_params = dict(computeId=comp_id)
self.decort_api_call(requests.post, "/restmachine/cloudapi/compute/restore", api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.
self.result['failed'] = False
@ -1997,6 +2054,10 @@ class DecortController(object):
description: Optional[str] = None,
auto_start: Optional[bool] = None,
preferred_cpu_cores: list[int] | None = None,
boot_mode: None | Literal['bios', 'uefi'] = None,
boot_loader_type: None | Literal['linux', 'windows', 'unknown'] = None,
network_interface_naming: None | Literal['eth', 'ens'] = None,
hot_resize: None | bool = None,
):
OBJ = 'compute'
@ -2015,6 +2076,10 @@ class DecortController(object):
'preferredCpu': (
[-1] if preferred_cpu_cores == [] else preferred_cpu_cores
),
'bootType': boot_mode,
'loaderType': boot_loader_type,
'networkInterfaceNaming': network_interface_naming,
'hotResize': hot_resize,
},
)
@ -2029,6 +2094,10 @@ class DecortController(object):
'description': description,
'auto_start': auto_start,
'preferred_cpu_cores': preferred_cpu_cores,
'boot_mode': boot_mode,
'loader_type': boot_loader_type,
'network_interface_naming': network_interface_naming,
'hot_resize': hot_resize,
}
for param, value in params_to_check.items():
if value is not None:
@ -2315,18 +2384,43 @@ class DecortController(object):
return 0, None
def image_create(self,img_name,url,gid,boottype,imagetype,drivers,hotresize,username,password,account_Id,usernameDL,passwordDL,sepId,poolName):
def image_create(
self,
img_name,
url,
gid,
drivers,
username,
password,
account_Id,
usernameDL,
passwordDL,
sepId,
poolName,
boot_mode: Literal['bios', 'uefi'] = 'bios',
boot_loader_type: Literal['linux', 'windows', 'unknown'] = 'unknown',
network_interface_naming: Literal['eth', 'ens'] = 'ens',
hot_resize: bool = False,
):
self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "image_create")
api_params = dict(name=img_name, url=url,
gid=gid, boottype=boottype,
imagetype=imagetype,
drivers=drivers, accountId=account_Id,
hotresize=hotresize, username=username,
password=password, usernameDL=usernameDL,
passwordDL=passwordDL, sepId=sepId,
poolName=poolName,
)
api_params = {
'name': img_name,
'url': url,
'gid': gid,
'boottype': boot_mode,
'imagetype': boot_loader_type,
'drivers': drivers,
'accountId': account_Id,
'hotresize': hot_resize,
'username': username,
'password': password,
'usernameDL': usernameDL,
'passwordDL': passwordDL,
'sepId': sepId,
'poolName': poolName,
'networkInterfaceNaming': network_interface_naming,
}
api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/image/create", api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.
virt_image_dict = json.loads(api_resp.content.decode('utf8'))
@ -2775,8 +2869,7 @@ class DecortController(object):
self.result['msg'] = "rg_restore() in check mode: restore RG ID {} was requested.".format(arg_rg_id)
return
api_params = dict(rgId=arg_rg_id,
reason="Restored on user {} request by DECORT Ansible module.".format(self.decort_username), )
api_params = dict(rgId=arg_rg_id)
self.decort_api_call(requests.post, "/restmachine/cloudapi/rg/restore", api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.
self.result['failed'] = False
@ -2919,6 +3012,7 @@ class DecortController(object):
account_details['computes_amount'] = account_details.pop('computes')
account_details['vinses_amount'] = account_details.pop('vinses')
account_details['description'] = account_details.pop('desc')
account_details['createdTime_readable'] = self.sec_to_dt_str(
account_details['createdTime']
@ -3082,6 +3176,7 @@ class DecortController(object):
rg['createdTime_readable'] = self.sec_to_dt_str(rg['createdTime'])
rg['deletedTime_readable'] = self.sec_to_dt_str(rg['deletedTime'])
rg['updatedTime_readable'] = self.sec_to_dt_str(rg['updatedTime'])
rg['description'] = rg.pop('desc')
return resource_groups
@ -3682,7 +3777,8 @@ class DecortController(object):
gpu_quota: None | int = None,
public_ip_quota: None | int = None,
ram_quota: None | int = None,
sep_pools: None | Iterable[str] = None,) -> None:
sep_pools: None | Iterable[str] = None,
description: None | str = None,) -> None:
"""
Implementation of functionality of the API method
`/cloudapi/account/update`.
@ -3707,6 +3803,7 @@ class DecortController(object):
'name': name,
'sendAccessEmails': access_emails,
'uniqPools': sep_pools,
'desc': description,
},
not_fail_codes=[404]
)
@ -4078,8 +4175,7 @@ class DecortController(object):
self.result['msg'] = "vins_restore() in check mode: restore ViNS ID {} was requested.".format(vins_id)
return
api_params = dict(vinsId=vins_id,
reason="Restored on user {} request by DECORT Ansible module.".format(self.decort_username), )
api_params = dict(vinsId=vins_id)
self.decort_api_call(requests.post, "/restmachine/cloudapi/vins/restore", api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.
self.result['failed'] = False
@ -4121,8 +4217,7 @@ class DecortController(object):
return
vinsstate_api = "" # this string will also be used as a flag to indicate that API call is necessary
api_params = dict(vinsId=vins_dict['id'],
reason='Changed by DECORT Ansible module, vins_state method.')
api_params = dict(vinsId=vins_dict['id'])
expected_state = ""
if vins_dict['status'] in ["CREATED", "ENABLED"] and desired_state == 'disabled':
@ -4466,8 +4561,7 @@ class DecortController(object):
api_params = dict(diskId=disk_id,
detach=detach,
permanently=permanently,
reason=reason)
permanently=permanently)
self.decort_api_call(requests.post, "/restmachine/cloudapi/disks/delete", api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.
self.result['failed'] = False
@ -4594,7 +4688,6 @@ class DecortController(object):
self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "disk_creation")
api_params = dict(accountId=accountId,
gid=0, # depricated
name=name,
description=description,
size=size,
@ -4709,8 +4802,7 @@ class DecortController(object):
self.result['msg'] = "disk_restore() in check mode: restore Disk ID {} was requested.".format(disk_id)
return
api_params = dict(diskId=disk_id,
reason="Restored on user {} request by DECORT Ansible module.".format(self.decort_username), )
api_params = dict(diskId=disk_id)
self.decort_api_call(requests.post, "/restmachine/cloudapi/disks/restore", api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.
self.result['failed'] = False
@ -5757,7 +5849,13 @@ class DecortController(object):
self.result['msg'] = ("group_state(): no start/stop action required for B-service ID {} "
"to desired state '{}'.").format(bs_id,desired_state)
return
def group_resize_count(self,bs_id,gr_dict,desired_count):
def group_resize_count(
self,
bs_id,
gr_dict,
desired_count,
chipset: Literal['Q35', 'i440fx'] = 'i440fx',
):
self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "group_resize_count")
@ -5767,7 +5865,8 @@ class DecortController(object):
serviceId=bs_id,
compgroupId=gr_dict['id'],
count=desired_count,
mode="ABSOLUTE"
mode="ABSOLUTE",
chipset=chipset,
)
api_url = "/restmachine/cloudapi/bservice/groupResize"
self.decort_api_call(requests.post, api_url, api_params)
@ -5826,10 +5925,10 @@ class DecortController(object):
#rly need connect group to extnet ?
return
def group_provision(
self,bs_id,arg_name,arg_count=1,arg_cpu=1,arg_ram=1024,
self,bs_id,arg_name,chipset: Literal['Q35', 'i440fx'],arg_count=1,arg_cpu=1,arg_ram=1024,
arg_boot_disk=10,arg_image_id=0,arg_driver="KVM_X86",arg_role="",
arg_network=None,arg_timeout=0
):
arg_network=None,arg_timeout=0,
):
self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "group_provision")
@ -5848,7 +5947,8 @@ class DecortController(object):
role = arg_role,
vinses = [n['id'] for n in arg_network if n['type'] == 'VINS'],
extnets = [n['id'] for n in arg_network if n['type'] == 'EXTNET'],
timeoutStart = arg_timeout
timeoutStart = arg_timeout,
chipset=chipset,
)
api_resp = self.decort_api_call(requests.post, api_url, api_params)
new_bsgroup_id = int(api_resp.text)

@ -45,7 +45,7 @@
| 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)<br>Значения:<br>`oauth2`<br>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. |
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ. |
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ.<br>Если параметр не задан, размер будет равен размеру образа.<br>Если не заданы этот параметр и параметры `image_id` и `image_name`, то виртуальная машина будет создана без загрузочного диска. |
| chipset | (string)<br>Значения:<br>`Q35`<br>`i440fx` | Эмулируемый чипсет. |
| ci_user_data | (dict) | конфигурация для cloud-init
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данная виртуальная машина. Данный параметр является обязательным. |
@ -55,10 +55,10 @@
| data_disks | (list) | Список идентификаторов дисков, которые следует подключить к данной виртуальной машине как дополнительные.<br>Чтобы отключить все диски, нужно указать пустой список `[]`.|
| hp_backed | (bool) | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. Система должна быть предварительно сконфигурирована путем выделения Huge Pages на физическом узле. <br>Значение по умолчанию при создании: `false`. |
| 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 | (string) | Название образа, на базе которого следует создать ВМ. При создании требуется задать этот параметр или параметр `image_id`. При любых других операциях данные параметры игнорируются. |
| image_id | (int) | Уникальный цифровой идентификатор образа, на базе которого следует создать виртуальную машину.<br>Если заданы оба параметра (`image_id` и `image_name`), то `image_name` игнорируется.<br>Если этот параметр и параметр `image_name` не заданы, то виртуальная машина будет создана без образа. |
| image_name | (string) | Название образа, на базе которого следует создать ВМ.<br>Если этот параметр и параметр `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` игнорируется и идентификация сервера выполняется по `id`.|
| name | (string) | Имя ВМ. Чтобы модуль **decort_kvmvm** мог управлять сервером по его названию, также необходимо задать комбинацию `account_name` и `rg_name` или `rg_id`. Если для существующей ВМ указаны и `name`, и `id`, то параметр `name` используется для переименования. |
| network_order_changing | (bool)<br>Default:<br>`false` | Соблюдение очерёдности сетей при их изменении.<br>Если `true`, то сравнение списка уже подключённых к ВМ сетей со списком из параметра `networks` будет производится <u>с учётом очерёдности сетей</u> и, <u>при выявлении несоответствия, сначала будет произведено отключение всех сетей от ВМ</u>, а затем подключение сетей в соответствии с параметром `networks`.<br> Если `false`, то очерёдность при сравнении учитываться не будет. Соответственно, сети, которые имеются в списке параметра `networks` и уже подключены к ВМ, переподключаться не будут, что может кратно уменьшить время выполнения изменения сетей. |
| networks | (list) | Список словарей, описывающих сети ВМ.<br>Ключи словаря:<br>&bull; `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя), `EXTNET` (внешняя), `VFNIC` (вирт. функция), `DPDK`, `EMPTY` (без подключения к сети)<br>&bull; `id` (int) (необязательный) - идентификатор внутренней/внешней/DPDK сети или пула вирт. функций<br>&bull; `ip_addr` (string) (необязательный) - IP-адрес, используемый для подключения к данной сети; применимо только для `VINS` и `EXTNET`.<br>ВМ не может одновременно быть подключена к сети DPDK и к сети другого типа.<br>Чтобы отключить все сети, нужно указать пустой список `[]`. |
| numa_affinity | (str)<br>Значения:<br>`strict`<br>`loose`<br>`none` | Правило применения NUMA affinity к виртуальной машине. <br>`strict` - строго с NUMA affinity, `loose` - использовать NUMA affinity, если возможно, `none` - отменить применение NUMA affinity. <br>Значение по умолчанию при создании: `none`. |
@ -92,7 +92,7 @@
| hp_backed | bool | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. |
| id | int | Идентификатор ВМ. |
| image_id | id | Идентификатор образа.
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ. |
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ, отсортированный по номеру слота PCI. |
| name | string | Имя ВМ. |
| numa_affinity | str | Правило применения NUMA affinity к виртуальной машине. |
| password | string | Пароль пользователя ОС по умолчанию. |

@ -5,7 +5,7 @@
Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет:
- создавать ресурсные группы
- удалять ресурсные группы (в корзину или безвозвратно)
- удалять ресурсные группы (в корзину или безвозвратно, с удалением содержимого или без)
- восстанавливать ресурсные группы из корзины
- включать/отключать ресурсные группы
- запрашивать информацию об уже существующих ресурсных группах
@ -40,6 +40,7 @@
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. |
| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
| recursive_deletion | (bool)<br>Default: `false` | Рекурсивное удаление.<br>Если `true`, то при удалении РГ будет удалено всё её содержимое.<br>Если `false`, то при удалении непустой РГ работа модуля завершится ошибкой. |
| rename | (string) | Новое имя ресурсной группы.<br>Возможно переименование только включенной ресурсной группы. |
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. Является обязательным при изменении РГ если не заданы `rg_name` и `account_id`/`account_name` |
| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным при создании. |

@ -54,7 +54,7 @@
| aff_rule | (list) | Список словарей, описывающих affinity правила.<br>Ключи словаря:<br>&bull; `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)<br>&bull; `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`<br>&bull; `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)<br>&bull; `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила<br>&bull; `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`).<br>Чтобы очистить affinity правила, нужно указать пустой список `[]`. |
| affinity_label | (str) | Метка affinity.<br>Чтобы очистить метку affinity, нужно указать пустую строку `""`. |
| auto_start | (bool) | Включить/выключить автоматический запуск ВМ после перезапуска вычислительного узла, за которым она закреплена.<br> Если параметр не задан при создании ВМ, то значение будет выбрано платформой. |
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ. |
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ.<br>Если параметр не задан, размер будет равен размеру образа.<br>Если не заданы этот параметр и параметры `image_id` и `image_name`, то виртуальная машина будет создана без загрузочного диска. |
| chipset | (string)<br>Значения:<br>`Q35`<br>`i440fx` | Эмулируемый чипсет. |
| ci_user_data | (dict) | конфигурация для cloud-init
| cpu | (int) | Количество виртуальных процессоров, выделяемых виртуальной машине. |
@ -64,9 +64,9 @@
| description | (string) | Опциональное описание виртуальной машины. |
| hp_backed | (bool) | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. Система должна быть предварительно сконфигурирована путем выделения Huge Pages на физическом узле. <br>Значение по умолчанию при создании: `false`. |
| 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 | (string) | Название образа, на базе которого следует создать ВМ. При создании требуется задать этот параметр или параметр `image_id`. При любых других операциях данные параметры игнорируются. |
| name | (string) | Имя ВМ. Чтобы модуль **decort_kvmvm** мог управлять сервером по его названию, также необходимо задать комбинацию `account_name` и `rg_name` или `rg_id`. Если для существующей ВМ указаны и `name`, и `id`, то параметр `name` игнорируется и идентификация сервера выполняется по `id`.|
| image_id | (int) | Уникальный цифровой идентификатор образа, на базе которого следует создать виртуальную машину.<br>Если заданы оба параметра (`image_id` и `image_name`), то `image_name` игнорируется.<br>Если этот параметр и параметр `image_name` не заданы, то виртуальная машина будет создана без образа. |
| image_name | (string) | Название образа, на базе которого следует создать ВМ.<br>Если этот параметр и параметр `image_id` не заданы, то виртуальная машина будет создана без образа. |
| name | (string) | Имя ВМ. Чтобы модуль **decort_kvmvm** мог управлять сервером по его названию, также необходимо задать комбинацию `account_name` и `rg_name` или `rg_id`. Если для существующей ВМ указаны и `name`, и `id`, то параметр `name` используется для переименования. |
| network_order_changing | (bool)<br>Default:<br>`false` | Соблюдение очерёдности сетей при их изменении.<br>Если `true`, то сравнение списка уже подключённых к ВМ сетей со списком из параметра `networks` будет производится <u>с учётом очерёдности сетей</u> и, <u>при выявлении несоответствия, сначала будет произведено отключение всех сетей от ВМ</u>, а затем подключение сетей в соответствии с параметром `networks`.<br> Если `false`, то очерёдность при сравнении учитываться не будет. Соответственно, сети, которые имеются в списке параметра `networks` и уже подключены к ВМ, переподключаться не будут, что может кратно уменьшить время выполнения изменения сетей. |
| networks | (list) | Список словарей, описывающих сети ВМ.<br>Ключи словаря:<br>&bull; `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя), `EXTNET` (внешняя), `VFNIC` (вирт. функция), `DPDK`, `EMPTY` (без подключения к сети)<br>&bull; `id` (int) (необязательный) - идентификатор внутренней/внешней/DPDK сети или пула вирт. функций<br>&bull; `ip_addr` (string) (необязательный) - IP-адрес, используемый для подключения к данной сети; применимо только для `VINS` и `EXTNET`<br>&bull; `mtu` (int) (необязательный) - MTU интерфейса; применимо только для `DPDK`.<br>ВМ не может одновременно быть подключена к сети DPDK и к сети другого типа.<br>Чтобы отключить все сети, нужно указать пустой список `[]`. |
| numa_affinity | (str)<br>Значения:<br>`strict`<br>`loose`<br>`none` | Правило применения NUMA affinity к виртуальной машине. <br>`strict` - строго с NUMA affinity, `loose` - использовать NUMA affinity, если возможно, `none` - отменить применение NUMA affinity. <br>Значение по умолчанию при создании: `none`. |
@ -99,7 +99,7 @@
| hp_backed | bool | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. |
| id | int | Идентификатор ВМ. |
| image_id | id | Идентификатор образа.
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ. |
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ, отсортированный по номеру слота PCI. |
| name | string | Имя ВМ. |
| numa_affinity | str | Правило применения NUMA affinity к виртуальной машине. |
| password | string | Пароль пользователя ОС по умолчанию. |

@ -5,7 +5,7 @@
Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет:
- создавать ресурсные группы
- удалять ресурсные группы (в корзину или безвозвратно)
- удалять ресурсные группы (в корзину или безвозвратно, с удалением содержимого или без)
- восстанавливать ресурсные группы из корзины
- включать/отключать ресурсные группы
- запрашивать информацию об уже существующих ресурсных группах
@ -33,6 +33,7 @@
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. |
| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
| recursive_deletion | (bool)<br>Default: `false` | Рекурсивное удаление.<br>Если `true`, то при удалении РГ будет удалено всё её содержимое.<br>Если `false`, то при удалении непустой РГ работа модуля завершится ошибкой. |
| rename | (string) | Новое имя ресурсной группы.<br>Возможно переименование только включенной ресурсной группы. |
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. Является обязательным при изменении РГ если не заданы `rg_name` и `account_id`/`account_name` |
| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным при создании. |

@ -58,7 +58,7 @@
| aff_rule | (list) | Список словарей, описывающих affinity правила.<br>Ключи словаря:<br>&bull; `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)<br>&bull; `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`<br>&bull; `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)<br>&bull; `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила<br>&bull; `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`).<br>Чтобы очистить affinity правила, нужно указать пустой список `[]`. |
| affinity_label | (str) | Метка affinity.<br>Чтобы очистить метку affinity, нужно указать пустую строку `""`. |
| auto_start | (bool) | Включить/выключить автоматический запуск ВМ после перезапуска вычислительного узла, за которым она закреплена.<br> Если параметр не задан при создании ВМ, то значение будет выбрано платформой. |
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ. |
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ.<br>Если параметр не задан, размер будет равен размеру образа.<br>Если не заданы этот параметр и параметры `image_id` и `image_name`, то виртуальная машина будет создана без загрузочного диска. |
| chipset | (string)<br>Значения:<br>`Q35`<br>`i440fx` | Эмулируемый чипсет. Значение по умолчанию при создании: `i440fx`.|
| ci_user_data | (dict) | конфигурация для cloud-init
| cpu | (int) | Количество виртуальных процессоров, выделяемых виртуальной машине. |
@ -68,9 +68,9 @@
| description | (string) | Опциональное описание виртуальной машины. |
| hp_backed | (bool) | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. Система должна быть предварительно сконфигурирована путем выделения Huge Pages на физическом узле. <br>Значение по умолчанию при создании: `false`. |
| 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 | (string) | Название образа, на базе которого следует создать ВМ. При создании требуется задать этот параметр или параметр `image_id`. При любых других операциях данные параметры игнорируются. |
| name | (string) | Имя ВМ. Чтобы модуль **decort_kvmvm** мог управлять сервером по его названию, также необходимо задать комбинацию `account_name` и `rg_name` или `rg_id`. Если для существующей ВМ указаны и `name`, и `id`, то параметр `name` игнорируется и идентификация сервера выполняется по `id`.|
| image_id | (int) | Уникальный цифровой идентификатор образа, на базе которого следует создать виртуальную машину.<br>Если заданы оба параметра (`image_id` и `image_name`), то `image_name` игнорируется.<br>Если этот параметр и параметр `image_name` не заданы, то виртуальная машина будет создана без образа. |
| image_name | (string) | Название образа, на базе которого следует создать ВМ.<br>Если этот параметр и параметр `image_id` не заданы, то виртуальная машина будет создана без образа. |
| name | (string) | Имя ВМ. Чтобы модуль **decort_kvmvm** мог управлять сервером по его названию, также необходимо задать комбинацию `account_name` и `rg_name` или `rg_id`. Если для существующей ВМ указаны и `name`, и `id`, то параметр `name` используется для переименования. |
| network_order_changing | (bool)<br>Default:<br>`false` | Соблюдение очерёдности сетей при их изменении.<br>Если `true`, то сравнение списка уже подключённых к ВМ сетей со списком из параметра `networks` будет производится <u>с учётом очерёдности сетей</u> и, <u>при выявлении несоответствия, сначала будет произведено отключение всех сетей от ВМ</u>, а затем подключение сетей в соответствии с параметром `networks`.<br> Если `false`, то очерёдность при сравнении учитываться не будет. Соответственно, сети, которые имеются в списке параметра `networks` и уже подключены к ВМ, переподключаться не будут, что может кратно уменьшить время выполнения изменения сетей. |
| networks | (list) | Список словарей, описывающих сети ВМ.<br>Ключи словаря:<br>&bull; `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя), `EXTNET` (внешняя), `VFNIC` (вирт. функция), `DPDK`, `EMPTY` (без подключения к сети)<br>&bull; `id` (int) (необязательный) - идентификатор внутренней/внешней/DPDK сети или пула вирт. функций<br>&bull; `ip_addr` (string) (необязательный) - IP-адрес, используемый для подключения к данной сети; применимо только для `VINS` и `EXTNET`<br>&bull; `mtu` (int) (необязательный) - MTU интерфейса; применимо только для `DPDK`.<br>ВМ не может одновременно быть подключена к сети DPDK и к сети другого типа.<br>Чтобы отключить все сети, нужно указать пустой список `[]`. |
| numa_affinity | (str)<br>Значения:<br>`strict`<br>`loose`<br>`none` | Правило применения NUMA affinity к виртуальной машине. <br>`strict` - строго с NUMA affinity, `loose` - использовать NUMA affinity, если возможно, `none` - отменить применение NUMA affinity. <br>Значение по умолчанию при создании: `none`. |
@ -105,7 +105,7 @@
| hp_backed | bool | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. |
| id | int | Идентификатор ВМ. |
| image_id | id | Идентификатор образа.
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ. |
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ, отсортированный по номеру слота PCI. |
| name | string | Имя ВМ. |
| numa_affinity | str | Правило применения NUMA affinity к виртуальной машине. |
| password | string | Пароль пользователя ОС по умолчанию. |

@ -5,7 +5,7 @@
Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет:
- создавать ресурсные группы
- удалять ресурсные группы (в корзину или безвозвратно)
- удалять ресурсные группы (в корзину или безвозвратно, с удалением содержимого или без)
- восстанавливать ресурсные группы из корзины
- включать/отключать ресурсные группы
- запрашивать информацию об уже существующих ресурсных группах
@ -33,6 +33,7 @@
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. |
| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
| recursive_deletion | (bool)<br>Default: `false` | Рекурсивное удаление.<br>Если `true`, то при удалении РГ будет удалено всё её содержимое.<br>Если `false`, то при удалении непустой РГ работа модуля завершится ошибкой. |
| rename | (string) | Новое имя ресурсной группы.<br>Возможно переименование только включенной ресурсной группы. |
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. Является обязательным при изменении РГ если не заданы `rg_name` и `account_id`/`account_name` |
| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным при создании. |

@ -61,7 +61,7 @@
| aff_rule | (list) | Список словарей, описывающих affinity правила.<br>Ключи словаря:<br>&bull; `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)<br>&bull; `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`<br>&bull; `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)<br>&bull; `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила<br>&bull; `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`).<br>Чтобы очистить affinity правила, нужно указать пустой список `[]`. |
| affinity_label | (str) | Метка affinity.<br>Чтобы очистить метку affinity, нужно указать пустую строку `""`. |
| auto_start | (bool) | Включить/выключить автоматический запуск ВМ после перезапуска вычислительного узла, за которым она закреплена.<br> Если параметр не задан при создании ВМ, то значение будет выбрано платформой. |
| boot | (dict) | Параметры загрузки.<br>Ключи словаря:<br>&bull; `disk_id` (int) - идентификатор диска, который будет установлен как загрузочный;<br>&bull; `disk_size` (int) - объём загрузочного диска виртуальной машины в ГБ. |
| boot | (dict) | Параметры загрузки.<br>Ключи словаря:<br>&bull; `disk_id` (int) - идентификатор диска, который будет установлен как загрузочный;<br>&bull; `disk_size` (int) - объём загрузочного диска виртуальной машины в ГБ. Если параметр не задан, размер будет равен размеру образа. Если не заданы этот параметр и параметры `image_id` и `image_name`, то виртуальная машина будет создана без загрузочного диска. |
| chipset | (string)<br>Значения:<br>`Q35`<br>`i440fx` | Эмулируемый чипсет. Значение по умолчанию при создании: `i440fx`.|
| ci_user_data | (dict) | конфигурация для cloud-init
| clone_from | (dict) | Словарь параметров для создания ВМ путём клонирования другой ВМ.<br>Ключи словаря:<br>&bull; `id` (int) (обязательный) - идентификатор клонируемой ВМ<br>&bull; `force` (bool) - игнорировать, что ВМ запущена; значение по умолчанию: `false`<br>&bull; `snapshot` (dict) - словарь параметров клонируемого снимка ВМ. Ключи словаря: `name` (str) - название снимка; `timestamp` (int) - unix-время; `datetime` (str) - дата и время в формате `ггггммддччммсс`, альтернатива параметру `timestamp`, допустимо использовать любой разделитель между группами цифр для повышения читаемости, например, `гггг-мм-дд чч:мм:сс`.<br>Для создания клона также должен быть указан параметр `name` для указания имени клона.|
@ -73,9 +73,9 @@
| get_console_url | (bool)<br>Default:<br>`false` | Получить ссылку на консоль ВМ. |
| hp_backed | (bool) | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. Система должна быть предварительно сконфигурирована путем выделения Huge Pages на физическом узле. <br>Значение по умолчанию при создании: `false`. |
| 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 | (string) | Название образа, на базе которого следует создать ВМ. При создании требуется задать этот параметр или параметр `image_id`. При любых других операциях данные параметры игнорируются. |
| name | (string) | Имя ВМ. Чтобы модуль **decort_kvmvm** мог управлять сервером по его названию, также необходимо задать комбинацию `account_name` и `rg_name` или `rg_id`. Если для существующей ВМ указаны и `name`, и `id`, то параметр `name` игнорируется и идентификация сервера выполняется по `id`.|
| image_id | (int) | Уникальный цифровой идентификатор образа, на базе которого следует создать виртуальную машину.<br>Если заданы оба параметра (`image_id` и `image_name`), то `image_name` игнорируется.<br>Если этот параметр и параметр `image_name` не заданы, то виртуальная машина будет создана без образа. |
| image_name | (string) | Название образа, на базе которого следует создать ВМ.<br>Если этот параметр и параметр `image_id` не заданы, то виртуальная машина будет создана без образа. |
| name | (string) | Имя ВМ. Чтобы модуль **decort_kvmvm** мог управлять сервером по его названию, также необходимо задать комбинацию `account_name` и `rg_name` или `rg_id`. Если для существующей ВМ указаны и `name`, и `id`, то параметр `name` используется для переименования. |
| network_order_changing | (bool)<br>Default:<br>`false` | Соблюдение очерёдности сетей при их изменении.<br>Если `true`, то сравнение списка уже подключённых к ВМ сетей со списком из параметра `networks` будет производится <u>с учётом очерёдности сетей</u> и, <u>при выявлении несоответствия, сначала будет произведено отключение всех сетей от ВМ</u>, а затем подключение сетей в соответствии с параметром `networks`.<br> Если `false`, то очерёдность при сравнении учитываться не будет. Соответственно, сети, которые имеются в списке параметра `networks` и уже подключены к ВМ, переподключаться не будут, что может кратно уменьшить время выполнения изменения сетей. |
| networks | (list) | Список словарей, описывающих сети ВМ.<br>Ключи словаря:<br>&bull; `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя), `EXTNET` (внешняя), `VFNIC` (вирт. функция), `DPDK`, `EMPTY` (без подключения к сети)<br>&bull; `id` (int) (необязательный) - идентификатор внутренней/внешней/DPDK сети или пула вирт. функций<br>&bull; `ip_addr` (string) (необязательный) - IP-адрес, используемый для подключения к данной сети; применимо только для `VINS` и `EXTNET`<br>&bull; `mtu` (int) (необязательный) - MTU интерфейса; применимо только для `DPDK`.<br>ВМ не может одновременно быть подключена к сети DPDK и к сети другого типа.<br>Чтобы отключить все сети, нужно указать пустой список `[]`. |
| numa_affinity | (str)<br>Значения:<br>`strict`<br>`loose`<br>`none` | Правило применения NUMA affinity к виртуальной машине. <br>`strict` - строго с NUMA affinity, `loose` - использовать NUMA affinity, если возможно, `none` - отменить применение NUMA affinity. <br>Значение по умолчанию при создании: `none`. |
@ -113,7 +113,7 @@
| hp_backed | bool | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. |
| id | int | Идентификатор ВМ. |
| image_id | id | Идентификатор образа.
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ. |
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ, отсортированный по номеру слота PCI. |
| name | string | Имя ВМ. |
| numa_affinity | str | Правило применения NUMA affinity к виртуальной машине. |
| password | string | Пароль пользователя ОС по умолчанию. |

@ -5,7 +5,7 @@
Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет:
- создавать ресурсные группы
- удалять ресурсные группы (в корзину или безвозвратно)
- удалять ресурсные группы (в корзину или безвозвратно, с удалением содержимого или без)
- восстанавливать ресурсные группы из корзины
- включать/отключать ресурсные группы
- запрашивать информацию об уже существующих ресурсных группах
@ -34,6 +34,7 @@
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. |
| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
| recursive_deletion | (bool)<br>Default: `false` | Рекурсивное удаление.<br>Если `true`, то при удалении РГ будет удалено всё её содержимое.<br>Если `false`, то при удалении непустой РГ работа модуля завершится ошибкой. |
| rename | (string) | Новое имя ресурсной группы.<br>Возможно переименование только включенной ресурсной группы. |
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. Является обязательным при изменении РГ если не заданы `rg_name` и `account_id`/`account_name` |
| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным при создании. |

@ -0,0 +1,25 @@
1. [Введение](./введение.md)
- [Введение](./введение.md#введение)
- [Системные требования](./введение.md#системные-требования)
- [Подготовка к работе](./введение.md#подготовка-к-работе)
- [Авторизация](./введение.md#авторизация)
- [Общие параметры модулей для авторизации](./введение.md#общие-параметры-модулей-для-авторизации)
- [Пример авторизации с помощью DECS3O](./введение.md#пример-авторизации-с-помощью-decs3o)
- [Пример авторизации с помощью BVS](./введение.md#пример-авторизации-с-помощью-bvs)
- [Пример авторизации с помощью JSON Web Token](./введение.md#пример-авторизации-с-помощью-json-web-token)
2. 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) - получение информации о пользователе
- [Модуль decort_snapshot](./модуль-decort_snapshot.md) - управление снимками виртуальной машины

@ -0,0 +1,249 @@
# Модули Ansible для управления облачными ресурсами в платформе DECORT
## Введение
Настоящая документация содержит руководство пользователя по библиотеке модулей decort для Ansible. С помощью этих модулей Вы сможете управлять созданием и конфигурированием облачных ресурсов в платформе DECORT (Digital Energy Cloud Orchestration Technology).
По каждому модулю есть своя документация, в которой вы можете найти список доступных действий, подробную информацию о входных параметрах и возвращаемых данных, а также примеры использования.
## Системные требования
Убедитесь, что Ваша система соответствует требованиям для работы модуля DECORT.
Системные требования для работы модуля:
- Ansible 10.7.0
- Python 3.10.12
- requests 2.32.3 Python module
- DynamiX Enterprise 4.3.0
## Подготовка к работе
Для начала работы необходимо, чтобы Ansible было известно местоположение файлов модулей. Для этого необходимо:
- либо разместить директории **library** и **module_utils** в одной директории с плейбуками
- либо в рабочей директории, из которой будет запускаться Ansible, разместить файл **ansible.cfg**, в котором задать пути к файлам модулей, например:
```
[defaults]
library=./library
module_utils=./module_utils
```
## Авторизация
### Общие параметры модулей для авторизации
<table>
<tr>
<th colspan="6">Параметр</th>
<th>Тип</th>
<th>Описание</th>
</tr>
<tr>
<td colspan="6">
app_id
</td>
<td>
(str)
</td>
<td>
Идентификатор приложения, использующийся для получения токена в режимах
<code>authenticator: bvs</code> или <code>authenticator: decs3o</code>.
Данный параметр является обязательным для указанных режимов. Если
параметр не задан в playbook, модуль будет использовать значение
переменной окружения <code>DECORT_APP_ID</code>.
</td>
</tr>
<tr>
<td colspan="6">
app_secret
</td>
<td>
(str)
</td>
<td>
Секретный ключ приложения, использующийся для получения токена в режимах
<code>authenticator: bvs</code> или <code>authenticator: decs3o</code>.
Данный параметр является обязательным для указанных режимов.
Так как он содержит секретную информацию, то его не рекомендуется
задавать непосредственно в playbook. Если параметр не задан в playbook,
то модуль будет использовать значение переменной окружения
<code>DECORT_APP_SECRET</code>.
</td>
</tr>
<tr>
<td colspan="6">
authenticator
</td>
<td>
(str)
<br>Значения:
<br/><code>bvs</code>
<br/><code>decs3o</code>
<br/><code>oauth2</code>
<br/><code>jwt</code>
<br>Default: <code>decs3o</code>
</td>
<td>
Режим аутентификации для получения токена.
Значение <code>oauth2</code> является устаревшим и равнозначным
<code>decs3o</code>.
</td>
</tr>
<tr>
<td colspan="6">
controller_url
</td>
<td>
(str)
</td>
<td>
URL контроллера, соответствующего экземпляру облачной платформы
DECORT. Данный параметр является обязательным.
</td>
</tr>
<tr>
<td colspan="6">
domain
</td>
<td>
(str)
</td>
<td>
Домен BVS, использующийся для получения токена в режиме
<code>authenticator: bvs</code>. Данный параметр является
обязательным для указанного режима. Если параметр не задан в playbook,
модуль будет использовать значение переменной окружения
<code>DECORT_DOMAIN</code>.
</td>
</tr>
<tr>
<td colspan="6">
jwt
</td>
<td>
(str)
</td>
<td>
JSON Web Token (JWT), который будет использоваться для подключения
к контроллеру облачной платформы DECORT в режиме
<code>authenticator: jwt</code>. Данный параметр является
обязательным для указанного режима. Так как он содержит
потенциально секретную информацию, а сам JWT, как правило,
имеет ограниченное время жизни, то его не рекомендуется задавать
непосредственно в playbook. Если этот параметр не определен в
playbook, то модуль будет использовать значение переменной
окружения <code>DECORT_JWT</code>.
</td>
</tr>
<tr>
<td colspan="6">
oauth2_url
</td>
<td>
(str)
</td>
<td>
URL авторизационного сервера, работающего по протоколу Oauth2,
который должен использоваться в режимах
<code>authenticator: bvs</code>
или <code>authenticator: decs3o</code>. Данный параметр является
обязательным для указанных режимов. Если параметр не задан в
playbook, модуль будет использовать значение переменной
окружения <code>DECORT_OAUTH2_URL</code>.
</td>
</tr>
<tr>
<td colspan="6">
password
</td>
<td>
(str)
</td>
<td>
Пароль пользователя, который должен использоваться в режиме
<code>authenticator: bvs</code>. Данный параметр является
обязательным для указанного режима. Так как он содержит секретную
информацию, то его не рекомендуется задавать непосредственно
в playbook. Если параметр не задан в playbook, модуль будет
использовать значение переменной окружения
<code>DECORT_PASSWORD</code>.
</td>
</tr>
<tr>
<td colspan="6">
username
</td>
<td>
(str)
</td>
<td>
Логин пользователя, который должен использоваться в режиме
<code>authenticator: bvs</code>. Данный параметр является
обязательным для указанного режима. Если параметр не задан в playbook,
модуль будет использовать значение переменной окружения
<code>DECORT_USERNAME</code>.
</td>
</tr>
<tr>
<td colspan="6">
verify_ssl
</td>
<td>
(bool)
<br>Default: <code>true</code>
</td>
<td>
Позволяет отключить проверку SSL сертификатов при выполнении API
вызовов в адрес контроллера облачной инфраструктуры, например,
при работе с изолированной облачной инфраструктурой, использующей
самоподписанные сертификаты. Применяйте данный параметр с
осторожностью, предпочтительно в защищенных средах.
</td>
</tr>
</table>
### Пример авторизации с помощью DECS3O
```
- name: Example
hosts: localhost
tasks:
- name: DECS3O auth
decort_module_name:
# Специфичные для модулей параметры упущены
# Пример демонстрирует только параметры для авторизации
app_id: "{{ app_id }}"
app_secret: "{{ app_secret }}"
authenticator: decs3o
controller_url: https://dynamix.local
oauth2_url: https://sso-dynamix.local
```
### Пример авторизации с помощью BVS
```
- name: Example
hosts: localhost
tasks:
- name: BVS auth
decort_module_name:
# Специфичные для модулей параметры упущены
# Пример демонстрирует только параметры для авторизации
app_id: "{{ app_id }}"
app_secret: "{{ app_secret }}"
authenticator: bvs
controller_url: https://dynamix.local
oauth2_url: https://bvs.local
domain: dynamix
username: "{{ username }}"
password: "{{ password }}"
```
### Пример авторизации с помощью JSON Web Token
```
- name: Example
hosts: localhost
tasks:
- name: Auth with JWT
decort_module_name:
# Специфичные для модулей параметры упущены
# Пример демонстрирует только параметры для авторизации
authenticator: jwt
controller_url: "{{ controller_url }}"
jwt: "{{ jwt }}"
```

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,82 @@
# Модуль 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** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| 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` игнорируется. |
|state | Значения: `absent`, `disabled`, `enabled`, `present`, `check`. <br> Default: `present`| Целевое состояние базовой службы. Значения `present` и `enabled` равнозначны.|
| started | (bool) <br> Default: `true` | Параметр, определяющий состояние добавленных виртуальных серверов в Basic Service. Запускать их, или нет. |
| name | (string) | Имя базовой службы. Данный параметр является обязательным при создании базовой службы и при изменении если не задан `id`. |
| sshuser | (string) | Имя пользователя, который будет создан на всех виртуальных серверах базовой службы. Используется в паре с `sshkey`. |
| sshkey | (string) | SSH ключ, который будет загружен на все виртуальные сервера базовой службы. Используется в паре с `sshuser`. |
| id | (int) | Уникальный целочисленный идентификатор базовой службы. Используется для поиска, изменения и удаления базовой службы. |
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы базовой службы. |
| rg_name | (string) | Имя ресурсной группы базовой службы. |
## Возвращаемые значения модуля 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
```

@ -0,0 +1,161 @@
# Модуль decort_disk
## Обзор модуля decort_disk
Модуль decort_disk предназначен для управления дисками и позволяет производить с ними следующие действия:
- создавать
- удалять (в корзину или безвозвратно)
- восстановливать из корзины
- изменять:
- имя
- размер
- лимиты ввода/вывода
- включать/отключать общий доступ
## Параметры модуля decort_disk
Ниже приведен список параметров для модуля **decort_disk** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр `name`) должно быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|account_name | (string) | Имя аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр name) должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| description | (string)<br>Default: `Disk by decort_disk` | Текстовое описание диска. Данный параметр является опциональным и учитывается только при создании диска, а при всех прочих операциях игнорируется.|
|id | (int) | Уникальный целочисленный идентификатор диска. Соответствующий диск должен существовать (таким образом, с помощью id нельзя создать новый диск, а только управлять уже имеющимися). Если задан данный параметр, то параметры `name`, `account_name` и `account_id` игнорируются.|
| iops | (int)<br>Default: `2000` | Ограничение ввода/вывода диска. Используется при создании диска. |
| force_detach | (bool)<br/>Default: `false` | Задаёт поведение платформы при попытке удалить диск, подключённый к виртуальной машине.<br/>По умолчанию, удаление подключённых дисков не разрешается, и попытка удалить такой диск приведёт к аварийному завершению модуля. Чтобы изменить это поведение, явно установите `force_detach: true`. |
| limitIO | (dict) | Параметр, позволяющий ограничить скорость ввода/вывода диска как в iops, так и в байтах в секунду. Обратите внимание, что параметры с total не задаются вместе с read/write. Все возможные подпараметры можно увидеть в примерах. |
| name | (string) | Имя диска. Для идентификации диска требуется либо его `name` и информация об аккаунте (`account_id` или `account_name`), которому принадлежит диск, либо его `id`.|
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении диска, при значении `true` - диск удалится навсегда, а при `false` - попадёт в корзину. |
| place_with | (int) | Идентификатор образа диска, из которого следует взять параметр `sep_id`, чтобы разместить данный диск на той же системе хранения данных, что и указанный образ диска. Данный параметр является опциональным и используется только на стадии создания диска. Если задан `place_with`, то `sep_id` игнорируется.|
| pool | (string) | Название пула на системе хранения данных, в рамках которой следует создать данный диск. Этот параметр используется только на стадии создания диска и игнорируется при операциях над уже существующими дисками. Параметр является опциональным, если не задан, то платформа будет использовать пул, который сконфигурирован на целевой системе хранения как пул по умолчанию. |
| reason | (string)<br>Default: `Managed by Ansible decort_disk` | Причина, по которой было выполнено какое-либо действие. В данном модуле используется только при удалении диска. |
| sep_id | (int) | Идентификатор системы хранения данных (Storage End-point). Данный параметр определяет систему хранения данных, на ресурсах которой создаётся диск. Используется только при создании диска и игнорируется при прочих операциях. Альтернативой данному параметру является `place_with`, позволяющий разместить диск на той же системе хранения, что и указанный образ диска, на базе которого создаётся виртуальная машина.|
| shareable | (bool)<br>Default: `false` | Включение/отключение общего доступа к диску.
| size | (int) | Размер диска в ГБ. Этот параметр является обязательным при создании диска. Если он задан для уже существующего диска, а текущий размер диска меньше заданного, то будет предпринята попытка увеличить размер диска. При прочих операциях данный параметр игнорируется.|
| state | (str)<br>Значения:<br>`present`<br>`absent`<br>Default: `present` | Целевое состояние диска. |
## Возвращаемые значения модуля 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 | Размер диска в ГБ.|
| size_available | float | Размер незанятого пространства в ГБ.|
| size_used | float | Размер используемого пространства в ГБ.|
| 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
description: "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 }}"
<< для краткости фрагмент опущен >>
```

@ -0,0 +1,100 @@
# Модуль decort_group
## Обзор модуля decort_group
Модуль **decort_group** позволяет производить следующие действия над группами базовой службы:
- создать
- получить информацию
- запустить/остановить
- подключить/отключить сети (для существующей группы только внутренние сети)
- изменить
- имя
- объём загрузочного диска
- количество ВМ
- роль
- количество виртуальных процессоров
- объём ОЗУ
- чипсет
- удалить (безвозвратно)
## Параметры модуля decort_group
Ниже приведен список параметров для модуля **decort_group** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_id | (int) | Идентификатор аккаунта. При идентификации диска по имени (см. параметр `name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| account_name | (string) | Имя аккаунта. При идентификации диска по имени (см. параметр `name`) должно быть задано либо имя, либо идентификатор аккаунта (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| boot_disk | (int) | Обьём загрузочного диска. |
| bservice_id | (int) | Идентификатор базовой службы. Обязательный параметр. |
| chipset | (string)<br>Значения:<br>`Q35`<br>`i440fx` | Эмулируемый чипсет.<br>Значение по умолчанию при создании: `i440fx`. |
| count | (int) | Количество виртуальных машин. |
| cpu | (int) | Количество виртуальных процессоров. |
| driver | (string)<br>Значения:<br>`KVM_X86`<br>`SVA_KVM_X86`<br>Default: `KVM_X86` | Драйвер. |
| id | (int) | Идентификатор группы. |
| image_id | (int) | Идентификатор образа. |
| name | (str) | Имя группы.<br>Используется для идентификации группы, если не задан параметр `id`, а также для переименования группы, если параметр `id` задан. |
| networks | (list) | Список словарей, описывающих сети, которые должны быть подключены.<br>Ключи словаря:<br>&bull; `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя) или `EXTNET` (внешняя)<br>&bull; `id` (int) (обязательный) - идентификатор сети |
| ram | (int) | Объём оперативной памяти. |
| role | (string) | Тег роли. |
| state | (str)<br>Значения:<br>`present`<br>`absent`<br>`started`<br>`stopped`<br>`check`<br>Default: `present` |
| timeoutStart | (int) | Время отсрочки запуска группы после создания в секундах. |
## Возвращаемые значения модуля decort_group
Модуль **decort_group** возвращает информацию о диске в виде словаря facts со следующими ключами:
|Ключ | Тип данных | Описание|
| ------ | ------ | ------ |
| account_id | int | Идентификатор аккаунта. |
| Computes | list | Список словарей, содержащих информацию о виртуальных машинах группы.<br>Ключи словаря:<br>&bull; `chipset` (str) - эмулируемый чипсет<br>&bull; `id` (int) - идентификатор ВМ<br>&bull; `ipAddresses` (list) - список IP-адресов ВМ<br>&bull; `name` (str) - имя ВМ<br>&bull; `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
chipset: Q35
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
```

@ -0,0 +1,48 @@
# Модуль decort_jwt
## Обзор модуля
Модуль **decort_jwt** предназначен для получения авторизационного токена JWT (JSON Web Token). Данный модуль может быть полезен при массовом создании ресурсов (например, виртуальных машин), так как позволяет оптимизировать количество API вызовов для получения токена.
По сути, данный модуль является провайдером информации и не управляет облачными ресурсами (всегда возвращает `changed: False`).
## Параметры модуля decort_jwt
Список параметров для модуля **decort_jwt** почти полностью совпадает с [общими параметрами модулей для авторизации](./введение.md#общие-параметры-модулей-для-авторизации).
Отличия от общих параметров:
- Параметр `controller_url` не используется.
- Параметр `jwt` не используется.
- В параметре `authenticator` не используется значение `jwt`.
## Возвращаемые значения модуля decort_jwt
| Ключ | Тип данных | Описание |
|---| ------ | ------ |
| jwt | str | JWT токен. |
## Примеры использования
### Пример получения JWT токена с помощью DECS3O
```
- name: Example
hosts: localhost
tasks:
- name: Obtain JWT from DECS3O
decort_jwt:
app_id: "{{ app_id }}"
app_secret: "{{ app_secret }}"
authenticator: decs3o
oauth2_url: https://sso-dynamix.local
```
### Пример получения JWT токена с помощью BVS
```
- name: Example
hosts: localhost
tasks:
- name: Obtain JWT from BVS
decort_jwt:
app_id: "{{ app_id }}"
app_secret: "{{ app_secret }}"
authenticator: bvs
oauth2_url: https://bvs.local
domain: dynamix
username: "{{ username }}"
password: "{{ password }}"
```

@ -0,0 +1,115 @@
# Модуль decort_k8s
## Обзор модуля decort_k8s
Модуль **decort_k8s** предназначен для выполнения следующих действий над кластерами Kubernetes:
- создать
- получить информацию
- отключить/включить/запустить
- изменить группы Worker-узлов
- удалить (в корзину или безвозвратно)
- восстановить из корзины
## Параметры модуля decort_k8s
Ниже приведен список параметров для модуля **decort_k8s** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_id | (int) | Идентификатор аккаунта. |
| account_name | (string) | Имя аккаунта. |
| additionalSANs | (list) | Список дополнительных SAN (Subject Alternative Names) для использования в процессе автоматического выписывания сертификата Кластера Kubernetes. Можно использовать IP-адреса и доменные имена.
| cluster_conf | (dict) | Словарь с глобальными настройками и конфигурацией для всего кластера. Включает в себя такие настройки, как имя кластера, настройки DNS, методы аутентификации и другие конфигурации всего кластера. |
| description | (string) | Целевое описание. |
| extnet_id | (int)<br>Default: `0` | Идентификатор внешней сети. Если задан `0`, то внешняя сеть выбирается автоматически. Если задан параметр `vins_id`, то значение данного параметра будет проигнорировано. Если задан `extnet_only: false`, то внешняя сеть будет подключена к создаваемой внутренней сети, а если `extnet_only: true`, то либо напрямую к каждому узлу кластера (если `with_lb: false`), либо напрямую к балансировщику нагрузки (если `with_lb: true`). |
| extnet_only | (bool)<br>Default: `false` | Не использовать внутреннюю сеть, подключать напрямую к внешней. |
| getConfig | (bool)<br>Default: `false` | Получить данные конфигурации для доступа к кластеру Kubernetes. |
| ha_lb | (bool)<br>Default: `false` | Использовать схему высокой доступности для создаваемого балансировщика нагрузки (если `with_lb: true`). |
| id | (int) | Идентификатор кластера Kubernetes. |
| init_conf | (dict) | Словарь для определения настроек и действий, которые должны быть выполнены перед запуском любого другого компонента в кластере. Позволяет настраивать такие процессы, как регистрация узла, настройка сети и другие задачи инициализации.
| join_conf | (dict) | Словарь для настройки поведения и параметров присоединения узла к кластеру. Включает в себя такие параметры, как control-plane-endpoint кластера, токен и certificate-key. |
| k8ci_id | (int) | Идентификатор конфигурации кластера Kubernetes. |
| kubeproxy_conf | (dict) | Словарь для настройки поведения и настроек Kube-proxy, отвечающего за сетевое проксирование и балансировку нагрузки внутри кластера. Включает в себя такие параметры, как режим прокси, диапазоны IP-адресов кластера и другие конфигурации, специфичные для Kube-proxy. |
| kublet_conf | (dict) | Словарь для настройки поведения и настроек Kubelet, который является агентом основного узла, работающим на каждом узле кластера. Включает в себя такие параметры, как IP-адрес узла, распределение ресурсов, политики вытеснения модулей и другие конфигурации, специфичные для Kubelet. |
| master_chipset | (string)<br>Значения:<br>`Q35`<br>`i440fx` | Эмулируемый чипсет master-узлов. Не поддерживается изменение в существующем кластере. <br>Значение по умолчанию при создании: `i440fx`. |
| master_count | (int)<br>Значения:<br>`1`<br>`3`<br>`5`<br>`7`<br>Default: `1` | Количество Master-узлов. |
| master_cpu | (int)<br>Default: `2` | Количество виртуальных процессоров на Master-узле. |
| master_disk | (int)<br>Default: `10` | Объём загрузочного диска на Master-узле. |
| master_pool | (str) | Пул СХД, заданной параметром `master_sepid`. |
| master_ram | (int)<br>Default: `2048` | Объём оперативной памяти на Master-узле. |
| master_sepid | (int) | Идентификатор СХД для Master-узла. Если не задан, то используется СХД образа Master-узла. |
| name | (string) | Имя кластера Kubernetes. |
| network_plugin | (str)<br>Значения:<br>`flannel`<br>`calico`<br>`weavenet`<br>Default: `flannel` | CNI plugin (модуль для управления сетевыми интерфейсами контейнера). Возможные значения могут быть ограничены в используемой конфигурации кластера Kubernetes (параметр `k8ci_id`) |
| oidc_cert | (raw) | Сертификат X.509 для OIDC-провайдера.
| permanent | (bool)<br>Default: `false` | Если выполняется удаление, то выполнить безвозвратное удаление (минуя корзину). |
| rg_id | (int) | Идентификатор ресурсной группы. |
| rg_name | (str) | Имя ресурсной группы. |
| started | (bool)<br>Default: `true` | Запустить кластер.<br>Используется только для существующего кластера. |
| state | (string)<br>Значения:<br>`present`<br>`absent`<br>`enabled`<br>`disabled`<br>`check`<br>Default: `present` | Целевое состояние кластера. |
| lb_sysctl | (dict) | Словарь, описывающий параметры конфигурации sysctl балансировщика нагрузки. Может быть задан только если кластер имеет балансировщик нагрузки. |
| vins_id | (int) | Идентификатор внутренней сети. Если не задан, то будет создана новая внутренняя сеть. Если задан, то заданная внутренняя сеть должна иметь подключение к внешней сети. Если задано `extnet_only: true`, то параметр игнорируется.
| with_lb | (bool)<br>Default: `true` | Создание кластера Kubernetes с размещением Master-узлов за балансировщиком нагрузки. |
| workers | (list) | Список словарей, описывающих группы Worker-узлов.<br>Ключи словаря:<br>&bull; `annotations` (list) (необязательный) - список строк с annotations в формате: `key1=value1`; значение по умолчанию при создании: `[]`<br>&bull; `chipset` (str) (необязательный) - эмулируемый чипсет. Допустимые значения: `Q35`, `i440fx`; значение по умолчанию при создании: `i440fx`<br>&bull; `ci_user_data` (dict) (необязательный) - конфигурация для cloud-init; значение по умолчанию при создании: `{}`<br>&bull; `cpu` (int) (необязательный) - количество виртуальных процессоров на узле; значение по умолчанию при создании: `1`<br>&bull; `disk` (int) (необязательный) - объём загрузочного диска на узле; если не задан при создании, размер диска будет равен размеру используемого образа<br>&bull; `labels` (list) (необязательный) - список строк с labels в формате: `label1=value1`; значение по умолчанию при создании: `[]`. Метка `workersGroupName` является служебной в платформе и игнорируется при сравнении переданных меток с существующими<br>&bull; `name` (string) (обязательный) - имя группы Worker-узлов<br>&bull; `num` (int) (необязательный) - количество узлов; значение по умолчанию при создании: `1`<br>&bull; `pool` (str) (необязательный) - пул СХД, заданной ключом `sep_id`; если не задан при создании, то пул будет выбран платформой<br>&bull; `ram` (int) (необязательный) - объём оперативной памяти на узле; значение по умолчанию при создании: `1024`<br>&bull; `sep_id` (int) (необязательный) - идентификатор СХД; если не задан при создании, то используется СХД образа узла<br>&bull; `taints` (list) (необязательный) - список строк с taints в формате: `key1=value1:NoSchedule`; значение по умолчанию при создании: `[]`. |
## Возвращаемые значения модуля decort_k8s
Модуль **decort_k8s** возвращает информацию о кластере в виде словаря `facts` со следующими ключами:
| Ключ | Тип данных | Описание |
| ------ | ------ | ------ |
| account_id | int | Идентификатор аккаунта. |
| config | str | Kuber config кластера.
| description | str | Описание. |
| id | int | Идентификатор кластера. |
| k8s_Masters | dict | Словарь с информацией о группе Master-узлов.<br>Ключи словаря:<br>&bull; `cpu` (int) - количество виртуальных процессоров<br>&bull; `detailedInfo` (list) - список словарей с информацией об узлах; ключи словаря: `id` (int) - идентификатор ВМ, `name` (str) - имя ВМ, `status` (str) - статус ВМ, `techStatus` (str) - технический статус ВМ<br>&bull; `disk` (int) - объём загрузочного диска<br>&bull; `id` (int) - идентификатор группы<br>&bull; `name` (str) - имя группы<br>&bull; `num` (int) - количество узлов<br>&bull; `ram` (int) - объём оперативной памяти
| k8s_Workers | dict | Список словарей с информацией о группах Worker-узлов.<br>Ключи словаря:<br>&bull; `cpu` (int) - количество виртуальных процессоров<br>&bull; `detailedInfo` (list) - список словарей с информацией об узлах; ключи словаря: `id` (int) - идентификатор ВМ, `name` (str) - имя ВМ, `status` (str) - статус ВМ, `techStatus` (str) - технический статус ВМ<br>&bull; `disk` (int) - объём загрузочного диска<br>&bull; `id` (int) - идентификатор группы<br>&bull; `labels` (list) - список строк с labels<br>&bull; `name` (str) - имя группы<br>&bull; `num` (int) - количество узлов<br>&bull; `ram` (int) - объём оперативной памяти<br>&bull; `taints` (list) - список строк с taints
| lb_id | int | Идентификатор балансировщика нагрузки. |
| 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
ram: 1024
chipset: i440fx
ci_user_data: {}
taints:
- key=value:NoSchedule
annotations:
- key=value
labels:
- label=value
- cpu: 10
disk: 10
name: wg2
num: 2
ram: 1024
chipset: Q35
ci_user_data: {}
taints:
- key=value:NoSchedule
annotations:
- key=value
labels:
- label=value
register: k8s_cluster
```

File diff suppressed because it is too large Load Diff

@ -0,0 +1,806 @@
# Модуль decort_lb
## Обзор модуля decort_lb
Модуль **decort_lb** предназначен для выполнения следующих действий над балансировщиками нагрузки:
- создать
- получить информацию
- отключить/включить/запустить/перезапустить
- изменить
- конфигурации backend и frontend
- конфигурацию sysctl
- удалить (в корзину или безвозвратно)
- восстановить из корзины
## Параметры модуля decort_lb
Ниже приведен список параметров для модуля **decort_lb** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
<table>
<tr>
<th colspan="3">Параметр</th>
<th>Тип</th>
<th>Описание</th>
</tr>
<tr>
<td colspan="3">
account_id
</td>
<td>
(int)
</td>
<td>
Идентификатор аккаунта.
</td>
</tr>
<tr>
<td colspan="3">
account_name
</td>
<td>
(str)
</td>
<td>
Имя аккаунта.
<br> Может быть альтернативой параметру <code>account_id</code>.
</td>
</tr>
<tr>
<td colspan="3">
description
</td>
<td>
(str)
<br>Default: <code>Managed by Ansible module decort_lb</code>
</td>
<td>
Описание балансировщика.
</td>
</tr>
<tr>
<td colspan="3">
backends
</td>
<td>
(list)
</td>
<td>
Список словарей, описывающих конфигурации backend.
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
algorithm
</td>
<td>
(str)
<br>Значения:
<br><code>leastconn</code>
<br><code>roundrobin</code>
<br><code>static-rr</code>
<br>Default: <code>roundrobin</code>
</td>
<td>
Используемый алгоритм.
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
<a name="backend_default_settings">
default_settings
</a>
</td>
<td>
(dict)
</td>
<td>
оварь, описывающий параметры по умолчанию для backend-серверов.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
downinter
</td>
<td>
(int)
<br>Default: <code>1000</code>
</td>
<td>
Интервал в миллисекундах между двумя последовательными проверками
доступности сервера, который считается недоступным.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
fall
</td>
<td>
(int)
<br>Default: <code>2</code>
</td>
<td>
Количество последовательных неудачных проверок доступности, после
которых сервер, ранее считавшийся доступным, начинает считаться
недоступным и временно исключается из схемы балансировки.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
inter
</td>
<td>
(int)
<br>Default: <code>5000</code>
</td>
<td>
Интервал в миллисекундах между двумя последовательными проверками
доступности сервера, который считается доступным.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
maxconn
</td>
<td>
(int)
<br>Default: <code>250</code>
</td>
<td>
Лимит одновременных подключений к серверу. При достижении этого лимита
сервер временно исключается из схемы балансировки.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
maxqueue
</td>
<td>
(int)
<br>Default: <code>256</code>
</td>
<td>
Лимит соединений, ожидающих в очереди. Когда этот предел будет
достигнут, все последующие подключения будут перенаправлены
на другие серверы.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
rise
</td>
<td>
(int)
<br>Default: <code>2</code>
</td>
<td>
Количество проверок, которые должен пройти сервер, считавшийся
недоступным, чтобы начать считаться доступным и снова быть
включенным в схему балансировки.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
slowstart
</td>
<td>
(int)
<br>Default: <code>60000</code>
</td>
<td>
Интервал в миллисекундах с момента когда сервер начинает считаться
доступным, по истечении которого количество фактически разрешенных
подключений к этому серверу будет возвращено до 100% от
установленного лимита.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
weight
</td>
<td>
(int)
<br>Default: <code>100</code>
</td>
<td>
Вес сервера для использования в алгоритмах балансировки.
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
name
</td>
<td>
(str)
</td>
<td>
Название backend. Обязательный параметр.
</td>
</tr>
<tr>
<td colspan="3">
ext_net_id
</td>
<td>
(int)
</td>
<td>
Идентификатор внешней сети.
<br>Может быть не задан, если задан <code>vins_id</code> -
в таком случае балансировщик будет подключён только к
внутренней сети.
</td>
</tr>
<tr>
<td colspan="3">
<a name="frontends">
frontends
</a>
</td>
<td>
(list)
</td>
<td>
Список словарей, описывающих конфигурации frontend.
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
backend
</td>
<td>
(str)
</td>
<td>
Название используемого backend. Обязательный параметр.
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
bindings
</td>
<td>
(list)
</td>
<td>
Список словарей, описывающих конфигурации binding.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
address
</td>
<td>
(str)
</td>
<td>
IP-адрес.
<br>Если не задан, то будет использоваться основной IP-адрес
балансировщика во внешней сети или, если подключена только
внутренняя сеть, основной IP-адрес балансировщика во внутренней сети.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
name
</td>
<td>
(str)
</td>
<td>
Название. Обязательный параметр.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
port
</td>
<td>
(int)
<br>Значения:
<br><code>1</code>-<code>65535</code>
</td>
<td>
Порт. Обязательный параметр.
</td>
</tr>
<tr>
<td colspan="3">
ha_lb
</td>
<td>
bool
<br>Default: <code>false</code>
</td>
<td>
Использовать схему высокой доступности для создаваемого балансировщика.
</td>
</tr>
<tr>
<td colspan="3">
lb_id
</td>
<td>
(int)
</td>
<td>
Идентификатор балансировщика нагрузки.
</td>
</tr>
<tr>
<td colspan="3">
lb_name
</td>
<td>
(str)
</td>
<td>
Имя балансировщика.
</td>
</tr>
<tr>
<td colspan="3">
permanently
</td>
<td>
(bool)
<br>Default: <code>false</code>
</td>
<td>
Если выполняется удаление, то выполнить безвозвратное удаление
(минуя корзину).
</td>
</tr>
<tr>
<td colspan="3">
rg_id
</td>
<td>
(int)
</td>
<td>
Идентификатор ресурсной группы.
</td>
</tr>
<tr>
<td colspan="3">
rg_name
</td>
<td>
(str)
</td>
<td>
Имя ресурсной группы.
<br> В комбинации с заданным аккаунтов может быть альтернативой
параметру <code>rg_id</code>
</td>
</tr>
<tr>
<td colspan="3">
servers
</td>
<td>
(list)
</td>
<td>
Список словарей, описывающих конфигурации backend-серверов.
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
address
</td>
<td>
(str)
</td>
<td>
IP-адрес. Обязательный параметр.
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
backends
</td>
<td>
(list)
</td>
<td>
Список словарей, описывающих параметры backend-сервера для разных
конфигураций backend.
<br>Обязательный параметр.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
check
</td>
<td>
(str)
<br>Значения:
<br><code>enabled</code>
<br><code>disabled</code>
<br>Default: <code>enabled</code>
</td>
<td>
Проверка доступности сервера.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
name
</td>
<td>
(str)
</td>
<td>
Название конфигурации backend. Обязательный параметр.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
port
</td>
<td>
(int)
<br>Значения:
<br><code>1</code>-<code>65535</code>
</td>
<td>
Порт. Обязательный параметр.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
server_settings
</td>
<td>
(dict)
</td>
<td>
Словарь, описывающий параметры backend-сервера.
<br> Ключи данного словаря аналогичны ключам словаря
<a href=#backend_default_settings>
default_settings
</a>.
</td>
</tr>
<tr>
<td></td>
<td colspan="2">
name
</td>
<td>
(str)
</td>
<td>
Название. Обязательный параметр.
</td>
</tr>
<tr>
<td colspan="3">
state
</td>
<td>
(str)
<br>Значения:
<br><code>present</code>
<br><code>absent</code>
<br><code>enabled</code>
<br><code>disabled</code>
<br><code>restart</code>
<br>Default: <code>present</code>
</td>
<td>
Целевое состояние балансировщика нагрузки.
<br>Выполнение с <code>state=restart</code> позволяет выполнить
перезапуск балансировщика, соответственно, всегда возвращает
<code>changed: true</code>.
<br>Значения <code>present</code> и <code>enabled</code> равнозначны
и соответствуют включённому и запущенному балансировщику.
</td>
</tr>
<tr>
<td colspan="3">
sysctl
</td>
<td>
(dict)
</td>
<td>
Словарь, описывающий параметры конфигурации sysctl.
</td>
</tr>
<tr>
<td colspan="3">
vins_id
</td>
<td>
(int)
</td>
<td>
Идентификатор внутренней сети.
<br>Может быть не задан, если задан <code>ext_net_id</code> -
в таком случае балансировщик будет подключён только к
внешней сети.
</td>
</tr>
<tr>
<td colspan="3">
vins_name
</td>
<td>
(str)
</td>
<td>
Имя внутренней сети.
<br> В комбинации с заданной РГ может быть альтернативой для
параметра <code>vins_id</code>.
</td>
</tr>
</table>
## Возвращаемые значения модуля decort_lb
Модуль **decort_lb** возвращает информацию о балансировщике в виде словаря `facts` со следующими ключами:
<table>
<tr>
<th colspan="4">
Ключ
</th>
<th>
Тип
<br>данных
</th>
<th>
Описание
</th>
</tr>
<tr>
<td colspan="4">
backends
</td>
<td>
list
</td>
<td>
Список словарей, описывающих конфигурации backend.
</td>
</tr>
<tr>
<td></td>
<td colspan="3">
algorithm
</td>
<td>
str
</td>
<td>
Используемый алгоритм.
</td>
</tr>
<tr>
<td></td>
<td colspan="3">
name
</td>
<td>
str
</td>
<td>
Название конфигурации backend.
</td>
</tr>
<tr>
<td></td>
<td colspan="3">
serverDefaultSettings
</td>
<td>
dict
</td>
<td>
оварь, описывающий параметры по умолчанию для backend-серверов.
<br> Ключи данного словаря аналогичны ключам словаря
<a href=#backend_default_settings>
default_settings
</a>.
</td>
</tr>
<tr>
<td></td>
<td colspan="3">
servers
</td>
<td>
list
</td>
<td>
Список словарей, описывающих конфигурации backend-серверов.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td colspan="2">
address
</td>
<td>
str
</td>
<td>
IP-адрес.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td colspan="2">
check
</td>
<td>
str
</td>
<td>
Проверка доступности сервера.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td colspan="2">
name
</td>
<td>
str
</td>
<td>
Название.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td colspan="2">
port
</td>
<td>
int
</td>
<td>
Порт.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td colspan="2">
serverSettings
</td>
<td>
dict
</td>
<td>
оварь, описывающий параметры backend-сервера.
<br> Ключи данного словаря аналогичны ключам словаря
<a href=#backend_default_settings>
default_settings
</a>.
</td>
</tr>
<tr>
<td colspan="4">
frontends
</td>
<td>
list
</td>
<td>
Список словарей, описывающих конфигурации frontend.
<br> Ключи данного словаря аналогичны ключам словарей списка
<a href=#frontends>
frontends
</a>.
</td>
</tr>
<tr>
<td colspan="4">
gid
</td>
<td>
int
</td>
<td>
Идентификатор физического кластера (Grid ID).
</td>
</tr>
<tr>
<td colspan="4">
id
</td>
<td>
int
</td>
<td>
Идентификатор балансировщика.
</td>
</tr>
<tr>
<td colspan="4">
name
</td>
<td>
str
</td>
<td>
Имя балансировщика.
</td>
</tr>
<tr>
<td colspan="4">
rg_id
</td>
<td>
int
</td>
<td>
Идентификатор ресурсной группы.
</td>
</tr>
<tr>
<td colspan="4">
state
</td>
<td>
str
</td>
<td>
Статус балансировщика.
</td>
</tr>
<tr>
<td colspan="4">
sysctl
</td>
<td>
dict
</td>
<td>
Параметры конфигурации sysctl.
</td>
</tr>
</table>

@ -0,0 +1,146 @@
# Модуль decort_osimage
## Обзор модуля decort_osimage
Модуль decort_osimage предназначен для выполнения следующих действий над образами, созданными в облачной платформе DECORT:
- шаблонные образы:
- создать
- получить информацию
- изменить имя
- удалить
- виртуальные образы
- создать
- получить информацию
- изменить
- имя
- целевой образ
- удалить
## Параметры модуля decort_osimage
Ниже приведен список параметров для модуля **decort_osimage** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_Id | (int) | Уникальный целочисленный идентификатор аккаунта. Используется для поиска образов, а тажке для их создания. |
| account_name | (string) | Имя аккаунта. Используется для получения уникального целочисленного идентификатора аккаунта. |
| boot | (dict) | Параметры загрузки.<br>Ключи словаря:<br>&bull; `mode` (str) - режим загрузки, значения: `bios`, `uefi`, значение по умолчанию при создании: `bios`;<br>&bull; `loader_type` (str) - тип загрузчика операционной системы, значения: `linux`, `windows`, `unknown`, значение по умолчанию при создании: `unknown`. |
| drivers | (string)<br>Default: `KVM_X86` | Тип виртуальных машин, подходящих для образа. Используется при создании образа.|
| hot_resize | (bool) | Поддержка изменения объёма ОЗУ и количества процессоров у запущенных ВМ, созданных на основе образа. <br>Значение по умолчанию при создании: `false`. |
| image_id | (int) | Идентификатор шаблонного образа.
| image_name | (str) | Имя шаблонного образа.
| image_password | (string) | Опциональный пароль для образа. Используется при создании образа.|
| image_username | (string) | Опциональное имя пользователя для образа. Используется при создании образа. |
| network_interface_naming | (string) <br>Значения:<br>`ens`<br>`eth`| Шаблон именования сетевых интерфейсов в ОС Linux. <br>Значение по умолчанию при создании: `ens`. |
| passwordDL | (string) | Пароль для скачивания по URL-адресу. Используется при создании образа. |
| pool | (str) | Имя пула СХД. Используется для поиска существующего образа.
| poolName | (string) | Имя пула СХД. Используется при создании образа. |
| sepId | (integer) | Уникальный целочисленный идентификатор СХД. Используется при создании образа. |
| sep_id | (int) | Идентификатор СХД. Используется для поиска существующего образа.
| state | (string)<br>Значения:<br>`present`<br>`absent`<br>Default: `present` | Целевое состояние образа. `present` - существует, `absent` - удалён. |
| url | (string) | URL-адрес, с которого будет загружен образ. Используется при создании образа.|
| usernameDL | (string) | Имя пользователя для загрузки образа с заданного URL-адреса. Используется при создании образа. |
| virt_id | (integer) | Уникальный целочисленный идентификатор виртуального образа. Может использоваться для получения информации о виртуальном образе, а также для привязки к нему другого образа.|
| virt_name | (string) | Имя виртуального образа. Используется для получения `virt_id`, а в последствии информации о виртуальном образе, а также для создания виртуального образа и привязки к нему другого образа.|
## Возвращаемые значения модуля decort_osimage
Модуль decort_osimage возвращает информацию об образе в виде словаря facts со следующими ключами:
| Ключ | Тип данных | Описание |
| ------ | ------ | ------ |
| accountId | int | Идентификатор аккаунта. |
| boot_mode | string | Режим загрузки. |
| boot_loader_type | string | Тип загрузчика операционной системы. |
| hot_resize | bool | Поддержка изменения объёма ОЗУ и количества процессоров у запущенной ВМ. |
| id | int | Уникальный целочисленный идентификатор данного образа. |
| linkto | int | Уникальный целочисленный идентификатор образа, который привязан к данному виртуальному. |
| name | string | Имя образа. |
| network_interface_naming | string | Шаблон именования сетевых интерфейсов в ОС Linux. |
| 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
boot:
mode: uefi
loader_type: linux
network_interface_naming: eth
hot_resize: true
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
```
Пример удаления образа
```
- name: Delete image
decort_osimage:
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
authenticator: oauth2
controller_url: "https://ds1.digitalenergy.online"
image_id: 54321
state: absent
```

@ -0,0 +1,66 @@
# Модуль decort_pfw
## Обзор модуля decort_pfw
Модуль **decort_pfw** предназначен для настройки правил переадресации портов (port forwarding, destination NAT) на виртуальном маршрутизаторе заданной внутренней сети для заданной виртуальной машины.
Модуль поддерживает выполнение следующих действий над правилами:
- добавить
- получить информацию
- удалить
## Параметры модуля decort_pfw
Ниже приведен список параметров для модуля **decort_pfw** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
| Параметр | Тип, допустимые значения | Описание|
| ------ | ------ | ------ |
| compute_id | (int) | Идентификатор виртуальной машины. IP-адрес, который данная ВМ имеет во внутренней сети, заданной параметром `vins_id`, будет использоваться как внутренний IP-адрес в правилах. Обязательный параметр. |
| rules | (list) | Список словарей, описывающих правила переадресации портов для заданной ВМ (параметр `compute_id`) на виртуальном маршрутизаторе заданной внутренней сети (параметр `vins_id`).<br>Ключи словаря:<br>&bull; `local_port` (int) (обязательный) - внутренний порт; значения: от `1` до `65535`<br>&bull; `proto` (str) (обязательный) - протокол; значения: `tcp` или `udp`<br>&bull; `public_port_end` (int) (необязательный) - верхняя граница диапазона внешних портов; значения: от значения ключа `public_port_start` до `65535`;<br>&bull; `public_port_start` (int) (обязательный) - нижняя граница диапазона внешних портов; значения: от `1` до `65535` |
| state | (str)<br>Значения:<br/>`present`<br/>`absent`<br>Default: `present` | Целевое состояние правил.<br>Если `state=absent`, то, независимо от содержания параметра `rules`, будут удалены все правила для заданной ВМ (параметр `compute_id`) на виртуальном маршрутизаторе заданной внутренней сети (параметр `vins_id`). |
| vins_id | (int) | Идентификатор внутренней сети, на виртуальном маршрутизаторе которой настраиваются правила переадресации портов. Заданная ВМ (параметр `compute_id`) должна быть подключена к этой сети. Обязательный параметр. |
## Возвращаемые значения модуля decort_pfw
Модуль **decort_pfw** возвращает информацию о правилах переадресации портов и сопутствующую информацию в виде словаря `facts` со следующими ключами:
|Ключ | Тип данных | Описание|
| ------ | ------ | ------ |
| compute_id | int | Идентификатор ВМ. |
| public_ip | string | IP-адрес во внешней сети, настроенный на виртуальном маршрутизаторе внутренней сети. |
| rules | list | Список словарей, описывающих правила переадресации портов.<br>Ключи словаря:<br>&bull; `id` (int) - идентификатор правила<br>&bull; `localIp` (str) - IP-адрес ВМ<br>&bull; `localPort` (int) - внутренний порт<br>&bull; `protocol` (str) - протокол<br>&bull; `publicPortEnd` (int) - верхняя граница диапазона внешних портов<br>&bull; `publicPortStart` (int) - нижняя граница диапазона внешних портов<br>&bull; `vmId` (int) - идентификатор ВМ<br>&bull; `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 }}"
```

@ -0,0 +1,224 @@
# Модуль decort_rg
## Обзор модуля decort_rg
Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет:
- создавать ресурсные группы
- удалять ресурсные группы (в корзину или безвозвратно, с удалением содержимого или без)
- восстанавливать ресурсные группы из корзины
- включать/отключать ресурсные группы
- запрашивать информацию об уже существующих ресурсных группах
- изменять ресурсные группы:
- переименовывать
- настраивать квоты
- задавать стандартную сеть
- настраивать права доступа для пользователей
- изменять доступные пулы СХД
- изменять описание
## Параметры модуля decort_rg
Ниже приведен список параметров для модуля **decort_rg** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
| Параметр | Тип, допустимые значения | Описание |
|----------|--------------------------|----------|
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то account_name игнорируется. |
| account_name | (string) | Имя аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| access | (dict) | Параметр, позволяющий выдать, забрать или изменить права у пользователя в ресурсной группе. |
| description | (string) | Текстовое описание ресурсной группы. |
| def_netId | (int) | Уникальный целочисленный идентификатор внутренней или внешней сети. Используется для изменения сети по умолчанию в ресурсной группе. |
| def_netType | (string) <br>Значения:<br>`PRIVATE`<br>`PUBLIC`<br>`NONE`<br>Default: `PRIVATE` | Тип сети по умолчанию в ресурсной группе. Используется при создании ресурсной группы, а также при изменении. |
| extNetId | (int) | Уникальный целочисленный идентификатор внешней сети.<br>Если `def_netType: PRIVATE`, то указывает какую внешнюю сеть подключить к создаваемой внутренней сети, которая будет задана как сеть по умолчанию для создаваемой РГ.<br>Если `def_netType: PUBLIC`, то указывает какую внешнюю сеть задать как сеть по умолчанию для создаваемой РГ. |
| extNetIp | (string) | IP-адрес для внешней сети, которая задана в параметре `extNetId`. |
| ipcidr | (string) | IP-адрес внутренней сети. Используется при создании ресурсной группы, чтобы задать IP-адрес сети для создаваемой внутренней сети, которая создастся вместе с ресурсной группой. Используется при параметре `def_netType` в значении `PRIVATE`. |
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. |
| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
| recursive_deletion | (bool)<br>Default: `false` | Рекурсивное удаление.<br>Если `true`, то при удалении РГ будет удалено всё её содержимое.<br>Если `false`, то при удалении непустой РГ работа модуля завершится ошибкой. |
| rename | (string) | Новое имя ресурсной группы.<br>Возможно переименование только включенной ресурсной группы. |
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. Является обязательным при изменении РГ если не заданы `rg_name` и `account_id`/`account_name` |
| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным при создании. |
| sep_pools| (list) | Список словарей, описывающих доступные пулы СХД.<br>Ключи словаря:<br>&bull; `sep_id` (int) - идентификатор системы хранения данных.<br>&bull; `pool_names` (list) - список названий пулов системы хранения данных.<br>Чтобы очистить список доступных пулов, нужно указать пустой список `[]`.|
| state | Значения:<br>`present`<br>`absent`<br>`enabled`<br>`disabled`<br>Default: `present` | Целевое состояние ресурсной группы. |
## Возвращаемые значения модуля decort_rg
Модуль decort_rg возвращает информацию о ресурсной группе в виде словаря facts со следующими ключами:
| Ключ | Тип данных | Описание |
|------|------------|----------|
| account_id | int | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данная ресурсная группа. |
| description | string | Текстовое описание ресурсной группы. |
| 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
```

@ -0,0 +1,248 @@
# Модуль decort_snapshot
## Обзор модуля
Модуль **decort_snapshot** предназначен для выполнения следующих действий над снимками виртуальных машин:
- **создать** (см. [параметр state](#state) и [примеры](#создать))
- **удалить** (см. [параметр state](#state) и [примеры](#удалить))
- **получить основную информацию о снимке** (см. [возвращаемые значения](#основная-информация) и [примеры](#получить-основную-информацию-о-снимке))
- **получить информацию о размере снимка** (см. [параметр usage](#usage), [возвращаемые значения](#размер-снимка) и [примеры](#получить-информацию-о-размере-снимка))
## Параметры модуля
Ниже приведен список параметров для модуля **decort_snapshot** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
<table>
<tr>
<th colspan="6">Параметр</th>
<th>Тип</th>
<th>Описание</th>
</tr>
<tr>
<td colspan="6">
<a name="label">
label
</a>
</td>
<td>
(str)
</td>
<td>
Метка снимка виртуальной машины. Если метка не указана при создании, она будет сгенерирована автоматически на основе даты и времени - <code>vm_name_2024-12-10_16-40-52</code>.
</td>
</tr>
<tr>
<td colspan="6">
<a name="state">
state
</a>
</td>
<td>
(str)
<br>Значения:
<br><code>absent</code>
<br><code>present</code>
</td>
<td>
Целевое состояние.
<br><code>absent</code> - снимок удален.
<br><code>present</code> - снимок существует.
</td>
</tr>
<tr>
<td colspan="6">
<a name="usage">
usage
</a>
</td>
<td>
(bool)
<br>Default:<code>false</code>
</td>
<td>
Получить информацию о реальном размере снимка виртуальной машины.
</td>
</tr>
<tr>
<td colspan="6">
<a name="vm_id">
vm_id
</a>
</td>
<td>
(int)
</td>
<td>
Идентификатор виртуальной машины.
<br>Обязательный параметр.
</td>
</tr>
</table>
## Возвращаемые значения
Модуль **decort_snapshot** возвращает информацию о снимке виртуальной машины в виде словаря `facts` со следующими ключами:
### Основная информация
<table>
<tr>
<th colspan="6">
Ключ
</th>
<th>
Тип
<br>данных
</th>
<th>
Описание
</th>
</tr>
<tr>
<td colspan="6">
disks
</td>
<td>
list
</td>
<td>
Диски
</td>
</tr>
<tr>
<td colspan="6">
guid
</td>
<td>
str
</td>
<td>
Идентификатор снимка
</td>
</tr>
<tr>
<td colspan="6">
label
</td>
<td>
str
</td>
<td>
Метка снимка
</td>
</tr>
<tr>
<td colspan="6">
timestamp
</td>
<td>
int
</td>
<td>
Временная метка создания снимка
</td>
</tr>
<tr>
<td colspan="6">
vm_id
</td>
<td>
int
</td>
<td>
Идентификатор виртуальной машины
</td>
</tr>
</table>
### Размер снимка
<table>
<tr>
<th colspan="6">
Ключ
</th>
<th>
Тип
<br>данных
</th>
<th>
Описание
</th>
</tr>
<tr>
<td colspan="6">
stored
</td>
<td>
float
</td>
<td>
Размер снимка
</td>
</tr>
</table>
## Примеры использования
### Создать
#### С указанием метки
```
- name: Example
hosts: localhost
tasks:
- name: Create snapshot
decort_snapshot:
# Параметры для авторизации упущены
vm_id: "{{ vm_id }}"
label: "{{ snapshot_label }}"
state: present
```
#### Без указания метки
```
- name: Example
hosts: localhost
tasks:
- name: Create snapshot
decort_snapshot:
# Параметры для авторизации упущены
vm_id: "{{ vm_id }}"
state: present
```
### Удалить
```
- name: Example
hosts: localhost
tasks:
- name: Delete snapshot
decort_snapshot:
# Параметры для авторизации упущены
vm_id: "{{ vm_id }}"
label: "{{ snapshot_label }}"
state: absent
```
### Получить основную информацию о снимке
```
- name: Example
hosts: localhost
tasks:
- name: Get basic snapshot info
decort_snapshot:
# Параметры для авторизации упущены
vm_id: "{{ vm_id }}"
label: "{{ snapshot_label }}"
```
### Получить информацию о размере снимка
```
- name: Example
hosts: localhost
tasks:
- name: Get snapshot usage
decort_snapshot:
# Параметры для авторизации упущены
vm_id: "{{ vm_id }}"
label: "{{ snapshot_label }}"
usage: true
```

File diff suppressed because it is too large Load Diff

@ -0,0 +1,110 @@
# Модуль decort_vins
## Обзор модуля decort_vins
Модуль decort_vins предназначен для управления внутренними сетями (Virtual Network Segment, ViNS) и позволяет производить с ними следующие действия:
- создавать
- на уровне ресурсной группы (если РГ задана)
- на уровне аккаунта (если РГ не задана)
- удалять (безвозвратно)
- восстанавливать из корзины
- запрашивать информацию
- включать/отключать
- соединять (необходимы права администратора)
- изменять:
- включать/отключать SSH-доступ к виртуальному маршрутизатору (необходимы права администратора)
- включать/отключать режим **Custom Config** для виртуального маршрутизатора (необходимы права администратора)
- сохранять конфигурацию виртуального маршрутизатора для возможности последующего отката к ней (необходимы права администратора)
## Параметры модуля decort_vins
Ниже приведен список параметров для модуля **decort_vins** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| 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` игнорируется.|
|description | (string)| Текстовое описание внутренней сети. Данный аргумент является опциональным и учитывается только при создании внутренней сети, а при всех прочих операциях игнорируется.|
| ext_net_id | (int) | Идентификатор внешней сети, к которой должна быть подключена внутренняя сеть. Если задать значение `0`, то платформой будет выбрана внешняя сеть по умолчанию. |
| ext_ip_addr | (string) | IP-адрес внешней сети, заданной через параметр `ext_net_id`. Если не задан, то IP-адрес для внешней сети будет выбран платформой автоматически.
| ipcidr | (string) | Адрес сети для создаваемой внутренней сети. Если этот параметр не задан, то платформа назначит адрес автоматически. Обратите внимание, что внутренние сети, принадлежащие одному и тому же аккаунту, не могут иметь пересекающихся сетей.|
|rg_id | (int) | Идентификатор ресурсной группы, в которой должна быть создана или уже существует внутренняя сеть. Если одновременно заданы `rg_id` и `rg_name`, то `rg_name` игнорируется.|
| rg_name | (string) | Имя ресурсной группы, в которой должна быть создана или уже существует внутренняя сеть. Если одновременно заданы `rg_name` и `rg_id`, то `rg_name` игнорируется.|
| state | (string)<br>Значения:<br/>`present`<br/>`absent`<br/>`enabled`<br/>`disabled`<br/>Default: `present` | Целевое состояние внутренней сети. |
| 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)<br>Default: `false` | Включить/отключить режим пользовательской конфигурации виртуального маршрутизатора. |
| config_save | (bool)<br>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
```

@ -1,5 +1,6 @@
## Документация:
- [Модули Ansible версии 8.0.0](./8.0.0/Home.md)
- [Модули Ansible версии 7.2.0](./7.2.0/Home.md)
- [Модули Ansible версии 7.1.0](./7.1.0/Home.md)
- [Модули Ansible версии 7.0.0](./7.0.0/Home.md)

Loading…
Cancel
Save