main 6.1.0
sskarimov 2 months ago
parent dd2fca15f3
commit 44022162c8

@ -1,114 +1,88 @@
# Список изменений в версии 6.0.0
# Список изменений в версии 6.1.0
## Обновления
## Добавлено
### Модуль decort_user_info
### Модуль decort_kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-515 | Фильтрация аудитов по коду ответа происходит в фильтре `status_code`, принимающем параметры `min` и `max`. |
| BANS-602 | Добавлена возможность изменения параметра `chipset` у существующей виртуальной машины. |
| BANS-620 | Добавлены параметры `cpu_pin`, `hp_backed`, `numa_affinity` для создания и изменения виртуальной машины. |
| BANS-622 | Добавлена возможность изменения параметра `description` у существующей виртуальной машины. |
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
| BANS-625 | Добавлен параметр `custom_fields` для создания и изменения виртуальной машины.|
### Модуль decort_account_info
### Модуль decort_k8s
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-554 | Удалён подпараметр `images.deleted`. |
| BANS-598 | Добавлен параметр `master_chipset` для указания чипсета для master-узлов при создании кластера и параметр `workers.chipset` для указания чипсета для worker-узлов.<br>Для параметров `workers.annotations`, `workers.chipset`, `workers.ci_user_data`, `workers.cpu`, `workers.labels`, `workers.num`, `workers.ram`, `workers.taints` установлены значения по умолчанию при создании.|
### Модуль decort_kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-573 | Удалён параметр `arch`. |
| BANS-581 |Добавлен параметр `chipset` для указания чипсета при создании виртуальной машины. |
| BANS-528 | Добавлен тип сети `VFNIC`. |
| BANS-586 | Добавлен параметр `network_order_changing`, позволяющий включить соблюдение очерёдности сетей при их изменении. |
| BANS-522 | Добавлен тип сети `EMPTY`. |
| BANS-592 | Добавлен тип сети `DPDK`. |
| BANS-11 | Добавлена возможность создать виртуальную машину без образа. |
| BANS-12 | Добавлена возможность переименования виртуальной машины. |
| BANS-596 | Добавлена возможность изменения IP-адреса ВМ во внутренней/внешней сети без переподключения сети. |
### Модуль decort_osimage
### Модуль decort_disk
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-573 | Удалён параметр `architecture`. |
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
### Модуль decort_rg
### Модуль decort_lb
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-507 | Добавлена возможность удаления сети по умолчанию. |
| BANS-509 | Добавлен параметр `sep_pools` для указания доступных пулов СХД. |
| BANS-7 | Добавлен параметр `recursive_deletion` для удаления непустой РГ. |
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
### Модуль decort_account
### Модуль decort_vins
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-508 | Добавлен параметр `sep_pools` для указания доступных пулов СХД. |
## Исправления
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
### Глобальные
### Модуль decort_rg
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-511 | При ошибке HTTP-подключения в некоторых случаях работа модуля завершалась ошибкой Python. |
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
### Модуль decort_bservice
| Идентификатор<br>задачи | Описание |
|-------------------------| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BANS-549 | Модуль требовал параметр `name` вместе с параметром `id`.<br/> Исправлено завершение работы модуля с ошибкой Python при отсутствии параметра `rg_id` при заданном параметре `id`. |
## Удалено
### Модуль decort_kvmvm
### Модуль decort_group
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-550 | Отсутствие параметров `cpu` и/или `ram` при заданном параметре `id` вызывало завершение работы модуля **decort_kvmvm** с ошибкой Python. |
| BANS-588 | Исправлена ошибка, при которой модуль производил изменения при незаданных параметрах `data_disks`, `networks`, `tag`, `affinity_label`, `aff_rule`, `aaff_rule`. |
| BANS-656 | Удалён неиспользуемый ключ `config` в возвращаемом словаре. |
| BANS-201 | Удалены неиспользуемые параметры `annotation` и `description`.|
### Модуль decort_disk
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-534 | Исправлена ошибка получения данных о привязке диска к виртуальной машине. |
| BANS-557 | Модуль требовал параметр `account_id` или `account_name` при заданном параметре `id`. |
| BANS-558 | Модуль пытался произвести `rename` и `resize` при отсутствующих параметрах `name` и `size` |
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
### Модуль decort_group
### Модуль decort_kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-560 | Модуль требовал параметр `name` при заданном параметре `id`. |
| BANS-561 | Модуль всегда требовал параметр `count`. |
| BANS-562 | Модуль производил обновление сетей при незаданном параметре `networks`. |
| BANS-563 | Модуль производил вызов API `cloudapi/bservice/groupUpdate` при незаданных параметрах. |
| BANS-564 | Модуль завершал свою работу с ошибкой Python если не заданы все необходимые параметры при создании группы. |
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
### Модуль decort_osimage
### Модуль decort_lb
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-566 | Модуль не удалял шаблонный образ без указания идентификатора аккаунта. |
| BANS-567 | Модуль завершал свою работу с ошибкой запроса к API при попытке удалить несуществующий или уже удалённый образ. |
| BANS-568 | Модуль завершал свою работу ошибкой запроса к API при заданном параметре `virt_id` и незаданном параметре `image_id`. |
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
### Модуль decort_lb
### Модуль decort_rg
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-569 | Модуль требовал параметр `lb_name` при заданном параметре `lb_id`. |
| BANS-570 | Модуль завершал работу с ошибкой запроса к API при заданных параметрах `lb_name` и `rg_id` существующего балансировщика. |
| BANS-571 | Модуль удалял конфигурации backend и frontend у существующего балансировщика при незаданных параметрах `backends`, `servers`, `frontends`. |
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
### Модуль decort_k8s
### Модуль decort_vins
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-198 | Модуль завершал свою работу с ошибкой Python при отсутствии необязательных подпараметров `workers.sep_id` и `workers.pool`. |
| BANS-576 | Модуль требовал необязательные параметры при заданном параметре `id`. |
| BANS-578 | Модуль требовал необязательные параметры для изменения группы worker-узлов. |
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
### Модуль decort_rg
### Модуль decort_bservice
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-546 | Модуль требовал параметр `account_id` или `account_name` при заданном параметре `rg_id`. |
| BANS-201 | Удалены неиспользуемые параметры `annotation` и `description`.|
### Модуль decort_account_info
### Модуль decort_k8s
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-547 | Модуль ожидал тип `int` для параметра `ext_ip` вместо типа `str`. |
| BANS-201 | Удален неиспользуемый параметр `annotation`.|
## Исправлено
### Модуль decort_pfw
### Модуль decort_kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BANS-577 | Модуль удаляет правила переадресации портов при незаданном параметре `rules`. |
| BANS-9 | Исправлена ошибка, из-за которой модуль не устанавливал параметр `description` при создании виртуальной машины. |
| BANS-13 | Исправлена ошибка, из-за которой модуль не возвращал ошибку при попытке уменьшить размер загрузочного диска. |

@ -5,7 +5,7 @@
| Версия платформы | Версия модулей Ansible |
|:----------------:|:--------------------------:|
| 4.1.0 | 6.0.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 |
| 3.8.8, 3.8.9 | 5.2.6 |
| 3.8.7 | 5.2.5 |

@ -1,23 +1,12 @@
#!/usr/bin/python
# Copyright: ...
# ...
DOCUMENTATION = r'''
---
module: decort_account
version_added: "2.16"
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
# EXAMPLES = r'''
# '''
# RETURN = r'''
# '''
from typing import Iterable
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.decort_utils import DecortController

@ -1,23 +1,12 @@
#!/usr/bin/python
# Copyright: ...
# ...
DOCUMENTATION = r'''
---
module: decort_account_info
version_added: "2.16"
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
# EXAMPLES = r'''
# '''
# RETURN = r'''
# '''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.decort_utils import DecortController

@ -1,22 +1,17 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2021 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
#
# Author: Alexey Dankov (alexey Dankov@digitalenergy.online)
DOCUMENTATION = r'''
---
module: decort_bservice
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
class decort_bservice(DecortController):
def __init__(self,arg_amodule):
super(decort_bservice, self).__init__(arg_amodule)
@ -157,7 +152,6 @@ class decort_bservice(DecortController):
return dict(
account_id=dict(type='int', required=False),
account_name=dict(type='str', required=False, default=''),
annotation=dict(type='str', required=False, default=''),
app_id=dict(type='str',
required=False,
fallback=(env_fallback, ['DECORT_APP_ID'])),
@ -193,7 +187,6 @@ class decort_bservice(DecortController):
id=dict(type='int', required=False, default=0),
rg_id=dict(type='int', default=0),
rg_name=dict(type='str',default=""),
description=dict(type='str', default="Created by decort ansible module"),
verify_ssl=dict(type='bool', required=False, default=True),
workflow_callback=dict(type='str', required=False),
workflow_context=dict(type='str', required=False),)

@ -1,256 +1,18 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2021 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
#
# Author: Sergey Shubin (sergey.shubin@digitalenergy.online)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
DOCUMENTATION = r'''
---
module: decort_disk
short_description: Manage Disks (virtualized storage resources) in DECORT cloud
description: >
This module can be used to create new disk in DECORT cloud platform, obtain or
modify its characteristics, and delete it.
version_added: "2.2"
author:
- Sergey Shubin <sergey.shubin@digitalenergy.online>
requirements:
- python >= 2.6
- PyJWT Python module
- requests Python module
- netaddr Python module
- decort_utils utility library (module)
- DECORT cloud platform version 3.6.1 or higher
notes:
- Environment variables can be used to pass selected parameters to the module, see details below.
- Specified Oauth2 provider must be trusted by the DECORT cloud controller on which JWT will be used.
- 'Similarly, JWT supplied in I(authenticator=jwt) mode should be received from Oauth2 provider trusted by
the DECORT cloud controller on which this JWT will be used.'
options:
account_id:
description:
- ID of the account, which owns this disk. This is the alternative to I(account_name) option.
- If both I(account_id) and I(account_name) specified, then I(account_name) is ignored.
default: 0
required: no
account_name:
description:
- 'Name of the account, which will own this disk.'
- 'This parameter is ignored if I(account_id) is specified.'
default: empty string
required: no
annotation:
description:
- Optional text description of this disk.
default: empty string
required: no
app_id:
description:
- 'Application ID for authenticating to the DECORT controller when I(authenticator=oauth2).'
- 'Required if I(authenticator=oauth2).'
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_ID
environment variable.'
required: no
app_secret:
description:
- 'Application API secret used for authenticating to the DECORT controller when I(authenticator=oauth2).'
- This parameter is required when I(authenticator=oauth2) and ignored in other modes.
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_SECRET
environment variable.'
required: no
authenticator:
description:
- Authentication mechanism to be used when accessing DECORT controller and authorizing API call.
default: jwt
choices: [ jwt, oauth2, legacy ]
required: yes
controller_url:
description:
- URL of the DECORT controller that will be contacted to manage the RG according to the specification.
- 'This parameter is always required regardless of the specified I(authenticator) type.'
required: yes
id:
description:
- `ID of the disk to manage. If I(id) is specified it is assumed, that this disk already
exists. In other words, you cannot create new disk by specifying its ID, use I(name)
when creating new disk.`
- `If non-zero I(id) is specified, then I(name), I(account_id) and I(account_name)
are ignored.`
default: 0
required: no
name:
description:
- `Name of the disk to manage. To manage disk by name you also need to specify either
I(account_id) or I(account_name).`
- If non-zero I(id) is specified, I(name) is ignored.
- `Note that the platform does not enforce uniqueness of disk names, so if more than one
disk with this name exists under the specified account, module will return the first
occurence.`
default: empty string
required: no
force_detach:
description:
- `By default it is not allowed to delete or destroy disk that is currently attached to a compute
instance (e.g. virtual machine or bare metal server). Set this argument to true to change this
behavior.`
- This argument is meaningful for I(state=absent) operations only and ignored otherwise.
default: false
required: no
jwt:
description:
- 'JWT (access token) for authenticating to the DECORT controller when I(authenticator=jwt).'
- 'This parameter is required if I(authenticator=jwt) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_JWT environment variable.
required: no
oauth2_url:
description:
- 'URL of the oauth2 authentication provider to use when I(authenticator=oauth2).'
- 'This parameter is required when when I(authenticator=oauth2).'
- 'If not specified in the playbook, the value will be taken from DECORT_OAUTH2_URL environment variable.'
password:
description:
- 'Password for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required if I(authenticator=legacy) and ignored in other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_PASSWORD environment variable.
required: no
place_with:
description:
- `This argument can be used to simplify data disks creation along with a new compute, by placing
disks in the same storage, where corresponding OS image is deployed.`
- `Specify ID of an OS image, and the newly created disk will be provisioned from the same
storage, where this OS image is located. You may optionally specify I(pool) to control
actual disk placement within that storage, or leave I(pool=default) to let platform manage
it automatically.`
- This parameter is used when creating new disks and ignored for all other operations.
- This is an alternative to specifying I(sep_id).
default: 0
required: no
pool:
description:
- Name of the pool where to place new disk. Once disk is created, its pool cannot be changed.
- This parameter is used when creating new disk and igonred for all other operations.
default: empty string
required: no
sep_id:
description:
- `ID of the Storage Endpoint Provider (SEP) where to place new disk. Once disk is created,
its SEP cannot be changed.`
- `You may think of SEP as an identifier of a storage system connected to DECORT platform. There
may be several different storage systems and, consequently, several SEPs available to choose from.`
- This parameter is used when creating new disk and igonred for all other operations.
- See also I(place_with) for an alternative way to specify disk placement.
default: 0
required: no
size:
description:
- Size of the disk in GB. This parameter is mandatory when creating new disk.
- `If specified for an existing disk, and it is greater than current disk size, platform will try to resize
the disk on the fly. Downsizing disk is not allowed.`
required: no
limitIO:
description:
- Disk input / output limit, used to limit the speed of interaction with the disk.
required: no
type:
description:
- Type of the disk.
- `Disks can be of the following types: "D"-Data, "B"-Boot, "T"-Tmp.`
default: "D"
required: no
state:
description:
- Specify the desired state of the disk at the exit of the module.
- 'If desired I(state=present):'
- ' - Disk does not exist or is in [DESTROYED, PURGED] states, create new disk according to the specifications.'
- ' - Disk is in DELETED state, restore it and change size if necessary.'
- ' - Disk is in one of [CREATED, ASSIGNED] states, do nothing.'
- ' - Disk in any other state, abort with an error.'
- 'If desired I(state=absent):'
- ' - Disk is in one of [CREATED, ASSIGNED, DELETED] states, destroy it.'
- ' - Disk not found or in [DESTROYED, PURGED] states, do nothing.'
- ' - Disk in any other state, abort with an error.'
default: present
choices: [ absent, present ]
user:
description:
- 'Name of the legacy user for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required when I(authenticator=legacy) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_USER environment variable.
required: no
verify_ssl:
description:
- 'Controls SSL verification mode when making API calls to DECORT controller. Set it to False if you
want to disable SSL certificate verification. Intended use case is when you run module in a trusted
environment that uses self-signed certificates. Note that disabling SSL verification in any other
scenario can lead to security issues, so please know what you are doing.'
default: True
required: no
workflow_callback:
description:
- 'Callback URL that represents an application, which invokes this module (e.g. up-level orchestrator or
end-user portal) and may except out-of-band updates on progress / exit status of the module run.'
- API call at this URL will be used to relay such information to the application.
- 'API call payload will include module-specific details about this module run and I(workflow_context).'
required: no
workflow_context:
description:
- 'Context data that will be included into the payload of the API call directed at I(workflow_callback) URL.'
- 'This context data is expected to uniquely identify the task carried out by this module invocation so
that up-level orchestrator could match returned information to the its internal entities.'
required: no
'''
EXAMPLES = '''
- name: create new Disk named "MyDataDisk01" of size 50 GB, on SEP ID 1, in default pool, under the account "MyAccount".
decort_vins:
authenticator: oauth2
app_id: "{{ MY_APP_ID }}"
app_secret: "{{ MY_APP_SECRET }}"
controller_url: "https://cloud.digitalenergy.online"
name: "MyDataDisk01"
sep_id: 1
size: 50
account_name: "MyAccount"
state: present
delegate_to: localhost
register: my_disk
'''
RETURN = '''
facts:
description: facts about the disk
returned: always
type: dict
sample:
facts:
id: 50
name: data01
size: 10
sep_id: 1
pool: datastore
state: ASSIGNED
account_id: 7
computes: {vm_id: vm_name}
gid: 1001
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
class decort_disk(DecortController):
def __init__(self,arg_amodule):
super(decort_disk, self).__init__(arg_amodule)
@ -308,7 +70,7 @@ class decort_disk(DecortController):
self.disk_id = self.disk_create(accountId=self.acc_id,
name = self.amodule.params['name'],
description=self.amodule.params['annotation'],
description=self.amodule.params['description'],
size=self.amodule.params['size'],
type=self.amodule.params['type'],
iops=self.amodule.params['iops'],
@ -422,7 +184,7 @@ class decort_disk(DecortController):
return dict(
account_id=dict(type='int', required=False, default=0),
account_name=dict(type='str', required=False, default=''),
annotation=dict(type='str', required=False, default='Disk by decort_disk'),
description=dict(type='str', required=False, default='Disk by decort_disk'),
app_id=dict(type='str',
required=False,
fallback=(env_fallback, ['DECORT_APP_ID'])),

@ -1,22 +1,17 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2021 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
#
# Author: Alexey Dankov (alexey.dankov@digitalenergy.online)
DOCUMENTATION = r'''
---
module: decort_group
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
class decort_group(DecortController):
def __init__(self,arg_amodule):
super(decort_group, self).__init__(arg_amodule)
@ -154,7 +149,6 @@ class decort_group(DecortController):
state="CHECK_MODE",
account_id=0,
rg_id=0,
config=None,
)
if check_mode:
@ -180,7 +174,6 @@ class decort_group(DecortController):
return dict(
account_id=dict(type='int', required=False),
account_name=dict(type='str', required=False, default=''),
annotation=dict(type='str', required=False, default=''),
app_id=dict(type='str',
required=False,
fallback=(env_fallback, ['DECORT_APP_ID'])),
@ -235,7 +228,6 @@ class decort_group(DecortController):
)
)
),
description=dict(type='str', default="Created by decort ansible module"),
verify_ssl=dict(type='bool', required=False, default=True),
workflow_callback=dict(type='str', required=False),
workflow_context=dict(type='str', required=False),)

@ -1,86 +1,10 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2021 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
#
# Author: Sergey Shubin (sergey.shubin@digitalenergy.online)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
DOCUMENTATION = r'''
---
module: decort_jwt
short_description: Obtain access token to be used for authentication to DECORT cloud controller
description:
- Obtain JWT (JSON Web Token) from the specified Oauth2 provider. This JWT can be used in subsequent DECS modules'
invocations to authenticate them to the DECS cloud controller.
version_added: "2.4"
author: "Sergey Shubin (sergey.shubin@digitalenergy.online)"
notes:
- Environment variables can be used to pass parameters to the module (see options below for details).
- Specified Oauth2 provider must be trusted by the DECORT cloud controller on which JWT will be used.
- 'If you register module output as I(my_jwt), the JWT value is accessed as I(my_jwt.jwt)'
requirements:
- python >= 2.6
- PyJWT module
- requests module
- decort_utils utility library (module)
- DECORT cloud platform version 3.6.1 or higher
options:
app_id:
description:
- 'Application ID for authenticating to the Oauth2 provider specified in I(oauth2_url).'
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_ID
environment variable.'
required: no
app_secret:
description:
- 'Application API secret used for authenticating to the Oauth2 provider specified in I(oauth2_url).'
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_SECRET
environment variable.'
required: no
oauth2_url:
description:
- 'URL of the oauth2 authentication provider to obtain JWT from.'
- If not specified in the playbook, the value will be taken from DECORT_OAUTH2_URL environment variable.
validity:
description:
- Validity of the JWT in seconds. Default value is 3600 (one hour).
required: no
verify_ssl:
description:
- 'Controls SSL verification mode when making API calls to DECS controller. Set it to False if you
want to disable SSL certificate verification.'
- `Intended use case is when you run module in a trusted environment that uses self-signed certificates.
Note that disabling SSL verification in any other scenario can lead to security issues, so please use
with caution.'
default: True
required: no
'''
EXAMPLES = '''
- name: Obtain JWT and store it as my_jwt for authenticating subsequent task to DECORT cloud controller
decort_jwt:
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: https://sso.decs.online
delegate_to: localhost
register: my_jwt
'''
RETURN = '''
jwt:
description: JSON Web Token that can be used to access DECS cloud controller
returned: always
type: string
sample: None
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
import requests
@ -88,6 +12,7 @@ import requests
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback
def decort_jwt_parameters():
"""Build and return a dictionary of parameters expected by decort_jwt module in a form accepted
by AnsibleModule utility class"""

@ -1,72 +1,17 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2023 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
DOCUMENTATION = r'''
---
'''
module: decort_k8s
EXAMPLES = '''
- name: Create k8s cluster
decort_k8s:
verify_ssl: false
authenticator: jwt
jwt: "{{ run_jwt.jwt }}"
controller_url: "{{CONTROLLER_URL}}"
name: SOME_NAME
rg_id: {{RG_ID}}
k8ci_id: 10
master_count: 3
master_cpu: 2
master_ram: 2048
master_disk: 10
state: present
permanent: True
started: True
getConfig: True
network_plugin: flannel
workers:
- name: wg1
ram: 1024
cpu: 2
disk: 10
num: 1
labels:
- disktype1=ssd1
- disktype2=ssd2
- disktype3=ssd3
taints:
- key1=value1:NoSchedule
- key2=value2:NoSchedule
- key3=value3:NoSchedule
annotations:
- node.deckhouse.io/group1=g1
- node.deckhouse.io/group2=g2
- node.deckhouse.io/group3=g3
- name: wg2
ram: 1024
cpu: 2
disk: 10
num: 1
labels:
- apptype=main
annotations:
- node.mainapp.domen.local/group1=g1
register: some_cluster
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
from copy import deepcopy
class decort_k8s(DecortController):
def __init__(self,arg_amodule):
@ -78,6 +23,17 @@ class decort_k8s(DecortController):
validated_k8ci_id = 0
self.k8s_should_exist = False
self.wg_default_params = {
'num': 1,
'cpu': 1,
'ram': 1024,
'labels': [],
'taints': [],
'annotations': [],
'ci_user_data': {},
'chipset': 'i440fx',
}
if arg_amodule.params['name'] == "" and arg_amodule.params['id'] is None:
self.result['failed'] = True
self.result['changed'] = False
@ -208,6 +164,16 @@ class decort_k8s(DecortController):
return
def create(self):
master_chipset = self.amodule.params['master_chipset']
if master_chipset is None:
master_chipset = 'i440fx'
target_wgs = deepcopy(self.amodule.params['workers'])
for wg in target_wgs:
for param, default_value in self.wg_default_params.items():
if wg[param] is None:
wg[param] = default_value
k8s_id = self.k8s_provision(self.amodule.params['name'],
self.amodule.params['k8ci_id'],
self.amodule.params['rg_id'],
@ -219,7 +185,7 @@ class decort_k8s(DecortController):
self.amodule.params['master_disk'],
self.amodule.params['master_sepid'],
self.amodule.params['master_pool'],
self.amodule.params['workers'][0],
target_wgs[0],
self.amodule.params['extnet_id'],
self.amodule.params['with_lb'],
self.amodule.params['ha_lb'],
@ -232,6 +198,7 @@ class decort_k8s(DecortController):
self.amodule.params['oidc_cert'],
self.amodule.params['description'],
self.amodule.params['extnet_only'],
master_chipset,
)
if not k8s_id:
@ -247,9 +214,11 @@ class decort_k8s(DecortController):
check_state=False)
if self.k8s_id:
self.k8s_should_exist = True
if self.k8s_id and len(self.amodule.params['workers'])>1 :
self.k8s_workers_modify(self.k8s_info,self.amodule.params['workers'])
self.k8s_should_exist = True
self.k8s_workers_modify(
arg_k8swg=self.k8s_info,
arg_modwg=target_wgs,
)
return
def destroy(self):
@ -259,6 +228,13 @@ class decort_k8s(DecortController):
return
def action(self, disared_state, started=True, preupdate: bool = False):
if self.amodule.params['master_chipset'] is not None:
self.result['msg'] = (
'"master_chipset" parameter must not be specified '
'when modifying an existing K8s cluster.'
)
self.exit(fail=True)
if preupdate:
# K8s info updating
self.k8s_info = self.k8s_get_by_id(k8s_id=self.k8s_id)
@ -270,18 +246,18 @@ class decort_k8s(DecortController):
self.k8s_info['techStatus'] == "STARTED"
#check groups and modify if needed
if self.aparams['workers'] is not None:
self.k8s_workers_modify(self.k8s_info, self.aparams['workers'])
self.k8s_workers_modify(self.k8s_info, self.amodule.params['workers'])
if self.result['changed'] == True:
self.k8s_info = self.k8s_get_by_id(k8s_id=self.k8s_id)
#TODO check workers metadata and modify if needed
return
@staticmethod
def build_parameters():
return dict(
account_id=dict(type='int', required=False),
account_name=dict(type='str', required=False, default=''),
annotation=dict(type='str', required=False, default=''),
app_id=dict(type='str',
required=False,
fallback=(env_fallback, ['DECORT_APP_ID'])),
@ -369,6 +345,10 @@ class decort_k8s(DecortController):
type='list',
elements='str',
),
chipset=dict(
type='str',
choices=['Q35', 'i440fx'],
),
),
),
workers_metadata=dict(type='bool',required=False,default=False),
@ -386,7 +366,12 @@ class decort_k8s(DecortController):
oidc_cert=dict(type='raw',required=False,default=None),
verify_ssl=dict(type='bool', required=False, default=True),
workflow_callback=dict(type='str', required=False),
workflow_context=dict(type='str', required=False),)
workflow_context=dict(type='str', required=False),
master_chipset=dict(
type='str',
choices=['Q35', 'i440fx'],
),
)
def main():
module_parameters = decort_k8s.build_parameters()

@ -1,355 +1,17 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2023 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
DOCUMENTATION = r'''
---
module: decort_kvmvm
short_description: Manage KVM virtual machine in DECORT cloud
description: >
This module can be used to create a KVM based virtual machine in Digital Energy cloud platform from a
specified OS image, modify virtual machine's CPU and RAM allocation, change its power state, configure
network port forwarding rules, restart guest OS and delete a virtual machine thus releasing
corresponding cloud resources.
version_added: "2.2"
requirements:
- python >= 3.8
- PyJWT Python module
- requests Python module
- netaddr Python module
- decort_utils utility library (module)
- DECORT cloud platform version 3.8.6 or higher
notes:
- Environment variables can be used to pass selected parameters to the module, see details below.
- Specified Oauth2 provider must be trusted by the DECORT cloud controller on which JWT will be used.
- 'Similarly, JWT supplied in I(authenticator=jwt) mode should be received from Oauth2 provider trusted by
the DECORT cloud controller on which this JWT will be used.'
options:
account_id:
description:
- 'ID of the account in which this VM will be created (for new VMs) or is located (for already
existing VMs). This is the alternative to I(account_name) option.'
- If both I(account_id) and I(account_name) specified, then I(account_name) is ignored.
- If any one of I(vm_id) or I(rg_id) specified, I(account_id) is ignored.
required: no
account_name:
description:
- 'Name of the account in which this VM will be created (for new VMs) or is located (for already
existing VMs).'
- This parameter is ignored if I(account_id) is specified.
- If any one of I(vm_id) or I(rg_id) specified, I(account_name) is ignored.
required: no
annotation:
description:
- Optional text description of this VM.
default: empty string
required: no
app_id:
description:
- 'Application ID for authenticating to the DECORT controller when I(authenticator=oauth2).'
- 'Required if I(authenticator=oauth2).'
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_ID
environment variable.'
required: no
app_secret:
description:
- 'Application API secret used for authenticating to the DECORT controller when I(authenticator=oauth2).'
- This parameter is required when I(authenticator=oauth2) and ignored in other modes.
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_SECRET
environment variable.'
required: no
arch:
description:
- Architecture of the KVM VM. DECORT supports KVM hosts based on Intel x86.
- This parameter is used when new KVM VM is created and ignored for all other operations.
- Module may fail if your DECORT installation does not have physical nodes of specified architecture.
default: X86_64
choices: [ X86_64 ]
required: yes
authenticator:
description:
- Authentication mechanism to be used when accessing DECORT controller and authorizing API call.
default: jwt
choices: [ jwt, oauth2, legacy ]
required: yes
boot_disk:
description:
- 'Boot disk size in GB. If this parameter is not specified for a new VM, the size of the boot disk
will be set to the size of the OS image, which this VM is based on.'
- Boot disk is always created in the same storage and pool, as the OS image, which this VM is based on.
- Boot disk cannot be detached from VM.
required: no
controller_url:
description:
- URL of the DECORT controller that will be contacted to manage the VM according to the specification.
- 'This parameter is always required regardless of the specified I(authenticator) type.'
required: yes
cpu:
description:
- Number of virtual CPUs to allocate for the VM.
- This parameter is required for creating new VM and optional for other operations.
- 'If you set this parameter for an existing VM, then the module will check if VM resize is necessary and do
it accordingly. Note that resize operation on a running VM may generate errors as not all OS images support
hot resize feature.'
required: no
data_disks:
description:
- Optional list of integer IDs of the pre-existing disks that will be attached to this VM.
- These are additional disks (aka data disks) besides boot disk, which is created and attached automatically.
required: no
id:
description:
- ID of the KVM VM to manage.
- 'Either I(id) or a combination of VM name I(name) and RG related parameters (either I(rg_id) or a pair of
I(account_name) and I(rg_name) is required to manage an existing VM.'
- 'This parameter is not required (and ignored) when creating new VM as VM ID is assigned by cloud platform
automatically and cannot be changed afterwards. If existing VM is identified by I(id), then I(account_id),
I(account_name), I(rg_name) or I(rg_id) parameters will be ignored.'
required: no
image_id:
description:
- ID of the OS image to use for VM provisioning.
- 'This parameter is valid at VM creation time only and is ignored for operations on existing VMs.'
- 'You need to know image ID, e.g. by extracting it with decort_osimage module and storing
in a variable prior to calling decort_kvmvm.'
- 'If both I(image_id) and I(image_name) are specified, I(image_name) will be ignored.'
required: no
image_name:
description:
- Name of the OS image to use for a new VM provisioning.
- 'This parameter is valid at VM creation time only and is ignored for operations on existing VMs.'
- 'The specified image name will be looked up in the target DECORT controller and error will be generated if
no matching image is found.'
- 'If both I(image_id) and I(image_name) are specified, I(image_name) will be ignored.'
required: no
jwt:
description:
- 'JWT (access token) for authenticating to the DECORT controller when I(authenticator=jwt).'
- 'This parameter is required if I(authenticator=jwt) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_JWT environment variable.
required: no
name:
description:
- Name of the VM.
- 'To manage VM by I(name) you also need to specify either I(rg_id) or a pair of I(rg_name) and I(account_name).'
- 'If both I(name) and I(id) are specified, I(name) will be ignored and I(id) used to locate the VM.'
required: no
networks:
description:
- List of dictionaries that specifies network connections for this VM.
- Structure of each element is as follows:
- ' - (string) type - type of the network connection. Supported types are VINS and EXTNET.'
- ' - (int) id - ID of the target network segment. It is ViNS ID for I(net_type=VINS) and
external network segment ID for I(net_type=EXTNET)'
- ' - (string) ip_addr - optional IP address to request for this connection. If not specified, the
platform will assign valid IP address automatically.'
- 'If you call decort_kvmvm module for an existing VM, the module will try to reconfigure existing network
connections according to the new specification.'
- If this parameter is not specified, the VM will have no connections to the network(s).
required: no
oauth2_url:
description:
- 'URL of the oauth2 authentication provider to use when I(authenticator=oauth2).'
- 'This parameter is required when when I(authenticator=oauth2).'
- If not specified in the playbook, the value will be taken from DECORT_OAUTH2_URL environment variable.
password:
description:
- 'Password for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required if I(authenticator=legacy) and ignored in other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_PASSWORD environment variable.
required: no
ram:
description:
- Size of RAM in MB to allocate to the VM.
- This parameter is required for creating new VM and optional for other operations.
- 'If you set this parameter for an existing VM, then the module will check if VM resize is necessary and do
it accordingly. Note that resize operation on a running VM may generate errors as not all OS images support
hot resize feature.'
required: no
ssh_key:
description:
- 'SSH public key to be deployed on to the new VM for I(ssh_key_user). If I(ssh_key_user) is not specified,
the key will not be deployed, and a warning is generated.'
- This parameter is valid at VM creation time only and ignored for any operation on existing VMs.
required: no
ssh_key_user:
description:
- User for which I(ssh_key) should be deployed.
- If I(ssh_key) is not specified, this parameter is ignored and a warning is generated.
- This parameter is valid at VM creation time only and ignored for any operation on existing VMs.
required: no
user_data:
description:
- Cloud-init User-Data, exept ssh module
state:
description:
- Specify the desired state of the virtual machine at the exit of the module.
- 'Regardless of I(state), if VM exists and is in one of [MIGRATING, DESTROYING, ERROR] states, do nothing.'
- 'If desired I(state=check):'
- ' - Just check if VM exists in any state and return its current specifications.'
- ' - If VM does not exist, fail the task.'
- 'If desired I(state=present):'
- ' - VM does not exist, create the VM according to the specifications and start it.'
- ' - VM in one of [RUNNING, PAUSED, HALTED] states, attempt resize if necessary, change network if necessary.'
- ' - VM in DELETED state, restore and start it.'
- ' - VM in DESTROYED state, recreate the VM according to the specifications and start it.'
- 'If desired I(state=poweredon):'
- ' - VM does not exist, create it according to the specifications.'
- ' - VM in RUNNING state, attempt resize if necessary, change network if necessary.'
- ' - VM in one of [PAUSED, HALTED] states, attempt resize if necessary, change network if necessary, next
start the VM.'
- ' - VM in DELETED state, restore it.'
- ' - VM in DESTROYED state, create it according to the specifications.'
- 'If desired I(state=absent):'
- ' - VM in one of [RUNNING, PAUSED, HALTED] states, destroy it.'
- ' - VM in one of [DELETED, DESTROYED] states, do nothing.'
- 'If desired I(state=paused):'
- ' - VM in RUNNING state, pause the VM, resize if necessary, change network if necessary.'
- ' - VM in one of [PAUSED, HALTED] states, resize if necessary, change network if necessary.'
- ' - VM in one of [DELETED, DESTROYED] states, abort with an error.'
- 'If desired I(state=poweredoff) or I(state=halted):'
- ' - VM does not exist, create the VM according to the specifications and leave it in HALTED state.'
- ' - VM in RUNNING state, stop the VM, resize if necessary, change network if necessary.'
- ' - VM in one of [PAUSED, HALTED] states, resize if necessary, change network if necessary.'
- ' - VM in DELETED state, abort with an error.'
- ' - VM in DESTROYED state, recreate the VM according to the specifications and leave it in HALTED state.'
default: present
choices: [ present, absent, poweredon, poweredoff, halted, paused, check ]
tags:
description:
- Dict of custom tags to be assigned to the VM.
- These tags are arbitrary text that can be used for grouping or indexing the VMs by other applications.
required: no
user:
description:
- 'Name of the legacy user for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required when I(authenticator=legacy) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_USER environment variable.
required: no
rg_id:
description:
- ID of the Resource Group where a new VM will be deployed or an existing VM can be found.
- 'This parameter may be required when managing VM by its I(name). If you specify I(rg_id), then
I(account_name), I(account_id) and I(rg_name) will be ignored.'
required: no
rg_name:
description:
- Name of the RG where the VM will be deployed (for new VMs) or can be found (for existing VMs).
- This parameter is required when managing VM by its I(name).
- If both I(rg_id) and I(rg_name) are specified, I(rg_name) will be ignored.
- If I(rg_name) is specified, then either I(account_name) or I(account_id) must also be set.
required: no
verify_ssl:
description:
- 'Controls SSL verification mode when making API calls to DECORT controller. Set it to False if you
want to disable SSL certificate verification. Intended use case is when you run module in a trusted
environment that uses self-signed certificates. Note that disabling SSL verification in any other
scenario can lead to security issues, so please know what you are doing.'
default: True
required: no
workflow_callback:
description:
- 'Callback URL that represents an application, which invokes this module (e.g. up-level orchestrator or
end-user portal) and may except out-of-band updates on progress / exit status of the module run.'
- API call at this URL will be used to relay such information to the application.
- 'API call payload will include module-specific details about this module run and I(workflow_context).'
required: no
workflow_context:
description:
- 'Context data that will be included into the payload of the API call directed at I(workflow_callback) URL.'
- 'This context data is expected to uniquely identify the task carried out by this module invocation so
that up-level orchestrator could match returned information to the its internal entities.'
required: no
'''
EXAMPLES = '''
- name: create a VM named "SimpleVM" in the DECORT cloud along with VDC named "ANewVDC" if it does not exist yet.
decort_kvmvm:
annotation: "VM managed by decort_kvmvm module"
authenticator: oauth2
app_id: "{{ MY_APP_ID }}"
app_secret: "{{ MY_APP_SECRET }}"
controller_url: "https://ds1.digitalenergy.online"
name: SimpleVM
cpu: 2
ram: 4096
boot_disk: 10
image_name: "Ubuntu 16.04 v1.1"
data_disks:
- {{DISK_ID}}
state: present
tags:
PROJECT:Ansible
STATUS:Test
account_name: "Development"
rg_name: "ANewVDC"
delegate_to: localhost
register: simple_vm
- name: resize the above VM to CPU 4 and remove port forward rule for port number 80.
decort_kvmvm:
authenticator: jwt
jwt: "{{ MY_JWT }}"
controller_url: "https://ds1.digitalenergy.online"
name: SimpleVM
cpu: 4
ram: 4096
port_forwards:
- ext_port: 21022
int_port: 22
proto: tcp
state: present
account_name: "Development"
rg_name: "ANewVDC"
delegate_to: localhost
register: simple_vm
- name: stop existing VM identified by the VM ID and down size it to CPU:RAM 1:2048 along the way.
decort_kvmvm:
authenticator: jwt
jwt: "{{ MY_JWT }}"
controller_url: "https://ds1.digitalenergy.online"
id: "{{ TARGET_VM_ID }}"
cpu: 1
ram: 2048
state: poweredoff
delegate_to: localhost
register: simple_vm
'''
RETURN = '''
facts:
description: facts about the virtual machine that may be useful in the playbook
returned: always
type: dict
sample:
facts:
id: 9454
name: TestVM
state: RUNNING
username: testuser
password: Yab!tWbyPF
int_ip: 192.168.103.253
rg_name: SandboxVDC
rg_id: 2883
vdc_ext_ip: 185.193.143.151
ext_ip: 185.193.143.106
ext_netmask: 24
ext_gateway: 185.193.143.1
ext_mac: 52:54:00:00:1a:24
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
class decort_kvmvm(DecortController):
def __init__(self, arg_amodule):
# call superclass constructor first
@ -420,6 +82,37 @@ class decort_kvmvm(DecortController):
self.comp_should_exist = True
self.acc_id = self.comp_info['accountId']
check_error = False
params_to_check = {
'chipset': 'chipset',
'cpu_pin': 'cpupin',
'hp_backed': 'hpBacked',
'numa_affinity': 'numaAffinity',
}
for param_name, comp_field_name in params_to_check.items():
if (
self.aparams[param_name] is not None
and self.comp_info[comp_field_name] != self.aparams[param_name]
and self.aparams['state'] not in ('halted', 'poweredoff')
):
self.message(
f'Cannot change "{param_name}" for compute '
f'{self.comp_id} if parameter "state" is not '
f'halted or poweredoff.'
)
check_error = True
if check_error:
self.exit(fail=True)
else:
if self.aparams['chipset'] is None:
self.message(
'Check for parameter "chipset" failed: '
'chipset must be specified for a new compute.'
)
self.exit(fail=True)
return
def check_amodule_args(self):
@ -441,32 +134,15 @@ class decort_kvmvm(DecortController):
)
self.exit(fail=True)
# Check for unacceptable parameters for a blank Compute
if (
self.aparams['image_id'] is None
and self.aparams['image_name'] is None
):
for parameter in (
'ssh_key',
'ssh_key_user',
'ci_user_data',
):
if self.aparams[parameter] is not None:
self.message(
f'Check for parameter "{parameter}" failed: '
f'"image_id" or "image_name" must be specified '
f'to set {parameter}.'
)
self.exit(fail=True)
aparam_custom_fields = self.aparams['custom_fields']
if aparam_custom_fields is not None:
if (
self.aparams['sep_id'] is not None
and self.aparams['boot_disk'] is None
aparam_custom_fields['disable']
and aparam_custom_fields['fields'] is not None
):
self.message(
'Check for parameter "sep_id" failed: '
'"image_id" or "image_name" or "boot_disk" '
'must be specified to set sep_id.'
'Check for parameter "custom_fields" failed: '
'"fields" cannot be set if "disable" is True.'
)
self.exit(fail=True)
@ -579,13 +255,27 @@ class decort_kvmvm(DecortController):
cloud_init_params = self.amodule.params['ci_user_data']
else:
cloud_init_params = None
# if we get through here, all parameters required to create new Compute instance should be at hand
match self.amodule.params['chipset'].lower():
case 'q35':
chipset = 'Q35'
case 'i440fx':
chipset = 'i440fx'
cpu_pin = self.aparams['cpu_pin']
if cpu_pin is None:
cpu_pin = False
hp_backed = self.aparams['hp_backed']
if hp_backed is None:
hp_backed = False
numa_affinity = self.aparams['numa_affinity']
if numa_affinity is None:
numa_affinity = 'none'
if self.aparams['custom_fields'] is None:
custom_fields_disable = True
custom_fields_fields = None
else:
custom_fields_disable = self.aparams['custom_fields']['disable']
custom_fields_fields = self.aparams['custom_fields']['fields']
# 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
self.comp_id = self.kvmvm_provision(rg_id=self.rg_id,
@ -593,12 +283,16 @@ class decort_kvmvm(DecortController):
cpu=self.amodule.params['cpu'], ram=self.amodule.params['ram'],
boot_disk=validated_bdisk_size,
image_id=image_id,
annotation=self.amodule.params['annotation'],
description=self.amodule.params['description'],
userdata=cloud_init_params,
sep_id=self.amodule.params['sep_id' ] if "sep_id" in self.amodule.params else None,
pool_name=self.amodule.params['pool'] if "pool" in self.amodule.params else None,
start_on_create=start_compute,
chipset=chipset)
chipset=self.amodule.params['chipset'],
cpu_pin=cpu_pin,
hp_backed=hp_backed,
numa_affinity=numa_affinity,
custom_fields=custom_fields_fields)
self.comp_should_exist = True
# Originally we would have had to re-read comp_info after VM was provisioned
@ -713,15 +407,44 @@ class decort_kvmvm(DecortController):
**self.compute_update_args,
)
aparam_custom_fields = self.amodule.params['custom_fields']
if aparam_custom_fields is not None:
compute_custom_fields = self.compute_get_custom_fields(
compute_id=self.comp_info['id'],
)
if aparam_custom_fields['disable']:
if compute_custom_fields is not None:
self.compute_disable_custom_fields(
compute_id=self.comp_info['id'],
)
else:
if compute_custom_fields != aparam_custom_fields['fields']:
self.compute_set_custom_fields(
compute_id=self.comp_info['id'],
custom_fields=aparam_custom_fields['fields'],
)
return
@property
def compute_update_args(self) -> dict:
result_args = {}
aparam_name = self.amodule.params['name']
if aparam_name is not None and aparam_name != self.comp_info['name']:
result_args['name'] = aparam_name
params_to_check = {
'name': 'name',
'chipset': 'chipset',
'cpu_pin': 'cpupin',
'hp_backed': 'hpBacked',
'numa_affinity': 'numaAffinity',
'description': 'desc',
}
for param_name, comp_field_name in params_to_check.items():
aparam_value = self.amodule.params[param_name]
if (
aparam_value is not None
and aparam_value != self.comp_info[comp_field_name]
):
result_args[param_name] = aparam_value
return result_args
@ -756,6 +479,10 @@ class decort_kvmvm(DecortController):
tags={},
chipset="",
interfaces=[],
cpu_pin="",
hp_backed="",
numa_affinity="",
custom_fields={},
)
if check_mode or self.comp_info is None:
@ -812,8 +539,46 @@ class decort_kvmvm(DecortController):
ret_dict['interfaces'] = self.comp_info['interfaces']
ret_dict['cpu_pin'] = self.comp_info['cpupin']
ret_dict['hp_backed'] = self.comp_info['hpBacked']
ret_dict['numa_affinity'] = self.comp_info['numaAffinity']
ret_dict['custom_fields'] = self.compute_get_custom_fields(
compute_id=self.comp_info['id'],
)
return ret_dict
def check_amodule_args_for_create(self):
# Check for unacceptable parameters for a blank Compute
if (
self.aparams['image_id'] is None
and self.aparams['image_name'] is None
):
for parameter in (
'ssh_key',
'ssh_key_user',
'ci_user_data',
):
if self.aparams[parameter] is not None:
self.message(
f'Check for parameter "{parameter}" failed: '
f'"image_id" or "image_name" must be specified '
f'to set {parameter}.'
)
self.exit(fail=True)
if (
self.aparams['sep_id'] is not None
and self.aparams['boot_disk'] is None
):
self.message(
'Check for parameter "sep_id" failed: '
'"image_id" or "image_name" or "boot_disk" '
'must be specified to set sep_id.'
)
self.exit(fail=True)
@staticmethod
def build_parameters():
"""Build and return a dictionary of parameters expected by decort_kvmvm module in a form
@ -825,9 +590,7 @@ class decort_kvmvm(DecortController):
return dict(
account_id=dict(type='int', required=False, default=0),
account_name=dict(type='str', required=False, default=''),
annotation=dict(type='str',
default='',
required=False),
description=dict(type='str', required=False),
app_id=dict(type='str',
required=False,
fallback=(env_fallback, ['DECORT_APP_ID'])),
@ -917,11 +680,53 @@ class decort_kvmvm(DecortController):
workflow_context=dict(type='str', required=False),
chipset=dict(
type='str',
default='i440fx',
choices=['Q35', 'q35', 'I440FX', 'i440fx']
choices=['Q35', 'i440fx']
),
cpu_pin=dict(
type='bool',
),
hp_backed=dict(
type='bool',
),
numa_affinity=dict(
type='str',
choices=['strict', 'loose', 'none'],
),
custom_fields=dict(
type='dict',
options=dict(
fields=dict(
type='dict',
),
disable=dict(
type='bool',
),
),
),
)
def check_amodule_args_for_change(self):
new_boot_disk_size = self.amodule.params['boot_disk']
if new_boot_disk_size is not None:
for disk in self.comp_info['disks']:
if disk['type'] == 'B':
boot_disk_size = disk['sizeMax']
break
else:
self.message(
f'Can\'t set boot disk size for Compute '
f'{self.comp_info["id"]}, because it doesn\'t have a '
f'boot disk.'
)
self.exit(fail=True)
if new_boot_disk_size < boot_disk_size:
self.message(
f'New boot disk size {new_boot_disk_size} is less than '
f'current {boot_disk_size} for Compute ID '
f'{self.comp_info["id"]}'
)
self.exit(fail=True)
# Workflow digest:
# 1) authenticate to DECORT controller & validate authentication by issuing API call - done when creating DECSController
# 2) check if the VM with the specified id or rg_name:name exists
@ -980,6 +785,8 @@ def main():
pass
if subj.comp_id:
subj.check_amodule_args_for_change()
if subj.comp_info['status'] in ("DISABLED", "MIGRATING", "DELETING", "DESTROYING", "ERROR", "REDEPLOYING"):
# cannot do anything on the existing Compute in the listed states
subj.error() # was subj.nop()
@ -1011,6 +818,8 @@ def main():
elif amodule.params['state'] == 'paused':
subj.error()
else:
subj.check_amodule_args_for_create()
# Preexisting Compute of specified identity was not found.
# If requested state is 'absent' - nothing to do
if amodule.params['state'] == 'absent':

@ -1,28 +1,17 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2023 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = r'''
---
module: decort_lb
DOCUMENTATION = '''
TODO
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
EXAMPLES = '''
TODO
'''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
class decort_lb(DecortController):
def __init__(self,arg_amodule) -> None:
super(decort_lb,self).__init__(arg_amodule)
@ -113,7 +102,7 @@ class decort_lb(DecortController):
self.rg_id,self.vins_id,
self.amodule.params['ext_net_id'],
self.amodule.params['ha_lb'],
self.amodule.params['annotation'])
self.amodule.params['description'])
if self.lb_id and (self.amodule.params['backends'] or
self.amodule.params['frontends']):
self.lb_id, self.lb_facts = self.lb_find(0,self.amodule.params['lb_name'],self.rg_id)
@ -235,7 +224,7 @@ class decort_lb(DecortController):
return dict(
account_id=dict(type='int', required=False),
account_name=dict(type='str', required=False, default=''),
annotation=dict(type='str', required=False, default='Managed by Ansible module decort_lb'),
description=dict(type='str', required=False, default='Managed by Ansible module decort_lb'),
app_id=dict(type='str',
required=False,
fallback=(env_fallback, ['DECORT_APP_ID'])),

@ -1,285 +1,10 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2021 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
#
# Author: Sergey Shubin (sergey.shubin@digitalenergy.online)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
DOCUMENTATION = r'''
---
module: decort_osimage
short_description: Locate OS image in DCORT cloud by its name and return image ID
description: >
This module can be used to obtain image ID of an OS image in DECORT cloud to use with subsequent calls to
decort_vm module for batch VM provisioning. It will speed up VM creation and save a bunch of extra calls to
DECORT cloud controller on each VM creation act.
version_added: "2.2"
author:
- Sergey Shubin <sergey.shubin@digitalenergy.online>
requirements:
- python >= 2.6
- PyJWT Python module
- requests Python module
- netaddr Python module
- decort_utils utility library (module)
- DECORT cloud platform version 3.6.1 or higher.
notes:
- Environment variables can be used to pass selected parameters to the module, see details below.
- Specified Oauth2 provider must be trusted by the DECORT cloud controller on which JWT will be used.
- 'Similarly, JWT supplied in I(authenticator=jwt) mode should be received from Oauth2 provider trusted by
the DECORT cloud controller on which this JWT will be used.'
options:
app_id:
description:
- 'Application ID for authenticating to the DECORT controller when I(authenticator=oauth2).'
- 'Required if I(authenticator=oauth2).'
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_ID
environment variable.'
required: no
app_secret:
description:
- 'Application API secret used for authenticating to the DECORT controller when I(authenticator=oauth2).'
- This parameter is required when I(authenticator=oauth2) and ignored in other modes.
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_SECRET
environment variable.'
required: no
authenticator:
description:
- Authentication mechanism to be used when accessing DECORT controller and authorizing API call.
default: jwt
choices: [ jwt, oauth2, legacy ]
required: yes
controller_url:
description:
- URL of the DECORT controller that will be contacted to obtain OS image details.
- 'This parameter is always required regardless of the specified I(authenticator) type.'
required: yes
image_name:
description:
- Name of the OS image to use. Module will return the ID of this image.
- 'The specified image name will be looked up in the target DECORT controller and error will be generated
- if no matching image is found.'
required: yes
jwt:
description:
- 'JWT (access token) for authenticating to the DECORT controller when I(authenticator=jwt).'
- 'This parameter is required if I(authenticator=jwt) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_JWT environment variable.
required: no
oauth2_url:
description:
- 'URL of the oauth2 authentication provider to use when I(authenticator=oauth2).'
- 'This parameter is required when when I(authenticator=oauth2).'
- If not specified in the playbook, the value will be taken from DECORT_OAUTH2_URL environment variable.
password:
description:
- 'Password for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required if I(authenticator=legacy) and ignored in other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_PASSWORD environment variable.
required: no
pool:
description:
- 'Name of the storage pool, where the image should be found.'
- 'Omit this option if no matching by pool name is required. The first matching image will be returned."
required: no
sep_id:
description:
- 'ID of the SEP (Storage End-point Provider), where the image should be found.'
- 'Omit this option if no matching by SEP ID is required. The first matching image will be returned."
required: no
account_name:
description:
- 'Name of the account for which the specified OS image will be looked up.'
- 'This parameter is required for listing OS images.'
required: yes
user:
description:
- 'Name of the legacy user for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required when I(authenticator=legacy) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_USER environment variable.
required: no
verify_ssl:
description:
- 'Controls SSL verification mode when making API calls to DECORT controller. Set it to False if you
want to disable SSL certificate verification. Intended use case is when you run module in a trusted
environment that uses self-signed certificates. Note that disabling SSL verification in any other
scenario can lead to security issues, so please know what you are doing.'
default: True
required: no
workflow_callback:
description:
- 'Callback URL that represents an application, which invokes this module (e.g. up-level orchestrator or
end-user portal) and may except out-of-band updates on progress / exit status of the module run.'
- API call at this URL will be used to relay such information to the application.
- 'API call payload will include module-specific details about this module run and I(workflow_context).'
required: no
workflow_context:
description:
- 'Context data that will be included into the payload of the API call directed at I(workflow_callback) URL.'
- 'This context data is expected to uniquely identify the task carried out by this module invocation so
that up-level orchestrator could match returned information to the its internal entities.'
required: no
account_name:
description:
- 'Account name. Used to get a unique integer account ID.'
required: no
virt_id:
description:
- 'A unique integer identifier for the virtual image.'
- 'Can be used to obtain information about a virtual image, as well as to create a virtual image and
- bind another operating system image to it.'
required: no
virt_name:
description:
- 'Name of the virtual image. Used to get the `virt_id`, and later information about the virtual image,
- as well as to create a virtual image and bind another operating system image to it.'
required: no
state:
description:
- 'The state of the images. If set to present, operating system images will be created to which
- the account specified in `account_Id` or `account_name` is bound. If set to absent, they will be removed.
required: no
drivers:
description:
- 'A list of compute types (eg virtual servers) that are appropriate for the operating system image.
- Note: `KVM_X86`. Used when creating an operating system image.'
required: no
architecture:
description:
- 'Binary architecture of the image. Note. `X86_64`. Used when creating
-an operating system image.'
required: no
imagetype:
description:
- 'Image type. `linux`, `windows` or `other`. The default is `linux`. Used when creating
- an operating system image.'
required: no
boottype:
description:
- 'Image upload type. `bios` or `uefi`. The default is `uefi`. Used when creating an operating
-system image.'
required: no
url:
description:
- 'Uniform resource locator (URL) pointing to the iso image of the operating system. Used when
-creating an operating system image.'
required: no
sepId:
description:
- 'The unique integer ID of the storage provider endpoint. Specified in pair with `poolName`.
- Used when creating an operating system image.'
required: no
poolName:
description:
- 'The pool in which the image will be created. Specified in pair with `sepId`. Used when creating
- an operating system image.'
required: no
hotresize:
description:
- 'Whether the image supports "hot" resizing. The default is `false`. Used when creating an operating
- system image.'
required: no
image_username:
description:
- 'An optional username for the image. Used when creating an operating system image.'
required: no
image_password:
description:
- 'An optional password for the image. Used when creating an operating system image. Used when creating
- an operating system image.'
required: no
usernameDL:
description:
- 'The username for loading the binary media. Used in conjunction with `passwordDL`. Used when creating
- an operating system image'
required: no
passwordDL:
description:
- 'The password for loading the binary media. Used in conjunction with `usernameDL`. Used when creating
- an operating system image.'
required: no
'''
EXAMPLES = '''
- name: create_osimage
decort_osimage:
authenticator: oauth2
verify_ssl: False
controller_url: "https://ds1.digitalenergy.online"
state: present
image_name: "alpine_linux3.14.0"
account_Id: 12345
url: "https://dl-cdn.alpinelinux.org/alpine/v3.14/releases/x86_64/alpine-virt-3.14.0-x86_64.iso"
boottype: "uefi"
imagetype: "linux"
hotresize: False
image_username: "test"
image_password: "p@ssw0rd"
usernameDL: "testDL"
passwordDL: "p@ssw0rdDL"
architecture: "X86_64"
drivers: "KVM_X86"
delegate_to: localhost
register: osimage
- name: get_osimage
decort_osimage:
authenticator: oauth2
controller_url: "https://ds1.digitalenergy.online"
image_name: "alpine_linux_3.14.0"
account_Id: 12345
delegate_to: localhost
register: osimage
- name: create_virtual_osimage
decort_osimage:
authenticator: oauth2
controller_url: "https://ds1.digitalenergy.online"
image_name: "alpine_linux_3.14.0"
virt_name: "alpine_last"
delegate_to: localhost
register: osimage
- name: rename_osimage
decort_osimage:
authenticator: oauth2
controller_url: "https://ds1.digitalenergy.online"
image_name: "alpine_linux_3.14.0v2.0"
image_id: 54321
delegate_to: localhost
register: osimage
'''
RETURN = '''
facts:
description: facts about the specified OS image
returned: always
type: dict
sample:
facts:
id: 100
linkto: 80
name: "Ubuntu 16.04 v1.0"
size: 3
sep_id: 1
pool: "vmstore"
type: Linux
arch: x86_64
state: CREATED
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule
@ -287,6 +12,7 @@ from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
class decort_osimage(DecortController):
def __init__(self,amodule):
super(decort_osimage, self).__init__(amodule)

@ -1,180 +1,10 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2021 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
#
# Author: Sergey Shubin (sergey.shubin@digitalenergy.online)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
DOCUMENTATION = r'''
---
module: decort_pfw
short_description: Manage network Port Forward rules for Compute instances in DECORT cloud
description: >
This module can be used to create new port forwarding rules in DECORT cloud platform,
modify and delete them.
version_added: "2.2"
author:
- Sergey Shubin <sergey.shubin@digitalenergy.online>
requirements:
- python >= 2.6
- PyJWT Python module
- requests Python module
- netaddr Python module
- decort_utils utility library (module)
- DECORT cloud platform version 3.6.1 or higher
notes:
- Environment variables can be used to pass selected parameters to the module, see details below.
- Specified Oauth2 provider must be trusted by the DECORT cloud controller on which JWT will be used.
- 'Similarly, JWT supplied in I(authenticator=jwt) mode should be received from Oauth2 provider trusted by
the DECORT cloud controller on which this JWT will be used.'
options:
account_id:
description:
- ID of the account, which owns this disk. This is the alternative to I(account_name) option.
- If both I(account_id) and I(account_name) specified, then I(account_name) is ignored.
default: 0
required: no
account_name:
description:
- 'Name of the account, which will own this disk.'
- 'This parameter is ignored if I(account_id) is specified.'
default: empty string
required: no
app_id:
description:
- 'Application ID for authenticating to the DECORT controller when I(authenticator=oauth2).'
- 'Required if I(authenticator=oauth2).'
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_ID
environment variable.'
required: no
app_secret:
description:
- 'Application API secret used for authenticating to the DECORT controller when I(authenticator=oauth2).'
- This parameter is required when I(authenticator=oauth2) and ignored in other modes.
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_SECRET
environment variable.'
required: no
authenticator:
description:
- Authentication mechanism to be used when accessing DECORT controller and authorizing API call.
default: jwt
choices: [ jwt, oauth2, legacy ]
required: yes
controller_url:
description:
- URL of the DECORT controller that will be contacted to manage the RG according to the specification.
- 'This parameter is always required regardless of the specified I(authenticator) type.'
required: yes
compute_id:
description:
- ID of the Compute instance to manage network port forwarding rules for.
required: yes
jwt:
description:
- 'JWT (access token) for authenticating to the DECORT controller when I(authenticator=jwt).'
- 'This parameter is required if I(authenticator=jwt) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_JWT environment variable.
required: no
oauth2_url:
description:
- 'URL of the oauth2 authentication provider to use when I(authenticator=oauth2).'
- 'This parameter is required when when I(authenticator=oauth2).'
- 'If not specified in the playbook, the value will be taken from DECORT_OAUTH2_URL environment variable.'
password:
description:
- 'Password for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required if I(authenticator=legacy) and ignored in other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_PASSWORD environment variable.
required: no
rules:
description:
- 'Set of rules to configure for the Compute instance identidied by I(compute_id) in the virtual
network segment identidied by I(vins_id).'
- The set is specified as a list of dictionaries with the following structure:
- ' - (int) public_port_start - starting port number on the ViNS external interface.'
- ' - (int) public_port_end - optional end port number of the ViNS external interface. If not specified
or set equal to I(public_port_start), a one-to-one rule is created. Otherwise a ranged rule will
be created, which maps specified external port range to local ports starting from I(local_port).'
- ' - (int) local_port - port number on the local interface of the Compute. For ranged rule it is
interpreted as a base port to translate public port range to internal port range.'
- ' - (string) proto - protocol, specify either I(tcp) or I(udp).'
- 'Note that rules are meaningful only if I(state=present). If I(state=absent) is specified, rules set
will be ignored, and all rules for the specified Compute will be deleted.'
state:
description:
- 'Specify the desired state of the port forwarding rules set for the Compute instance identified by
I(compute_id).'
- 'If I(state=present), the rules will be applied according to the I(rules) parameter.'
- 'If I(state=absent), all rules for the specified Compute instance will be deleted regardless of
I(rules) parameter.'
default: present
choices: [ absent, present ]
verify_ssl:
description:
- 'Controls SSL verification mode when making API calls to DECORT controller. Set it to False if you
want to disable SSL certificate verification. Intended use case is when you run module in a trusted
environment that uses self-signed certificates. Note that disabling SSL verification in any other
scenario can lead to security issues, so please know what you are doing.'
default: True
required: no
vins_id:
description:
- ID of the virtual network segment (ViNS), where port forwarding rules will be set up.
- This ViNS must have connection to external network.
- Compute instance specified by I(compute_id) must be connected to this ViNS.
workflow_callback:
description:
- 'Callback URL that represents an application, which invokes this module (e.g. up-level orchestrator or
end-user portal) and may except out-of-band updates on progress / exit status of the module run.'
- API call at this URL will be used to relay such information to the application.
- 'API call payload will include module-specific details about this module run and I(workflow_context).'
required: no
workflow_context:
description:
- 'Context data that will be included into the payload of the API call directed at I(workflow_callback) URL.'
- 'This context data is expected to uniquely identify the task carried out by this module invocation so
that up-level orchestrator could match returned information to the its internal entities.'
required: no
'''
EXAMPLES = '''
- name: configure one-toone rule for SSH protocol on Compute ID 100 connected to ViNS ID 5.
decort_pfw:
authenticator: oauth2
app_id: "{{ MY_APP_ID }}"
app_secret: "{{ MY_APP_SECRET }}"
controller_url: "https://cloud.digitalenergy.online"
compute_id: 100
vins_id: 5
rules:
- public_port_start: 10022
local_port: 22
proto: tcp
state: present
delegate_to: localhost
register: my_pfw
'''
RETURN = '''
facts:
description: facts about created PFW rules
returned: always
type: dict
sample:
facts:
compute_id: 100
vins_id: 5
rules:
-
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule

@ -1,207 +1,10 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2021 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
#
# Author: Sergey Shubin (sergey.shubin@digitalenergy.online)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
DOCUMENTATION = r'''
---
module: decort_rg
short_description: Manage resource groups (RGs) in DECORT cloud
description: >
This module can be used to create a new resource group in DECORT cloud platform, modify its
characteristics, and delete it.
version_added: "2.2"
author:
- Sergey Shubin <sergey.shubin@digitalenergy.online>
requirements:
- python >= 2.6
- PyJWT Python module
- requests Python module
- netaddr Python module
- decort_utils utility library (module)
- DECORT cloud platform version 3.6.1 or higher
notes:
- Environment variables can be used to pass selected parameters to the module, see details below.
- Specified Oauth2 provider must be trusted by the DECORT cloud controller on which JWT will be used.
- 'Similarly, JWT supplied in I(authenticator=jwt) mode should be received from Oauth2 provider trusted by
the DECORT cloud controller on which this JWT will be used.'
- New RGs provisioned with this module will be deployed to the first location under specified DECORT
controller (if there is more than one location).
options:
account_id:
description:
- ID of the account under which this RG will be created. This is the alternative to I(account_name)
option. If both I(account_id) and I(account_name) specified, the latter is ignored.
account_name:
description:
- 'Name of the account under which this RG will be created (for new RGs) or is located.'
- 'This parameter is ignored if I(account_id) is specified.'
required: no
annotation:
description:
- Optional text description of this resource group.
default: empty string
required: no
app_id:
description:
- 'Application ID for authenticating to the DECORT controller when I(authenticator=oauth2).'
- 'Required if I(authenticator=oauth2).'
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_ID
environment variable.'
required: no
app_secret:
description:
- 'Application API secret used for authenticating to the DECORT controller when I(authenticator=oauth2).'
- This parameter is required when I(authenticator=oauth2) and ignored in other modes.
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_SECRET
environment variable.'
required: no
authenticator:
description:
- Authentication mechanism to be used when accessing DECORT controller and authorizing API call.
default: jwt
choices: [ jwt, oauth2, legacy ]
required: yes
controller_url:
description:
- URL of the DECORT controller that will be contacted to manage the RG according to the specification.
- 'This parameter is always required regardless of the specified I(authenticator) type.'
required: yes
jwt:
description:
- 'JWT (access token) for authenticating to the DECORT controller when I(authenticator=jwt).'
- 'This parameter is required if I(authenticator=jwt) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_JWT environment variable.
required: no
oauth2_url:
description:
- 'URL of the oauth2 authentication provider to use when I(authenticator=oauth2).'
- 'This parameter is required when when I(authenticator=oauth2).'
- If not specified in the playbook, the value will be taken from DECORT_OAUTH2_URL environment variable.
password:
description:
- 'Password for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required if I(authenticator=legacy) and ignored in other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_PASSWORD environment variable.
required: no
quotas:
description:
- Dictionary that defines resource quotas to be set on a newly created RG.
- 'This parameter is optional and only used when creating new RG. It is ignored for any operations on an
existing RG.'
- 'The following keys are valid to set the resource quotas:'
- ' - I(cpu) (integer) - limit on the total number of CPUs that can be consumed by all compute instances
in this RG.'
- ' - I(ram) (integer) - limit on the total amount of RAM in GB that can be consumed by compute instances
in this RG.'
- ' - I(disk) (integer) - limit on the total volume of disk space in GB that can be consumed by all
compute instances in this RG.'
- ' - I(ext_ips) (integer) - maximum number of external IP addresses that can be allocated to the compute
instances and virtual network segments (ViNS) in this RG.'
- 'Each of the above keys is optional. For example, you may specify I(cpu) and I(ram) while omitting the
other two keys. Then the quotas will be set on RAM and CPU leaving disk volume and the number of external
IP addresses unlimited.'
required: no
rg_name:
description:
- Name of the RG to manage.
required: yes
state:
description:
- Specify the desired state of the resource group at the exit of the module.
- 'Regardless of I(state), if RG exists and is in one of [DEPLOYING, DESTROYING, MIGRATING, ] states,
do nothing.'
- 'If desired I(state=present):'
- ' - RG does not exist or is in DESTROYED state, create new RG according to the specifications.'
- ' - RG is in one of [CREATED, DISABLED] states, change quotas if necessary.'
- ' - RG is in DELETED state, restore it and change quotas if necessary. RG will be left in DISABLED state.'
- ' - RG in any other state, abort with an error.'
- 'If desired I(state=enabled):'
- ' - RG does not exist or is in DESTROYED state, create new RG according to the specifications.'
- ' - RG is in CREATED state, change quotas if necessary.'
- ' - RG is in DELETED state, restore it, change quotas if necessary and enable.'
- ' - RG is in any other state, abort with an error.'
- 'If desired I(state=absent):'
- ' - RG is in one of [CREATED, DISABLED, DELETED] states, destroy it.'
- ' - RG in DESTROYED state, do nothing.'
- ' - RG in any other state, abort with an error.'
- 'If desired I(state=disabled):'
- ' - RG does not exist or is in one of [ENABLING, DISABLING, DELETING, DELETED, DESTROYING, DESTROYED]
states, abort with an error.'
- ' - RG is DISABLED state, change quotas if necessary.'
- ' - RG is in CREATED state, change quotas if necessary and disable the RG.'
default: present
choices: [ absent, disabled, enabled, present ]
user:
description:
- 'Name of the legacy user for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required when I(authenticator=legacy) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_USER environment variable.
required: no
verify_ssl:
description:
- 'Controls SSL verification mode when making API calls to DECORT controller. Set it to False if you
want to disable SSL certificate verification. Intended use case is when you run module in a trusted
environment that uses self-signed certificates. Note that disabling SSL verification in any other
scenario can lead to security issues, so please know what you are doing.'
default: True
required: no
workflow_callback:
description:
- 'Callback URL that represents an application, which invokes this module (e.g. up-level orchestrator or
end-user portal) and may except out-of-band updates on progress / exit status of the module run.'
- API call at this URL will be used to relay such information to the application.
- 'API call payload will include module-specific details about this module run and I(workflow_context).'
required: no
workflow_context:
description:
- 'Context data that will be included into the payload of the API call directed at I(workflow_callback) URL.'
- 'This context data is expected to uniquely identify the task carried out by this module invocation so
that up-level orchestrator could match returned information to the its internal entities.'
required: no
'''
EXAMPLES = '''
- name: create a new RG named "MyFirstRG" if it does not exist yet, set quotas on CPU and the number of exteranl IPs.
decort_rg:
authenticator: oauth2
app_id: "{{ MY_APP_ID }}"
app_secret: "{{ MY_APP_SECRET }}"
controller_url: "https://cloud.digitalenergy.online"
rg_name: "MyFirstRG"
account_name: "MyMainAccount"
quotas:
cpu: 16
ext_ips: 4
annotation: "My first RG created with Ansible module"
state: present
delegate_to: localhost
register: my_rg
'''
RETURN = '''
facts:
description: facts about the resource group
returned: always
type: dict
sample:
facts:
id: 100
name: MyFirstRG
state: CREATED
account_id: 10
gid: 1001
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule
@ -209,6 +12,7 @@ from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
class decort_rg(DecortController):
def __init__(self,amodule):
super(decort_rg, self).__init__(amodule)
@ -347,7 +151,7 @@ class decort_rg(DecortController):
self.validated_rg_id = self.rg_provision(self.validated_acc_id,
self.amodule.params['rg_name'],
self.amodule.params['owner'],
self.amodule.params['annotation'],
self.amodule.params['description'],
self.amodule.params['resType'],
self.amodule.params['def_netType'],
self.amodule.params['ipcidr'],
@ -441,7 +245,7 @@ class decort_rg(DecortController):
account_id=dict(type='int', required=False),
account_name=dict(type='str', required=False, default=''),
access=dict(type='dict'),
annotation=dict(type='str', required=False, default=''),
description=dict(type='str', required=False, default=''),
app_id=dict(type='str',
required=False,
fallback=(env_fallback, ['DECORT_APP_ID'])),

@ -1,23 +1,12 @@
#!/usr/bin/python
# Copyright: ...
# ...
DOCUMENTATION = r'''
---
module: decort_user_info
version_added: "2.16"
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
# EXAMPLES = r'''
# '''
# RETURN = r'''
# '''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.decort_utils import DecortController

@ -1,239 +1,10 @@
#!/usr/bin/python
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2021 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
DOCUMENTATION = r'''
---
module: decort_vins
short_description: Manage Virtual Network Segments (ViNS) in DECORT cloud
description: >
This module can be used to create new ViNS in DECORT cloud platform, obtain or
modify its characteristics, and delete it.
version_added: "2.2"
author:
requirements:
- python >= 3.8
- PyJWT Python module
- requests Python module
- netaddr Python module
- decort_utils utility library (module)
- DECORT cloud platform version 3.8.6 or higher
notes:
- Environment variables can be used to pass selected parameters to the module, see details below.
- Specified Oauth2 provider must be trusted by the DECORT cloud controller on which JWT will be used.
- 'Similarly, JWT supplied in I(authenticator=jwt) mode should be received from Oauth2 provider trusted by
the DECORT cloud controller on which this JWT will be used.'
options:
account_id:
description:
- 'ID of the account under which this ViNS will be created (for new ViNS) or is located (for already
existing ViNS). This is the alternative to I(account_name) option.'
- If both I(account_id) and I(account_name) specified, then I(account_name) is ignored.
required: no
account_name:
description:
- 'Name of the account under which this ViNS will be created (for new RGs) or is located (for already
existing ViNS).'
- 'This parameter is ignored if I(account_id) is specified.'
required: no
annotation:
description:
- Optional text description of this virtual network segment.
default: empty string
required: no
app_id:
description:
- 'Application ID for authenticating to the DECORT controller when I(authenticator=oauth2).'
- 'Required if I(authenticator=oauth2).'
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_ID
environment variable.'
required: no
app_secret:
description:
- 'Application API secret used for authenticating to the DECORT controller when I(authenticator=oauth2).'
- This parameter is required when I(authenticator=oauth2) and ignored in other modes.
- 'If not found in the playbook or command line arguments, the value will be taken from DECORT_APP_SECRET
environment variable.'
required: no
authenticator:
description:
- Authentication mechanism to be used when accessing DECORT controller and authorizing API call.
default: jwt
choices: [ jwt, oauth2, legacy ]
required: yes
controller_url:
description:
- URL of the DECORT controller that will be contacted to manage the RG according to the specification.
- 'This parameter is always required regardless of the specified I(authenticator) type.'
required: yes
ext_net_id:
description:
- 'Controls ViNS connection to an external network. This argument is optional with default value of -1,
which means no external connection.'
- Specify 0 to connect ViNS to external network and let platform select external network Id automatically.
- Specify positive value to request ViNS connection to the external network with corresponding ID.
- You may also control external IP address selection with I(ext_ip_addr) argument.
default: -1
required: no
ext_ip_addr:
description:
- IP address to assign to the external interface of this ViNS when connecting to the external net.
- If empty string is passed, the platform will assign free IP address automatically.
- 'Note that if invalid IP address or an address already occupied by another client is specified,
the module will abort with an error.'
- 'This argument is used only for new connection to the specified network. You cannot select another
external IP address without changing external network ID.'
- ViNS connection to the external network is controlled by I(ext_net_id) argument.
default: empty string
required: no
ipcidr:
description:
- Internal ViNS network address in a format XXX.XXX.XXX.XXX/XX (includes address and netmask).
- If empty string is passed, the platform will assign network address automatically.
- 'When selecting this address manually, note that this address must be unique amomng all ViNSes in
the target account.'
default: empty string
required: no
jwt:
description:
- 'JWT (access token) for authenticating to the DECORT controller when I(authenticator=jwt).'
- 'This parameter is required if I(authenticator=jwt) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_JWT environment variable.
required: no
oauth2_url:
description:
- 'URL of the oauth2 authentication provider to use when I(authenticator=oauth2).'
- 'This parameter is required when when I(authenticator=oauth2).'
- 'If not specified in the playbook, the value will be taken from DECORT_OAUTH2_URL environment variable.'
password:
description:
- 'Password for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required if I(authenticator=legacy) and ignored in other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_PASSWORD environment variable.
required: no
rg_id:
description:
- 'ID of the resource group (RG), where this ViNS will be created (for a new ViNS) or located
(for already existing ViNS).'
- If ViNS is created at the account level, I(rg_id) should be omitted or set to 0.
- If both I(rg_id) and I(rg_name) are specified, then I(rg_name) is ignored.
default: 0
required: no
rg_name:
description:
- 'Name of the resource group (RG), where this ViNS will be created (for new ViNS) or
located (for already existing ViNS).'
- If ViNS is created at the account level, I(rg_name) should be omitted or set to emtpy string.
- If both I(rg_name) and I(rg_id) are specified, then I(rg_name) is ignored.
default: empty string
required: no
state:
description:
- Specify the desired state of the ViNS at the exit of the module.
- 'Regardless of I(state), if ViNS exists and is in one of [DEPLOYING, DESTROYING, MIGRATING] states,
do nothing.'
- 'If desired I(state=present):'
- ' - ViNS does not exist or is in DESTROYED state, create new ViNS according to the specifications.'
- ' - ViNS is in DELETED state, restore it and change quotas if necessary. Note that on successful
restore ViNS will be left in DISABLED state.'
- ' - ViNS is in one of [CREATED, ENABLED, DISABLED] states, do nothing.'
- ' - ViNS in any other state, abort with an error.'
- 'If desired I(state=enabled):'
- ' - ViNS does not exist or is in DESTROYED state, create new ViNS according to the specifications.'
- ' - ViNS is in DELETED state, restore and enable it.'
- ' - ViNS is in one of [CREATED, ENABLED] states, do nothing.'
- ' - viNS is in any other state, abort with an error.'
- 'If desired I(state=absent):'
- ' - ViNS is in one of [CREATED, ENABLED, DISABLED, DELETED] states, destroy it.'
- ' - ViNS in DESTROYED state, do nothing.'
- ' - ViNS in any other state, abort with an error.'
- 'If desired I(state=disabled):'
- ' - ViNS is in one of [CREATED, ENABLED] states, disable it.'
- ' - ViNS is DISABLED state, do nothing.'
- ' - ViNS does not exist or is in one of [ENABLING, DISABLING, DELETING, DELETED, DESTROYING, DESTROYED]
states, abort with an error.'
default: present
choices: [ absent, disabled, enabled, present ]
user:
description:
- 'Name of the legacy user for authenticating to the DECORT controller when I(authenticator=legacy).'
- 'This parameter is required when I(authenticator=legacy) and ignored for other authentication modes.'
- If not specified in the playbook, the value will be taken from DECORT_USER environment variable.
required: no
verify_ssl:
description:
- 'Controls SSL verification mode when making API calls to DECORT controller. Set it to False if you
want to disable SSL certificate verification. Intended use case is when you run module in a trusted
environment that uses self-signed certificates. Note that disabling SSL verification in any other
scenario can lead to security issues, so please know what you are doing.'
default: True
required: no
vins_id:
description:
- ID of the ViNs to manage. If ViNS is identified by ID it must be present.
- If ViNS ID is specified, I(account_id), I(account_name), I(rg_id) and I(rg_name) are ignored.
vins_name:
description:
- Name of the ViNS.
- ViNS can exist at either account or resource group level.
- ViNS name is unique only within its parent (i.e. account or resource group).
- 'To create ViNS at account level omit both I(rg_id) and I(rg_name), or set them to 0 and empty
string respectively.'
required: yes
workflow_callback:
description:
- 'Callback URL that represents an application, which invokes this module (e.g. up-level orchestrator or
end-user portal) and may except out-of-band updates on progress / exit status of the module run.'
- API call at this URL will be used to relay such information to the application.
- 'API call payload will include module-specific details about this module run and I(workflow_context).'
required: no
workflow_context:
description:
- 'Context data that will be included into the payload of the API call directed at I(workflow_callback) URL.'
- 'This context data is expected to uniquely identify the task carried out by this module invocation so
that up-level orchestrator could match returned information to the its internal entities.'
required: no
'''
EXAMPLES = '''
- name: create a new ViNS named "MyViNS" if it does not exist yet under RG "MyRG" in the account "MyAccount".
decort_vins:
authenticator: oauth2
app_id: "{{ MY_APP_ID }}"
app_secret: "{{ MY_APP_SECRET }}"
controller_url: "https://cloud.digitalenergy.online"
vins_name: "MyViNS"
rg_name: "MyRG"
account_name: "MyAccount"
state: present
delegate_to: localhost
register: my_vins
'''
RETURN = '''
facts:
description: facts about the virtual network segment
returned: always
type: dict
sample:
facts:
id: 5
name: MyViNS
int_net_addr: 192.168.1.0
ext_net_addr: 10.50.11.118
state: CREATED
account_id: 7
rg_id: 19
gid: 1001
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
'''
from ansible.module_utils.basic import AnsibleModule
@ -241,6 +12,7 @@ from ansible.module_utils.basic import env_fallback
from ansible.module_utils.decort_utils import *
class decort_vins(DecortController):
def __init__(self,arg_amodule):
super(decort_vins, self).__init__(arg_amodule)
@ -337,7 +109,7 @@ class decort_vins(DecortController):
self.acc_id, self.rg_id,
self.amodule.params['ipcidr'],
self.amodule.params['ext_net_id'], self.amodule.params['ext_ip_addr'],
self.amodule.params['annotation'])
self.amodule.params['description'])
if self.amodule.params['mgmtaddr'] or self.amodule.params['connect_to']:
_, self.vins_facts = self.vins_find(self.vins_id)
@ -473,7 +245,7 @@ class decort_vins(DecortController):
return dict(
account_id=dict(type='int', required=False,default=0),
account_name=dict(type='str', required=False, default=''),
annotation=dict(type='str', required=False, default=''),
description=dict(type='str', required=False, default=''),
app_id=dict(type='str',
required=False,
fallback=(env_fallback, ['DECORT_APP_ID'])),

@ -1,33 +1,4 @@
#
# Digital Enegry Cloud Orchestration Technology (DECORT) modules for Ansible
# Copyright: (c) 2018-2023 Digital Energy Cloud Solutions LLC
#
# Apache License 2.0 (see http://www.apache.org/licenses/LICENSE-2.0.txt)
#
"""
This is the library of utility functions and classes for managing DECORT cloud platform.
These classes are made aware of Ansible module architecture and designed to be called from the main code of an Ansible
module to fulfill cloud resource management tasks.
Methods defined in this file should NOT implement complex logic like building execution plan for an
upper level Ansible module. However, they do implement necessary sanity checks and may abort upper level module
execution if some fatal error occurs. Being Ansible aware, they usually do so by calling AnsibleModule.fail_json(...)
method with properly configured arguments.
NOTE: this utility library requires DECORT platform version 3.4.0 or higher.
It is not compatible with older versions.
Requirements:
- python >= 3.8
- PyJWT Python module
- requests Python module
- netaddr Python module
- DECORT cloud platform version 3.8.6 or higher
"""
from copy import deepcopy
from datetime import datetime
from enum import Enum
import json
@ -1095,11 +1066,6 @@ class DecortController(object):
self.result['warning'] = ("compute_bootdisk_size(): new size {} is the same as current for "
"Compute ID {}, nothing to do.").format(new_size, comp_dict['id'])
return
elif new_size < bdisk_size:
self.result['failed'] = False
self.result['warning'] = ("compute_bootdisk_size(): new size {} is less than current {} for "
"Compute ID {}, skipping change.").format(new_size, bdisk_size, comp_dict['id'])
return
api_params = dict(diskId=bdisk_id,
size=new_size)
@ -1405,11 +1371,15 @@ class DecortController(object):
boot_disk,
image_id,
chipset: Literal['Q35', 'i440fx'] = 'i440fx',
annotation="",
description="",
userdata=None,
sep_id=None,
pool_name=None,
start_on_create=True):
start_on_create=True,
cpu_pin: bool = False,
hp_backed: bool = False,
numa_affinity: Literal['none', 'loose', 'strict'] = 'none',
custom_fields: Optional[dict] = None):
"""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.
@ -1419,7 +1389,7 @@ class DecortController(object):
@param (int) ram: volume of RAM in MB to allocate (i.e. pass 4096 to allocate 4GB RAM).
@param (int) boot_disk: boot disk size in GB.
@param (int) image_id: ID of the OS image to base this Compute on.
@param (string) annotation: optional text description for the VM.
@param (string) description: optional text description for the VM.
@param (string) userdata: additional paramters to pass to cloud-init facility of the guest OS.
@param (bool) start_on_create: set to False if you want the VM to be provisioned in HALTED state.
@ -1447,8 +1417,8 @@ class DecortController(object):
'chipset': chipset,
'withoutBootDisk': not boot_disk,
}
if annotation:
api_params['decs'] = annotation
if description:
api_params['desc'] = description
if not image_id:
api_url = '/restmachine/cloudapi/kvmx86/createBlank'
@ -1456,7 +1426,12 @@ class DecortController(object):
api_url = '/restmachine/cloudapi/kvmx86/create'
api_params['imageId'] = image_id
api_params['start'] = start_on_create
api_params['cpupin'] = cpu_pin
api_params['hpBacked'] = hp_backed
api_params['numaAffinity'] = numa_affinity
if custom_fields is not None:
api_params['customFields'] = json.dumps(custom_fields)
if userdata:
api_params['userdata'] = json.dumps(userdata) # we need to pass a string object as "userdata"
@ -1925,28 +1900,104 @@ class DecortController(object):
@waypoint
@checkmode
def compute_update(self, compute_id: int, name: Optional[str] = None):
def compute_update(
self,
compute_id: int,
name: Optional[str] = None,
chipset: Optional[str] = None,
cpu_pin: Optional[bool] = None,
hp_backed: Optional[bool] = None,
numa_affinity: Optional[str] = None,
description: Optional[str] = None,
):
OBJ = 'compute'
api_response = self.decort_api_call(
self.decort_api_call(
arg_req_function=requests.post,
arg_api_name='/restmachine/cloudapi/compute/update',
arg_params={
'computeId': compute_id,
'name': name,
'chipset': chipset,
'cpupin': cpu_pin,
'hpBacked': hp_backed,
'numaAffinity': numa_affinity,
'desc': description,
},
)
self.set_changed()
if name is not None:
self.message(
self.MESSAGES.obj_renamed(
obj=OBJ,
id=compute_id,
new_name=name,
params_to_check = {
'name': name,
'chipset': chipset,
'cpu_pin': cpu_pin,
'hp_backed': hp_backed,
'numa_affinity': numa_affinity,
'description': description,
}
for param, value in params_to_check.items():
if value is not None:
self.message(
self.MESSAGES.obj_smth_changed(
obj=OBJ,
id=compute_id,
smth=param,
new_value=value,
)
)
)
@waypoint
@checkmode
def compute_set_custom_fields(
self,
compute_id: int,
custom_fields: dict,
):
self.decort_api_call(
arg_req_function=requests.post,
arg_api_name='/restmachine/cloudapi/compute/setCustomFields',
arg_params={
'computeId': compute_id,
'customFields': json.dumps(custom_fields),
},
)
self.set_changed()
@waypoint
@checkmode
def compute_disable_custom_fields(
self,
compute_id: int,
):
self.decort_api_call(
arg_req_function=requests.post,
arg_api_name='/restmachine/cloudapi/compute/deleteCustomFields',
arg_params={
'computeId': compute_id,
},
)
self.set_changed()
@waypoint
def compute_get_custom_fields(self, compute_id: int) -> Optional[dict]:
api_resp = self.decort_api_call(
arg_req_function=requests.post,
arg_api_name='/restmachine/cloudapi/compute/getCustomFields',
arg_params={
'computeId': compute_id
},
not_fail_codes=[404],
)
if api_resp.status_code == 404:
error_msg = api_resp.json()['error']
if 'customFields' in error_msg:
return None
else:
self.message(error_msg)
self.exit(fail=True)
return api_resp.json()
###################################
# OS image manipulation methods
@ -4928,21 +4979,44 @@ class DecortController(object):
self.result['changed'] = True
return
def k8s_check_new_worker_groups_params(
self,
worker_groups: list[dict[str, Any]]
def k8s_check_worker_group_for_recreate(
self,
target_wg: dict[str, Any],
existing_wg: dict[str, Any],
):
for param in [
'cpu', 'ram', 'disk', 'taints', 'labels', 'annotations',
]:
# Ignore service label when comparing labels
if param == 'labels':
if target_wg[param] is not None:
filtered_existing_wg_labels = [
label for label in existing_wg[param]
if 'workersGroupName' not in label
]
if (
sorted(filtered_existing_wg_labels)
!= sorted(target_wg[param])
):
target_wg['need_to_recreate'] = True
elif (
target_wg[param] is not None
and existing_wg[param] != target_wg[param]
):
target_wg['need_to_recreate'] = True
if (
target_wg['ci_user_data'] is not None
and not target_wg.get('need_to_recreate')
):
check_error = False
for new_wg_params in worker_groups:
for new_wg_required_param in ['num', 'cpu', 'ram', 'disk']:
if new_wg_params[new_wg_required_param] is None:
self.message(
f'Parameter "{new_wg_required_param}" is required'
f' for new worker group "{new_wg_params["name"]}"'
)
check_error = True
if check_error:
self.exit(fail=True)
_, vm_info, _ = self._compute_get_by_id(
comp_id=existing_wg['detailedInfo'][0]['id'],
)
if (
vm_info.get('userdata', {})
!= target_wg['ci_user_data']
):
target_wg['need_to_recreate'] = True
def k8s_provision(self, k8s_name,
k8ci_id,
@ -4966,41 +5040,25 @@ class DecortController(object):
kubeproxy_conf,
join_conf,
oidc_cert,
annotation,
description,
extnet_only,
master_chipset: Literal['Q35', 'i440fx'] = 'i440fx',
):
self.result['waypoints'] = "{} -> {}".format(self.result['waypoints'], "k8s_provision")
self.k8s_check_new_worker_groups_params(worker_groups=[default_worker])
if self.amodule.check_mode:
self.result['failed'] = False
self.result['msg'] = ("k8s_provision() in check mode. Provision k8s '{}' in RG ID {} "
"was requested.").format(k8s_name, rg_id)
return 0
def_wg_name = default_worker['name']
def_wg_count = default_worker['num']
def_wg_cpu = default_worker['cpu']
def_wg_ram = default_worker['ram']
def_wg_disk = default_worker['disk']
def_wg_sepid = default_worker['sep_id']
def_wg_pool = default_worker['pool']
def_wg_ud = (
json.dumps(default_worker['ci_user_data'])
if default_worker['ci_user_data'] else None
)
def_wg_lab = default_worker['labels']
def_wg_taints = default_worker['taints']
def_wg_ann = default_worker['annotations']
api_url = "/restmachine/cloudapi/k8s/create"
api_params = dict(name=k8s_name,
rgId=rg_id,
k8ciId=k8ci_id,
vinsId=vins_id,
workerGroupName=def_wg_name,
workerGroupName=default_worker['name'],
networkPlugin=plugin,
masterNum=master_count,
masterCpu=master_cpu,
@ -5008,15 +5066,15 @@ class DecortController(object):
masterDisk=master_disk,
masterSepId=master_sepid,
masterSepPool=master_pool,
workerNum=def_wg_count,
workerCpu=def_wg_cpu,
workerRam=def_wg_ram,
workerDisk=def_wg_disk,
workerSepId=def_wg_sepid,
workerSepPool=def_wg_pool,
labels=def_wg_lab,
taints=def_wg_taints,
annotations=def_wg_ann,
workerNum=default_worker['num'],
workerCpu=default_worker['cpu'],
workerRam=default_worker['ram'],
workerDisk=default_worker['disk'],
workerSepId=default_worker['sep_id'],
workerSepPool=default_worker['pool'],
labels=default_worker['labels'],
taints=default_worker['taints'],
annotations=default_worker['annotations'],
extnetId=extnet_id,
withLB=with_lb,
highlyAvailableLB=ha_lb,
@ -5026,9 +5084,10 @@ class DecortController(object):
kubeletConfiguration=json.dumps(kublet_conf) if kublet_conf else None,
kubeProxyConfiguration=json.dumps(kubeproxy_conf)if kubeproxy_conf else None,
joinConfiguration=json.dumps(join_conf)if join_conf else None,
desc=annotation,
userData=def_wg_ud,
desc=description,
userData=json.dumps(default_worker['ci_user_data']),
extnetOnly=extnet_only,
chipset=master_chipset,
)
upload_files = None
@ -5104,23 +5163,64 @@ class DecortController(object):
for rec in arg_modwg:
if rec['name'] not in wg_inner:
wg_add_list.append(rec)
self.k8s_check_new_worker_groups_params(worker_groups=wg_add_list)
for rec_inn in arg_k8swg['k8sGroups']['workers']:
for rec_out in arg_modwg:
if rec_inn['name'] == rec_out['name']:
if (
rec_out['num'] is not None
and rec_inn['num'] != rec_out['num']
):
count = rec_inn['num']-rec_out['num']
cmp_list = []
if count > 0:
for cmp in rec_inn['detailedInfo'][-count:]:
cmp_list.append(cmp['id'])
wg_moddel_list.append({rec_inn['id']:cmp_list})
if count < 0:
wg_modadd_list.append({rec_inn['id']:abs(count)})
for wg in arg_k8swg['k8sGroups']['workers']:
for target_wg in arg_modwg:
if wg['name'] == target_wg['name']:
self.k8s_check_worker_group_for_recreate(
target_wg=target_wg,
existing_wg=wg,
)
if target_wg.get('need_to_recreate'):
wg_del_list.append(wg['id'])
wg_to_create = deepcopy(target_wg)
for param, value in wg_to_create.items():
if param == 'ci_user_data' and value is None:
_, vm_info, _ = self._compute_get_by_id(
comp_id=wg['detailedInfo'][0]['id'],
)
wg_to_create[param] = vm_info.get(
'userdata', {}
)
elif value is None:
wg_to_create[param] = wg.get(param)
wg_add_list.append(wg_to_create)
continue
w_ids = {w['id'] for w in wg['detailedInfo']}
bad_w_ids = set()
new_chipset = target_wg['chipset']
if new_chipset is not None:
for w_id in w_ids:
_, vm_info, _ = self._compute_get_by_id(
comp_id=w_id,
)
if vm_info['chipset'] != new_chipset:
bad_w_ids.add(w_id)
wg_num = wg['num']
target_num = target_wg['num']
if target_num is not None:
new_w_count = target_num - wg_num + len(bad_w_ids)
if new_w_count > 0:
if new_chipset is None:
new_chipset = self.wg_default_params['chipset']
wg_modadd_list.append({
'wg_id': wg['id'],
'computes_num': new_w_count,
'chipset': new_chipset,
})
elif new_w_count:
valid_w_ids = w_ids.difference(bad_w_ids)
for _ in range(abs(new_w_count)):
bad_w_ids.add(valid_w_ids.pop())
if bad_w_ids:
wg_moddel_list.append({
'wg_id': wg['id'],
'compute_ids': bad_w_ids,
})
if wg_del_list:
for wgid in wg_del_list:
@ -5129,22 +5229,24 @@ class DecortController(object):
self.result['changed'] = True
if wg_add_list:
for wg in wg_add_list:
wg_to_create = deepcopy(wg)
for param, default_value in self.wg_default_params.items():
if wg_to_create[param] is None:
wg_to_create[param] = default_value
api_params = {
'k8sId': self.k8s_id,
'name': wg['name'],
'workerNum': wg['num'],
'workerCpu': wg['cpu'],
'workerRam': wg['ram'],
'workerDisk': wg['disk'],
'workerSepId': wg['sep_id'],
'workerSepPool': wg['pool'],
'labels': wg['labels'],
'taints': wg['taints'],
'annotations': wg['annotations'],
'userData': (
json.dumps(wg['ci_user_data'])
if wg['ci_user_data'] else None
),
'name': wg_to_create['name'],
'workerNum': wg_to_create['num'],
'workerCpu': wg_to_create['cpu'],
'workerRam': wg_to_create['ram'],
'workerDisk': wg_to_create['disk'],
'workerSepId': wg_to_create['sep_id'],
'workerSepPool': wg_to_create['pool'],
'labels': wg_to_create['labels'],
'taints': wg_to_create['taints'],
'annotations': wg_to_create['annotations'],
'userData': json.dumps(wg_to_create['ci_user_data']),
'chipset': wg_to_create['chipset'],
}
wg_add_response = self.decort_api_call(
arg_req_function=requests.post,
@ -5160,7 +5262,7 @@ class DecortController(object):
# average time to add a single worker group * reserve
wg_add_avg_time = 210 * 2
wg_add_timeout = wg_add_avg_time * wg['num']
wg_add_timeout = wg_add_avg_time * wg_to_create['num']
task_schedule_timeout = 600
sleep_interval = 5
while True:
@ -5174,9 +5276,9 @@ class DecortController(object):
case 'SCHEDULED':
if task_schedule_timeout <= 0:
self.message(
f'Time to schedule task'
f'to add worker group {wg["name"]}'
f'has been exceeded.'
f'Time to schedule task to add worker '
f'group {wg_to_create["name"]} has been '
f'exceeded.'
f'\nTask details: {task_link}'
)
self.exit(fail=True)
@ -5185,38 +5287,54 @@ class DecortController(object):
case 'PROCESSING':
if wg_add_timeout <= 0:
self.message(
f'Time to add worker group {wg["name"]} '
f'has been exceeded.'
f'\nTask details: {task_link}'
f'Time to add worker group '
f'{wg_to_create["name"]} has been '
f'exceeded.\nTask details: {task_link}'
)
self.exit(fail=True)
time.sleep(sleep_interval)
wg_add_timeout -= sleep_interval
case 'ERROR':
self.result['msg'] = (
f'Adding worker group {wg["name"]} failed: '
f'{response_data["error"]}.'
f'Adding worker group {wg_to_create["name"]} '
f'failed: {response_data["error"]}.'
f'\nTask details: {task_link}'
)
self.exit(fail=True)
case 'OK':
self.message(
f'Worker group {wg["name"]} created successful'
f'Worker group {wg_to_create["name"]} '
f'created successful'
)
break
if wg_modadd_list:
for wg in wg_modadd_list:
for key in wg:
api_params = dict(k8sId=self.k8s_id,workersGroupId=key,num=wg[key])
api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/k8s/workerAdd", api_params)
self.result['changed'] = True
api_params = {
'k8sId': self.k8s_id,
'workersGroupId': wg['wg_id'],
'num': wg['computes_num'],
'chipset': wg['chipset'],
}
self.decort_api_call(
arg_req_function=requests.post,
arg_api_name='/restmachine/cloudapi/k8s/workerAdd',
arg_params=api_params,
)
self.result['changed'] = True
if wg_moddel_list:
for wg in wg_moddel_list:
for key in wg:
for cmpid in wg[key]:
api_params = dict(k8sId=self.k8s_id,workersGroupId=key,workerId=cmpid)
api_resp = self.decort_api_call(requests.post, "/restmachine/cloudapi/k8s/deleteWorkerFromGroup", api_params)
self.result['changed'] = True
for compute_id in wg['compute_ids']:
api_params = {
'k8sId': self.k8s_id,
'workersGroupId': wg['wg_id'],
'workerId': compute_id,
}
self.decort_api_call(
arg_req_function=requests.post,
arg_api_name='/restmachine/cloudapi/k8s/deleteWorkerFromGroup',
arg_params=api_params,
)
self.result['changed'] = True
self.result['failed'] = False
return
@ -5688,7 +5806,7 @@ class DecortController(object):
self.amodule.fail_json(**self.result)
return 0, None
def lb_provision(self,lb_name,rg_id,vins_id,ext_net_id,ha_status,annotation,start=True):
def lb_provision(self,lb_name,rg_id,vins_id,ext_net_id,ha_status,description,start=True):
"""Provision LB according to the specified arguments.
If critical error occurs the embedded call to API function will abort further execution of
the script and relay error to Ansible.
@ -5717,7 +5835,7 @@ class DecortController(object):
vinsId=vins_id,
highlyAvailable=ha_status,
start=start,
desc=annotation
desc=description
)
api_resp = self.decort_api_call(requests.post, api_url, api_params)
# On success the above call will return here. On error it will abort execution by calling fail_json.

@ -0,0 +1,23 @@
1. [Введение](./введение.md)
- [Введение](./введение.md#введение)
- [Системные требования](./введение.md#системные-требования)
- [Подготовка к работе](./введение.md#подготовка-к-работе)
- [Авторизация](./введение.md#авторизация)
- [Общие параметры модулей для авторизации](./введение.md#общие-параметры-модулей-для-авторизации)
- [Пример авторизации с помощью app_id и app_secret](./введение.md#пример-авторизации-с-помощью-app_id-и-app_secret)
- [Пример авторизации с помощью JSON Web Token](./введение.md#пример-авторизации-с-помощью-json-web-token)
1. Ansible модули DECORT:
- [Модуль decort_kvmvm](./модуль-decort_kvmvm.md) - управление виртуальными машинами
- [Модуль decort_osimage](./модуль-decort_osimage.md) - управление образами
- [Модуль decort_disk](./модуль-decort_disk.md) - управление дисками
- [Модуль decort_pfw](./модуль-decort_pfw.md) - управление правилами переадресации портов
- [Модуль decort_rg](./модуль-decort_rg.md) - управление ресурсными группами
- [Модуль decort_vins](./модуль-decort_vins.md) - управление внутренними сетями
- [Модуль decort_jwt](./модуль-decort_jwt.md) - получение авторизационного токена
- [Модуль decort_bservice](./модуль-decort_bservice.md) - управление базовыми службами
- [Модуль decort_group](./модуль-decort_group.md)- управление группами базовой службы
- [Модуль decort_k8s](./модуль-decort_k8s.md) - управление кластерами Kubernetes
- [Модуль decort_lb](./модуль-decort_lb.md) - управление балансировщиками нагрузки
- [Модуль decort_account_info](./модуль-decort_account_info.md) - получение информации об аккаунте
- [Модуль decort_account](./модуль-decort_account.md) - управление аккаунтами
- [Модуль decort_user_info](./модуль-decort_user_info.md) - получение информации о пользователе

@ -0,0 +1,182 @@
# Модули Ansible для управления облачными ресурсами в платформе DECORT
## Введение
Настоящая документация содержит руководство пользователя по библиотеке модулей decort для Ansible. С помощью этих модулей Вы сможете управлять созданием и конфигурированием облачных ресурсов в платформе DECORT (Digital Energy Cloud Orchestration Technology).
По каждому модулю есть своя документация, в которой вы можете найти список доступных действий, подробную информацию о входных параметрах и возвращаемых данных, а также примеры использования.
## Системные требования
Убедитесь, что Ваша система соответствует требованиям для работы модуля DECORT.
Системные требования для работы модуля:
- Ansible 2.16.5 or higher
- Python 3.10.12 or higher
- PyJWT 1.7.1 Python module or higher
- requests Python module
- netaddr Python module
- DECORT cloud platform version 4.1.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>
Идентификатор приложения, использующийся для подключения к контроллеру
облачной платформы DECORT в режиме <code>authenticator: oauth2</code>.
Данный параметр является обязательным для указанного режима. Если
параметр не задан в playbook, модуль будет использовать значение
переменной окружения <code>DECORT_APP_ID</code>.
</td>
</tr>
<tr>
<td colspan="6">
app_secret
</td>
<td>
(str)
</td>
<td>
Секретный ключ приложения, который используется для подключения к
контроллеру облачной платформы DECORT в режиме
<code>authenticator: oauth2</code>. Данный параметр является
обязательным для указанного режима. Так как он содержит секретную
информацию, то его не рекомендуется задавать непосредственно в
playbook. Если параметр не задан в playbook, то модуль будет
использовать значение переменной окружения
<code>DECORT_APP_SECRET</code>.
</td>
</tr>
<tr>
<td colspan="6">
authenticator
</td>
<td>
(str)
<br>Значения:
<br/><code>oauth2</code>
<br/><code>jwt</code>
</td>
<td>
Режим аутентификации при подключении к контроллеру облачной платформы
DECORT. Обязательный параметр.
</td>
</tr>
<tr>
<td colspan="6">
controller_url
</td>
<td>
(str)
</td>
<td>
URL контроллера, соответствующего экземпляру облачной платформы
DECORT. Данный параметр является обязательным.
</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: oauth2</code>. Данный параметр является
обязательным для указанного режима. Если параметр не задан в
playbook, модуль будет использовать значение переменной
окружения <code>DECORT_OAUTH2_URL</code>.
</td>
</tr>
<tr>
<td colspan="6">
verify_ssl
</td>
<td>
(bool)
<br>Default: <code>true</code>
</td>
<td>
Позволяет отключить проверку SSL сертификатов при выполнении API
вызовов в адрес контроллера облачной инфраструктуры, например,
при работе с изолированной облачной инфраструктурой, использующей
самоподписанные сертификаты. Применяйте данный параметр с
осторожностью, предпочтительно в защищенных средах.
</td>
</tr>
</table>
### Пример авторизации с помощью app_id и app_secret
```
- name: Example
hosts: localhost
tasks:
- name: Auth with app_id and app_secret
decort_module_name:
# Специфичные для модулей параметры упущены
# Пример демонстрирует только параметры для авторизации
app_id: "{{ app_id }}"
app_secret: "{{ app_secret }}"
authenticator: oauth2
controller_url: "{{ controller_url }}"
oauth2_url: "{{ oauth2_url }}"
```
### Пример авторизации с помощью JSON Web Token
```
- name: Example
hosts: localhost
tasks:
- name: Auth with JWT
decort_module_name:
# Специфичные для модулей параметры упущены
# Пример демонстрирует только параметры для авторизации
authenticator: jwt
controller_url: "{{ controller_url }}"
jwt: "{{ jwt }}"
```

@ -0,0 +1,992 @@
# Модуль decort_account
## Обзор модуля
Модуль **decort_account** предназначен для выполнения следующих действий над аккаунтом:
- **удалить в корзину** (см. [параметр state](#state) и [примеры](#в-корзину))
- **удалить безвозвратно** (см. [параметр state](#state) и [примеры](#безвозвратно))
- **восстановить из корзины** (см. [параметр state](#state) и [примеры](#восстановить-из-корзины))
- **выключить/включить** (см. [параметр state](#state) и [примеры](#выключитьвключить))
- **изменить права доступа** (см. [параметр acl](#acl) и [примеры](#изменить-права-доступа))
- **изменить имя** (см. [параметр name](#name) и [примеры](#переименовать))
- **изменить квоты** (см. [параметр quotas](#quotas) и [примеры](#изменить-квоты))
- **выключить/включить отправку уведомлений о предоставлении доступа к ресурсам** (см. [параметр access_emails](#access_emails) и [примеры](#выключитьвключить-отправку-уведомлений-о-предоставлении-доступа-к-ресурсам))
- **изменить доступные пулы СХД** (см. [параметр sep_pools](#sep_pools) и [примеры](#изменить-доступные-пулы-схд))
## Параметры модуля
Ниже приведен список параметров для модуля **decort_account** (за исключением [общих параметров авторизации](./введение.md#общие-параметры-модулей-для-авторизации)):
<table>
<tr>
<th colspan="6">Параметр</th>
<th>Тип</th>
<th>Описание</th>
</tr>
<tr>
<td colspan="6">
<a name="access_emails">
access_emails
</a>
</td>
<td>
(bool)
</td>
<td>
Выключение/включение отправки пользователям на эл. почту уведомлений о предоставлении доступа к ресурсам.
</td>
</tr>
<tr>
<td colspan="6">
<a name="acl">
acl
</a>
</td>
<td>
(dict)
</td>
<td>
Целевые права доступа.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
mode
</td>
<td>
(str)
<br>Значения:
<br><code>match</code>
<br><code>revoke</code>
<br><code>update</code>
<br>Default: <code>update</code>
</td>
<td>
Режим изменения прав доступа для указанных пользователей.
<br><code>match</code> - привести в соответствие для указанных
пользователей, удалить предоставленные для других.
<br><code>revoke</code> - отозвать для указанных пользователей,
если предоставлены.
<br><code>update</code> - привести в соответствие для указанных
пользователей, оставить без изменения предоставленные для
других.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
users
</td>
<td>
(list)
</td>
<td>
Список словарей, описывающих права доступа пользователей.
<br>Обязательный параметр.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td colspan="4">
rights
</td>
<td>
(str)
<br>Значения:
<br><code>R</code>
<br><code>RCX</code>
<br><code>ARCXDU</code>
<br>Default: <code>R</code>
</td>
<td>
Права доступа.
<br>При <code>mode: revoke</code> не используется.
<br>При <code>mode: match</code> и <code>mode: update</code>
права <code>ARCXDU</code> считаются соответствующими
правам <code>CXDRAU</code>.
</td>
</tr>
<tr>
<td></td>
<td></td>
<td colspan="4">
id
</td>
<td>
(str)
</td>
<td>
Идентификатор пользователя.
<br>Обязательный параметр.
</td>
</tr>
<tr>
<td colspan="6">
id
</td>
<td>
(int)
</td>
<td>
Идентификатор целевого аккаунта.
<br>Обязательный параметр, если не задан параметр
<code>name</code>.
</td>
</tr>
<tr>
<td colspan="6">
<a name="name">
name
</a>
</td>
<td>
(str)
</td>
<td>
Имя целевого аккаунта.
<br>Может быть альтернативой параметру <code>id</code>,
за исключением случая, когда необходимо получить
информацию о безвозвратно удалённом объекте.
<br>Если задан совместно с параметром <code>id</code>,
то используется для переименования (целевое имя).
</td>
</tr>
<tr>
<td colspan="6">
<a name="quotas">
quotas
</a>
</td>
<td>
(dict)
</td>
<td>
Целевые квоты.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
cpu
</td>
<td>
(int)
</td>
<td>
Количество виртуальных процессоров.
<br><code>-1</code> - удалить квоту.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
disks_size
</td>
<td>
(int)
</td>
<td>
Объём дисков в ГБ.
<br><code>-1</code> - удалить квоту.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
ext_traffic
</td>
<td>
(int)
</td>
<td>
Объём трафика внешних сетей.
<br><code>-1</code> - удалить квоту.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
gpu
</td>
<td>
(int)
</td>
<td>
Количество графических процессоров.
<br><code>-1</code> - удалить квоту.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
public_ip
</td>
<td>
(int)
</td>
<td>
Количество внешних IP-адресов.
<br><code>-1</code> - удалить квоту.
</td>
</tr>
</tr>
<tr>
<td></td>
<td colspan="5">
ram
</td>
<td>
(int)
</td>
<td>
Объём оперативной памяти в МБ.
<br><code>-1</code> - удалить квоту.
</td>
</tr>
<tr>
<td colspan="6">
<a name="sep_pools">
sep_pools
</a>
</td>
<td>
(list)
</td>
<td>
Список словарей, описывающих доступные пулы СХД.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
sep_id
</td>
<td>
(int)
</td>
<td>
Идентификатор системы хранения данных.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
pool_names
</td>
<td>
(list)
</td>
<td>
Список названий пулов системы хранения данных.
</td>
</tr>
<tr>
<td colspan="6">
<a name="state">
state
</a>
</td>
<td>
(str)
<br>Значения:
<br><code>absent</code>
<br><code>absent_permanently</code>
<br><code>confirmed</code>
<br><code>disabled</code>
<br><code>present</code>
<br>Default: <code>present</code>
</td>
<td>
Целевое состояние.
<br><code>absent</code> - удалён в корзину, безвозвратно удалён
или не существует. Если существует и не удалён, то будет удалён
в корзину.
<br><code>absent_permanently</code> - безвозвратно удалён или
не существует. Если существует и не удалён или удалён в корзину,
то будет безвозвратно удалён.
<br> При значениях <code>absent</code> и <code>absent_permanently</code>
использование других параметров модуля, вызывающих изменение объекта,
не допускается.
<br><code>confirmed</code> - включён. Если выключен, то будет включён.
Если удалён в корзину, то будет восстановлен из корзины.
<br><code>disabled</code> - выключен. Если включён, то будет выключен.
Если удалён в корзину, то будет восстановлен из корзины и выключен.
<br><code>present</code> - существует и не удалён. Если удалён в
корзину, то будет восстановлен из корзины.
</td>
</tr>
</table>
## Возвращаемые значения
Модуль **decort_account** возвращает информацию об аккаунте в виде словаря `facts` со следующими ключами:
<table>
<tr>
<th colspan="6">
Ключ
</th>
<th>
Тип
<br>данных
</th>
<th>
Описание
</th>
</tr>
<tr>
<td colspan="6">
acl
</td>
<td>
list
</td>
<td>
Список словарей, описывающих доступы пользователей.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
canBeDeleted
</td>
<td>
bool
</td>
<td>
Может ли быть удалён.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
right
</td>
<td>
str
</td>
<td>
Права.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
status
</td>
<td>
str
</td>
<td>
Статус.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
type
</td>
<td>
str
</td>
<td>
Тип.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
userGroupId
</td>
<td>
str
</td>
<td>
Идентификатор пользователя или группы пользователей.
</td>
</tr>
<tr>
<td colspan="6">
company
</td>
<td>
str
</td>
<td>
Название компании.
</td>
</tr>
<tr>
<td colspan="6">
companyurl
</td>
<td>
str
</td>
<td>
URL компании.
</td>
</tr>
<tr>
<td colspan="6">
computeFeatures
</td>
<td>
list
</td>
<td>
Список дополнительных возможностей гипервизора, доступных ВМ.
</td>
</tr>
<tr>
<td colspan="6">
computes_amount
</td>
<td>
dict
</td>
<td>
Количество ВМ по состоянию.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
started
</td>
<td>
int
</td>
<td>
Количество запущенных ВМ.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
stopped
</td>
<td>
int
</td>
<td>
Количество остановленных ВМ.
</td>
</tr>
<tr>
<td colspan="6">
cpu_allocation_parameter
</td>
<td>
str
</td>
<td>
Режим выделения ЦП.
</td>
</tr>
<tr>
<td colspan="6">
cpu_allocation_ratio
</td>
<td>
str
</td>
<td>
Коэффициент для режима выделения ЦП.
</td>
</tr>
<tr>
<td colspan="6">
createdBy
</td>
<td>
str
</td>
<td>
Идентификатор пользователя, который создал.
</td>
</tr>
<tr>
<td colspan="6">
createdTime
</td>
<td>
int
</td>
<td>
Unix-время создания.
</td>
</tr>
<tr>
<td colspan="6">
createdTime_readable
</td>
<td>
str
</td>
<td>
Дата и время создания.
</td>
</tr>
<tr>
<td colspan="6">
deactivationTime
</td>
<td>
int
</td>
<td>
Unix-время выключения.
</td>
</tr>
<tr>
<td colspan="6">
deactivationTime_readable
</td>
<td>
str
</td>
<td>
Дата и время выключения.
</td>
</tr>
<tr>
<td colspan="6">
deletedBy
</td>
<td>
str
</td>
<td>
Идентификатор пользователя, который удалил.
</td>
</tr>
<tr>
<td colspan="6">
deletedTime
</td>
<td>
int
</td>
<td>
Unix-время удаления.
</td>
</tr>
<tr>
<td colspan="6">
deletedTime_readable
</td>
<td>
str
</td>
<td>
Дата и время удаления.
</td>
</tr>
<tr>
<td colspan="6">
displayname
</td>
<td>
str
</td>
<td>
Отображаемое имя.
</td>
</tr>
<tr>
<td colspan="6">
id
</td>
<td>
int
</td>
<td>
Идентификатор.
</td>
</tr>
<tr>
<td colspan="6">
name
</td>
<td>
str
</td>
<td>
Имя.
</td>
</tr>
<tr>
<td colspan="6">
resourceLimits
</td>
<td>
dict
</td>
<td>
Квоты на ресурсы.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
CU_C
</td>
<td>
int
</td>
<td>
Количество виртуальных процессоров.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
CU_D
</td>
<td>
int
</td>
<td>
Объём диска в ГБ.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
CU_DM
</td>
<td>
int
</td>
<td>
Объём дисков в ГБ.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
CU_I
</td>
<td>
int
</td>
<td>
Количество внешних IP-адресов.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
CU_M
</td>
<td>
float
</td>
<td>
Объём оперативной памяти в МБ.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
CU_NP
</td>
<td>
int
</td>
<td>
Объём трафика внешних сетей.
</td>
</tr>
<tr>
<td></td>
<td colspan="5">
gpu_units
</td>
<td>
int
</td>
<td>
Количество графических процессоров.
</td>
</tr>
<tr>
<td colspan="6">
sendAccessEmails
</td>
<td>
bool
</td>
<td>
Отправка пользователям на эл. почту уведомлений о предоставлении доступа.
</td>
</tr>
<tr>
<td colspan="6">
status
</td>
<td>
str
</td>
<td>
Статус.
</td>
</tr>
<tr>
<td colspan="6">
uniqPools
</td>
<td>
list
</td>
<td>
Список доступных пулов СХД.
</td>
</tr>
<tr>
<td colspan="6">
updatedTime
</td>
<td>
int
</td>
<td>
Unix-время обновления.
</td>
</tr>
<tr>
<td colspan="6">
updatedTime_readable
</td>
<td>
str
</td>
<td>
Дата и время обновления.
</td>
</tr>
<tr>
<td colspan="6">
vins
</td>
<td>
list
</td>
<td>
Список идентификаторов внутренних сетей на уровне аккаунта.
</td>
</tr>
<tr>
<td colspan="6">
vinses_amount
</td>
<td>
int
</td>
<td>
Количество внутренних сетей.
</td>
</tr>
</table>
## Примеры использования
### Удалить
#### В корзину
```
- name: Example
hosts: localhost
tasks:
- name: Delete account
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
state: absent
```
#### Безвозвратно
```
- name: Example
hosts: localhost
tasks:
- name: Delete account
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
state: absent_permanently
```
### Восстановить из корзины
```
- name: Example
hosts: localhost
tasks:
- name: Restore account from recycle bin
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
state: present
```
### Выключить/включить
#### Выключить
```
- name: Example
hosts: localhost
tasks:
- name: Disable account
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
state: disabled
```
#### Включить
```
- name: Example
hosts: localhost
tasks:
- name: Enable account
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
state: confirmed
```
### Изменить права доступа
#### Отозвать
```
- name: Example
hosts: localhost
tasks:
- name: Revoke user access rights
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
acl:
mode: revoke
users:
- id: "{{ user1_id }}"
- id: "{{ user2_id }}"
```
#### Обновить
```
- name: Example
hosts: localhost
tasks:
- name: Update user access rights
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
acl:
mode: update
users:
- id: "{{ user1_id }}"
rights: R
- id: "{{ user2_id }}"
rights: RCX
```
#### Привести в соответствие
```
- name: Example
hosts: localhost
tasks:
- name: Match user access rights
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
acl:
mode: match
users:
- id: "{{ user1_id }}"
rights: ARCXDU
- id: "{{ user2_id }}"
rights: RCX
```
### Переименовать
```
- name: Example
hosts: localhost
tasks:
- name: Rename account
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
name: "{{ account_new_name }}"
```
### Изменить квоты
#### На объём дисков
```
- name: Example
hosts: localhost
tasks:
- name: Update account quota of disks size
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
quotas:
disks_size: 500
```
#### На количество внешних IP-адресов
```
- name: Example
hosts: localhost
tasks:
- name: Update account quota of public IP amount
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
quotas:
public_ip: 10
```
### Выключить/включить отправку уведомлений о предоставлении доступа к ресурсам
#### Выключить
```
- name: Example
hosts: localhost
tasks:
- name: Disable sending access emails
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
access_emails: false
```
#### Включить
```
- name: Example
hosts: localhost
tasks:
- name: Enable sending access emails
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
access_emails: true
```
### Изменить доступные пулы СХД
```
- name: Example
hosts: localhost
tasks:
- name: Change available sep pools
decort_account:
# Параметры для авторизации упущены
id: "{{ account_id }}"
sep_pools:
- sep_id: 1
pool_names:
- pool1
```

File diff suppressed because it is too large Load Diff

@ -0,0 +1,92 @@
# Модуль decort_bservice
## Обзор модуля decort_bservice
Базовая служба (Basic Service) это несколько групп виртуальных серверов (compute), создаваемых и управляемых как единое целое.
Все compute(s) в группе имеют одни и те же характеристики (cpu/ram/boot disk size/OS image + сетевые подключения). Для разных групп эти характеристики могут быть разными.
Группы в составе Basic Service могут иметь отношения parent-child с другими группами. Наличие таких отношений определяет последовательность запуска групп ("сначала parents").
На основе ресурсов, предоставляемых и управляемых через Basic Service, могут создаваться другие сервисы.
`Для взаимодействия с группами виртуальных серверов используется модуль decort_group.`
Модуль decort_bservice предназначен для управления базовыми службами, в которых находятся группы виртуальных серверов.
Данный модуль позволяет:
- Создавать Basic Service
- Удалять Basic Service (безвозвратно).
- Включать/выключать Basic Service
- Запускать Basic Service
- Запрашивать информацию о Basic Service.
## Параметры модуля decort_bservice
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_bservice. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на Вашем Ansible-сервере, можно получить командой:
`ansible-doc -t module decort_bservice`
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит ресурсная группа. При идентификации базовой службы и ресурсной группы по именам (см. параметры `name` и `rg_name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|account_name | (string) | Имя аккаунта, которому принадлежит ресурсная группа. При идентификации базовой службы и ресурсной группы по именам (см. параметры `name` и `rg_name`) должен быть задан либо идентификатор (см. `account_id`), либо имя аккаунта. Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.|
|app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
| authenticator | Значения:<br/>`oauth2`<br/>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным. |
|controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должна быть создана (или уже существует) данная базовая служба. Данный параметр является обязательным.|
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`<br/>Данный параметр является обязательным для указанного режима.<br/>Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в _playbook_.<br/>Если этот параметр не определен в _playbook_, то модуль будет использовать значение переменной окружения `DECORT_JWT`. |
|oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`.|
|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) | Имя ресурсной группы базовой службы. |
| verify_ssl | (bool)<br/>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
## Возвращаемые значения модуля 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,177 @@
# Модуль decort_disk
## Обзор модуля decort_disk
Модуль decort_disk предназначен для управления дисками и позволяет производить с ними следующие действия:
- создавать
- удалять (в корзину или безвозвратно)
- восстановливать из корзины
- изменять:
- имя
- размер
- лимиты ввода/вывода
- включать/отключать общий доступ
Обратите внимание:
- Загрузочный диск для виртуальной машины создаётся и подключается автоматически в процессе создания этой машины.
- Модуль decort_disk служит для управления дополнительными дисками (т.н. data-дисками);
- Подключение дополнительных дисков, созданных посредством decort_disk, к виртуальным машинам выполняется с помощью модуля управления виртуальными машинами (см. модуль decort_kvmvm).
## Параметры модуля decort_disk
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_disk. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
`ansible-doc -t module decort_disk`
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр `name`) должно быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|account_name | (string) | Имя аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр name) должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| description | (string)<br>Default: `Disk by decort_disk` | Текстовое описание диска. Данный параметр является опциональным и учитывается только при создании диска, а при всех прочих операциях игнорируется.|
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.|
|app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
| authenticator | Значения:<br/>`oauth2`<br/>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным. |
|controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный диск. Данный параметр является обязательным.|
|id | (int) | Уникальный целочисленный идентификатор диска. Соответствующий диск должен существовать (таким образом, с помощью id нельзя создать новый диск, а только управлять уже имеющимися). Если задан данный параметр, то параметры `name`, `account_name` и `account_id` игнорируются.|
| iops | (int)<br>Default: `2000` | Ограничение ввода/вывода диска. Используется при создании диска. |
| force_detach | (bool)<br/>Default: `false` | Задаёт поведение платформы при попытке удалить диск, подключённый к виртуальной машине.<br/>По умолчанию, удаление подключённых дисков не разрешается, и попытка удалить такой диск приведёт к аварийному завершению модуля. Чтобы изменить это поведение, явно установите `force_detach: true`. |
|jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt` Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.|
| limitIO | (dict) | Параметр, позволяющий ограничить скорость ввода/вывода диска как в iops, так и в байтах в секунду. Обратите внимание, что параметры с total не задаются вместе с read/write. Все возможные подпараметры можно увидеть в примерах. |
| name | (string) | Имя диска. Для идентификации диска требуется либо его `name` и информация об аккаунте (`account_id` или `account_name`), которому принадлежит диск, либо его `id`.|
|oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`.|
| permanently | (bool)<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` | Целевое состояние диска. |
| type | (string)<br>Значения:<br>`B`<br>`D`<br>Default: `D` | Тип создаваемого диска. `B` - Boot/загрузочный, `D` - Data/с данными. |
| verify_ssl | (bool)<br/>Default: `false` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
## Возвращаемые значения модуля decort_disk
Модуль decort_disk возвращает информацию о диске в виде словаря facts со следующими ключами:
|Ключ | Тип данных | Описание|
| ------ | ------ | ------ |
| account_id | int | Уникальный целочисленный идентификатор аккаунта, которому принадлежит диск.|
| computes | dict | Словарь, в котором ключ - идентификатор, а значение - имя виртуальной машины, к которой в настоящий момент подключён диск. Если диск не подключён, то возвращается пустой словарь.|
| gid | int | Идентификатор физического кластера (Grid ID), на ресурсах которого создан диск.|
| id | int | Уникальный целочисленный идентификатор данного диска.|
| iotune | dict | Текущие ограничения ввода/вывода диска. |
| name | string | Имя диска. Обратите внимание, что имя диска не является уникальным с точки зрения системы хранения данных, на которой этот диск расположен.|
| pool | string | Имя пула на системе хранения данных, в котором размещаются ресурсы диска.|
|sep_id | int | Идентификатор системы хранения данных (Storage Endpoint), на которой размещаются ресурсы данного диска.|
| size | int | Размер диска в ГБ.|
| state | string | Текущий статус диска. |
## Пример использования модуля decort_disk
В данном примере создаётся диск размером 50ГБ (`size: 50`), с ограничением ввода/вывода в 2000 iops, на ресурсах системы хранения данных под номером 1 (`sep_id: 1`) в пуле "data01".
```
- name: Manage disk
decort_disk:
authenticator: oauth2
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
controller_url: "https://cloud.digitalenergy.online"
name: "DataDisk01"
size: 50
account_name: "MyAccount"
sep_id: 1
iops: 2000
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,105 @@
# Модуль decort_group
## Обзор модуля decort_group
Модуль **decort_group** позволяет производить следующие действия над группами базовой службы:
- создать
- получить информацию
- запустить/остановить
- подключить/отключить сети (для существующей группы только внутренние сети)
- изменить
- имя
- объём загрузочного диска
- количество ВМ
- роль
- количество виртуальных процессоров
- объём ОЗУ
- удалить (безвозвратно)
## Параметры модуля decort_group
Ниже приведен полный список параметров для модуля **decort_group**.
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_id | (int) | Идентификатор аккаунта. При идентификации диска по имени (см. параметр `name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| account_name | (string) | Имя аккаунта. При идентификации диска по имени (см. параметр `name`) должно быть задано либо имя, либо идентификатор аккаунта (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. |
| authenticator | (str)<br>Значения:<br>`oauth2`<br>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. |
| boot_disk | (int) | Обьём загрузочного диска. |
| bservice_id | (int) | Идентификатор базовой службы. Обязательный параметр. |
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT. Данный параметр является обязательным. |
| count | (int) | Количество виртуальных машин. |
| cpu | (int) | Количество виртуальных процессоров. |
| driver | (string)<br>Значения:<br>`KVM_X86`<br>`SVA_KVM_X86`<br>Default: `KVM_X86` | Драйвер. |
| id | (int) | Идентификатор группы. |
| image_id | (int) | Идентификатор образа. |
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt` Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`. |
| name | (str) | Имя группы.<br>Используется для идентификации группы, если не задан параметр `id`, а также для переименования группы, если параметр `id` задан. |
| networks | (list) | Список словарей, описывающих сети, которые должны быть подключены.<br>Ключи словаря:<br>&bull; `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя) или `EXTNET` (внешняя)<br>&bull; `id` (int) (обязательный) - идентификатор сети |
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
| ram | (int) | Объём оперативной памяти. |
| role | (string) | Тег роли. |
| state | (str)<br>Значения:<br>`present`<br>`absent`<br>`started`<br>`stopped`<br>`check`<br>Default: `present` |
| timeoutStart | (int) | Время отсрочки запуска группы после создания в секундах. |
| verify_ssl | (bool)<br>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
## Возвращаемые значения модуля decort_group
Модуль **decort_group** возвращает информацию о диске в виде словаря facts со следующими ключами:
|Ключ | Тип данных | Описание|
| ------ | ------ | ------ |
| account_id | int | Идентификатор аккаунта. |
| Computes | list | Список словарей, содержащих информацию о виртуальных машинах группы.<br>Ключи словаря:<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
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,53 @@
# Вспомогательный модуль для получения авторизационного JWT токена decort_jwt
## Обзор модуля decort_jwt
Модуль **decort_jwt** предназначен для получения авторизационного токена JWT (JSON Web Token). Данный модуль может быть полезен при массовом создании ресурсов (например, виртуальных машин), так как позволяет оптимизировать количество API вызовов, инициируемых в адрес контроллера облачной платформы.
По сути, данный модуль является провайдером информации и не управляет облачными ресурсами (всегда возвращает `changed: False`).
## Параметры модуля decort_jwt
Ниже в алфавитном порядке приведен полный список параметров для модуля **decort_jwt**. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
`ansible-doc -t module decort_jwt`
|Параметр | Тип, допустимые значения | Описание|
| ------ | ------ | ------ |
| app_id | (string) | Идентификатор приложения, использующийся для подключения к авторизационному серверу. Данный параметр является обязательным. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к авторизационному серверу. Данный параметр является обязательным. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. |
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, у которого запрашивается JWT. Данный параметр является обязательным. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
| validity | (int)<br>Default: `3600` | Срок действия JWT в секундах. |
| verify_ssl | (bool)<br>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес авторизационного сервера, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
## Возвращаемые значения модуля decort_jwt
При успешном выполнении модуль **decort_jwt** возвращает JWT-токен, который доступен по ключу `jwt` (str).
## Пример использования модуля decort_jwt
В данном примере сначала запрашивается JWT со сроком действия 1200 сек., а затем этот JWT используется для создания виртуальной машины в режиме авторизации `jwt` (подробнее о данном режиме см. в разделе «Примеры различных режимов авторизации»).
```
- hosts: localhost
tasks:
- name: Obtain JWT with validity of 1200 sec from the OAuth2 provider
decort_jwt:
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
validity: 1200
register: my_token
```
```
- name: Create VM in JWT authorization mode
decort_kvmvm:
authenticator: jwt
jwt: "{{ my_token.jwt }}"
controller_url: "https://cloud.digitalenergy.online"
name: NewVM01
cpu: 2
ram: 4096
<<<дальнейшие детали опущены>>>
```
Обратите внимание, как используется JWT при создании новой ВМ (в предположении, что результат выполнения task для модуля **decort_jwt** был сохранен в переменной my_token):
```
jwt: "{{ my_token.jwt }}"
```

@ -0,0 +1,120 @@
# Модуль decort_k8s
## Обзор модуля decort_k8s
Модуль **decort_k8s** предназначен для выполнения следующих действий над кластерами Kubernetes:
- создать
- получить информацию
- отключить/включить/запустить
- изменить группы Worker-узлов
- удалить (в корзину или безвозвратно)
- восстановить из корзины
## Параметры модуля decort_k8s
Ниже приведен полный список параметров для модуля **decort_k8s**:
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_id | (int) | Идентификатор аккаунта. |
| account_name | (string) | Имя аккаунта. |
| additionalSANs | (list) | Список дополнительных SAN (Subject Alternative Names) для использования в процессе автоматического выписывания сертификата Кластера Kubernetes. Можно использовать IP-адреса и доменные имена.
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. |
| authenticator | (str)<br>Значения:<br/>`oauth2`<br/>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. |
| cluster_conf | (dict) | Словарь с глобальными настройками и конфигурацией для всего кластера. Включает в себя такие настройки, как имя кластера, настройки DNS, методы аутентификации и другие конфигурации всего кластера. |
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT. Данный параметр является обязательным. |
| description | (string)<br>Default: `Created by decort ansible module` | Описание кластера. |
| 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. |
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`. |
| k8ci_id | (int) | Идентификатор конфигурации кластера Kubernetes. |
| kubeproxy_conf | (dict) | Словарь для настройки поведения и настроек Kube-proxy, отвечающего за сетевое проксирование и балансировку нагрузки внутри кластера. Включает в себя такие параметры, как режим прокси, диапазоны IP-адресов кластера и другие конфигурации, специфичные для Kube-proxy. |
| kublet_conf | (dict) | Словарь для настройки поведения и настроек Kubelet, который является агентом основного узла, работающим на каждом узле кластера. Включает в себя такие параметры, как IP-адрес узла, распределение ресурсов, политики вытеснения модулей и другие конфигурации, специфичные для Kubelet. |
| master_chipset | (string)<br>Значения:<br>`Q35`<br>`i440fx` | Эмулируемый чипсет master-узлов. Не применим при изменении существующего кластера. <br>Значение по умолчанию при создании: `i440fx`. |
| master_count | (int)<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`) |
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
| 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` | Целевое состояние кластера. |
| verify_ssl | (bool)<br>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
| 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 кластера.
| 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
| 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
```

@ -0,0 +1,136 @@
# Модуль decort_kvmvm
## Обзор модуля decort_kvmvm
Модуль **decort_kvmvm** предназначен для выполнения следующих действий над виртуальными машинами:
- создать
- с образом
- без образа
- с загрузочным диском
- без загрузочного диска
- получить информацию
- остановить/приостановить/запустить
- подключить/отключить диски с данными
- подключить/отключить сети
- изменить
- объём загрузочного диска в большую сторону
- количество CPU
- объём ОЗУ
- тэги
- affinity метку
- affinity правила
- anti-affinity правила
- описание
- чипсет
- правило NUMA Affinity
- использование CPU Pinning
- использование Huge Pages
- имя
- XML виртуальной машины
- удалить (безвозвратно)
## Параметры модуля decort_kvmvm
Ниже в алфавитном порядке приведен полный список параметров для модуля **decort_kvmvm**. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
`ansible-doc -t module decort_kvmvm`
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| aaff_rule | (list) | Список словарей, описывающих anti-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>Чтобы очистить anti-affinity правила, нужно указать пустой список `[]`. |
| account_id | (int) | Идентификатор аккаунта. Этот параметр является опциональным и используется в сценариях, когда уже существующая ресурсная группа задается комбинацией `account_id` и `rg_name`. Если задан `account_id`, то `account_name` игнорируется.|
| account_name | (string) | Имя аккаунта. Этот параметр является опциональным и используется в сценариях, когда уже существующая ресурсная группа задается комбинацией `account_name` и `rg_name`. Если задан `account_id`, то `account_name` игнорируется. |
| aff_rule | (list) | Список словарей, описывающих affinity правила.<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, нужно указать пустую строку `""`. |
| description | (string) | Опциональное описание виртуальной машины. Этот параметр используется только при создании.|
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_APP_ID`.|
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DCORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
| authenticator | (str)<br>Значения:<br>`oauth2`<br>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. |
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ. |
| chipset | (string)<br>Значения:<br>`Q35`<br>`i440fx` | Эмулируемый чипсет. |
| ci_user_data | (dict) | конфигурация для cloud-init
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данная виртуальная машина. Данный параметр является обязательным. |
| cpu | (int) | Количество виртуальных процессоров, выделяемых виртуальной машине. |
| cpu_pin | (bool) | Запуск виртуальной машины на выделенных процессорах. Чтобы использовать эту функцию, система должна быть предварительно сконфигурирована путем выделения процессоров на физическом узле.<br>Значение по умолчанию при создании: `false`. |
| custom_fields | (dict) | Словарь, управляющий XML виртуальной машины.<br>Ключи словаря:<br>&bull; `disable` (bool) - отключение управления виртуальной машиной через XML. Значение по умолчанию при создании: `true`<br>&bull; `fields` (dict) - поля для управления XML виртуальной машины. |
| 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`. При любых других операциях данные параметры игнорируются. |
| 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`.|
| 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`. |
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
| pool | (str) | Пул СХД, заданной параметром `sep_id`. Если пул не задан, то он будет выбран платформой.
| ram | (int) | Объем оперативной памяти в МБ, выделенной данной ВМ. Параметр является обязательным при создании. Если указать его для уже существующей ВМ, то будет выполнена попытка изменить объем выделенной памяти. |
| rg_id | (int) | Уникальный цифровой идентификатор уже существующей ресурсной группы, в которой будет создана новая или находится уже существующая ВМ. Данный параметр является одним из методов идентификации существующей РГ (альтернативой является задание комбинации `account_name` и `rg_name`).|
| rg_name | (string) | Имя уже существующей ресурсной группы, в которой будет создаа новая или находится уже существующая ВМ. Данный параметр является одним из методов идентификации существующей РГ, когда задается пара `account_name` и `rg_name` (альтернативой является задание `rg_id`). Если заданы и `rg_id`, и `rg_name`, то параметр `rg_name` игнорируется.|
| sep_id | (int) | Идентификатор СХД для загрузочного диска ВМ. Если не задан, то будет использоваться СХД образа.
| ssh_key | (string) | Открытая часть SSH-ключа, который необходимо добавить на создаваемую ВМ для пользователя, заданного параметром `ssh_key_user`. Данный параметр применим только для ОС Linux, используется только при создании и игнорируется при других операциях. |
| ssh_key_user | (string) | Имя пользователя в гостевой ОС (только для Linux), для которого добавляется SSH-ключ, заданный параметром `ssh_key`. Данный параметр является обязательным, если задан `ssh_key`. Используется только при создании и игнорируется при других операциях. |
| state | (str)<br>Значения:<br>`present`<br>`absent`<br>`poweredon`<br>`poweredoff`<br>`halted`<br>`paused`<br>`check`<br>Default: `present` | Целевое состояние ВМ.<br> Значение `halted` - синоним к `poweredoff`. Значения `present` и `poweredon` равнозначны. <br>Значение `check` вызывает модуль в _read-only_ режиме и считывает характеристики существующей ВМ. |
| tag | (dict) | Словарь, пары ключ-значение которого, описывают тэги для ВМ.<br>Чтобы очистить теги, нужно указать пустой словарь `{}`.|
| verify_ssl | (bool)<br>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
## Возвращаемые значения модуля decort_kvmvm
Модуль **decort_kvmvm** возвращает информацию о виртуальной машине в виде словаря `facts` со следующими ключами:
| Ключ | Тип данных | Описание |
| ------ | ------ | ------ |
| account_id | int | Идентификатор аккаунта. |
| arch | string | Архитектура ВМ. |
| chipset | string | Эмулируемый чипсет. |
| cpu | int | Количество виртуальных процессоров. |
| cpu_pin | bool | Запуск виртуальной машины на выделенных процессорах. |
| custom_fields | dict | Словарь, управляющий XML виртуальной машины. Если `null`, то управление виртуальной машиной через XML отключено, иначе - управление через XML включено. |
| data_disks | list | Список идентификаторов дисков с данными, подключенных к ВМ. |
| disk_size | int | Размер загрузочного диска в ГБ. |
| hp_backed | bool | Использовать Huge Pages для выделения оперативной памяти виртуальной машины. |
| id | int | Идентификатор ВМ. |
| image_id | id | Идентификатор образа.
| interfaces | list | Список словарей, описывающих сетевые интерфейсы ВМ. |
| name | string | Имя ВМ. |
| numa_affinity | str | Правило применения NUMA affinity к виртуальной машине. |
| password | string | Пароль пользователя ОС по умолчанию. |
| private_ips | list | Список IP-адресов на сетевых интерфейсах ВМ, которые подключены к внутренним сетям. |
| public_ips | list | Список IP адресов на сетевых интерфейсах ВМ, которые подключены к внешним сетям. |
| ram | int | Объём ОЗУ ВМ в МБ. |
| rg_id | int | Идентификатор ресурсной группы, которой принадлежит данная ВМ. |
| state | string | Состояние ВМ.|
| tags | dict | Словарь, пары ключ-значение которого, описывают тэги ВМ.
| tech_status | str | Технический статус ВМ.
| username | string | Имя пользователя ОС по умолчанию. |
## Пример использования модуля decort_kvmvm
В данном примере создается ВМ с именем MyFirstVM.
```
- name: Сreate VM
decort_kvmvm:
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
authenticator: oauth2
controller_url: "https://cloud.digitalenergy.online"
cpu: 2
image_id: "{{ my_img.facts.id }}"
name: MyFirstVM
networks:
- type: VINS
id: "{{ my_vins.facts.id }}"
oauth2_url: "https://sso.digitalenergy.online"
ram: 4096
rg_id: "{{ my_rg.facts.id }}"
chipset: Q35
custom_fields:
fields:
title: TestTitle
cpu:
mode: custom
cache:
mode: disable
register: my_vm
```

@ -0,0 +1,893 @@
# Модуль decort_lb
## Обзор модуля decort_lb
Модуль **decort_lb** предназначен для выполнения следующих действий над балансировщиками нагрузки:
- создать
- получить информацию
- отключить/включить/запустить/перезапустить
- изменить конфигурации backend и frontend
- удалить (в корзину или безвозвратно)
- восстановить из корзины
## Параметры модуля decort_lb
Ниже приведен полный список параметров для модуля **decort_lb**:
<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">
app_id
</td>
<td>
(str)
</td>
<td>
Идентификатор приложения, использующийся для подключения к контроллеру
облачной платформы DECORT в режиме <code>authenticator: oauth2</code>.
Данный параметр является обязательным для указанного режима. Если
параметр не задан в playbook, модуль будет использовать значение
переменной окружения <code>DECORT_APP_ID</code>.
</td>
</tr>
<tr>
<td colspan="3">
app_secret
</td>
<td>
(str)
</td>
<td>
Секретный ключ приложения, который используется для подключения к
контроллеру облачной платформы DECORT в режиме
<code>authenticator: oauth2</code>. Данный параметр является
обязательным для указанного режима. Так как он содержит секретную
информацию, то его не рекомендуется задавать непосредственно в
playbook. Если параметр не задан в playbook, то модуль будет
использовать значение переменной окружения
<code>DECORT_APP_SECRET</code>.
</td>
</tr>
<tr>
<td colspan="3">
authenticator
</td>
<td>
(str)
<br>Значения:
<br/><code>oauth2</code>
<br/><code>jwt</code>
</td>
<td>
Режим аутентификации при подключении к контроллеру облачной платформы
DECORT. Обязательный параметр.
</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">
controller_url
</td>
<td>
(str)
</td>
<td>
URL контроллера, соответствующего экземпляру облачной платформы
DECORT. Данный параметр является обязательным.
</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">
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="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">
oauth2_url
</td>
<td>
(str)
</td>
<td>
URL авторизационного сервера, работающего по протоколу Oauth2,
который должен использоваться в режиме
<code>authenticator: oauth2</code>. Данный параметр является
обязательным для указанного режима. Если параметр не задан в
playbook, модуль будет использовать значение переменной
окружения <code>DECORT_OAUTH2_URL</code>.
</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">
verify_ssl
</td>
<td>
(bool)
<br>Default: <code>true</code>
</td>
<td>
Позволяет отключить проверку SSL сертификатов при выполнении API
вызовов в адрес контроллера облачной инфраструктуры, например,
при работе с изолированной облачной инфраструктурой, использующей
самоподписанные сертификаты. Применяйте данный параметр с
осторожностью, предпочтительно в защищенных средах.
</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>
</table>

@ -0,0 +1,131 @@
# Модуль decort_osimage
## Обзор модуля decort_osimage
Модуль decort_osimage предназначен для выполнения следующих действий над образами, созданными в облачной платформе DECORT:
- шаблонные образы:
- создать
- получить информацию
- изменить имя
- удалить
- виртуальные образы
- создать
- получить информацию
- изменить
- имя
- целевой образ
## Параметры модуля decort_osimage
Ниже приведен полный список параметров для модуля decort_osimage.
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_Id | (int) | Уникальный целочисленный идентификатор аккаунта. Используется для поиска образов, а тажке для их создания. |
| account_name | (string) | Имя аккаунта. Используется для получения уникального целочисленного идентификатора аккаунта. |
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. |
| authenticator | (str)<br>Значения:<br/>`oauth2`<br/>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. |
| boottype | (string)<br>Default: `uefi` | Тип загрузки образа. Используется при создании образа.|
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) образ. Данный параметр является обязательным. |
| drivers | (string)<br>Default: `KVM_X86` | Тип виртуальных машин, подходящих для образа. Используется при создании образа.|
| hotresize | (bool)<br>Default: `false` | Поддерживает ли образ "горячее" изменение размера. По умолчанию установлено `false`. Используется при создании образа операционной системы. |
| image_id | (int) | Идентификатор шаблонного образа.
| image_name | (str) | Имя шаблонного образа.
| image_password | (string) | Опциональный пароль для образа. Используется при создании образа.|
| image_username | (string) | Опциональное имя пользователя для образа. Используется при создании образа. |
| imagetype | (string)<br>Default: `linux` | Тип образа. Используется при создании образа.|
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.|
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
| passwordDL | (string) | Пароль для скачивания по URL-адресу. Используется при создании образа. |
| pool | (str) | Имя пула СХД. Используется для поиска существующего образа.
| poolName | (string) | Имя пула СХД. Используется при создании образа. |
| sepId | (integer) | Уникальный целочисленный идентификатор СХД. Используется при создании образа. |
| sep_id | (int) | Идентификатор СХД. Используется для поиска существующего образа.
| state | (string)<br>Значения:<br>`present`<br>`absent`<br>Default: `present` | Целевое состояние образа. `present` - существует, `absent` - удалён. |
| url | (string) | URL-адрес, с которого будет загружен образ. Используется при создании образа.|
| usernameDL | (string) | Имя пользователя для загрузки образа с заданного URL-адреса. Используется при создании образа. |
| verify_ssl | (bool)<br>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
| virt_id | (integer) | Уникальный целочисленный идентификатор виртуального образа. Может использоваться для получения информации о виртуальном образе, а также для привязки к нему другого образа.|
| virt_name | (string) | Имя виртуального образа. Используется для получения `virt_id`, а в последствии информации о виртуальном образе, а также для создания виртуального образа и привязки к нему другого образа.|
## Возвращаемые значения модуля decort_osimage
Модуль decort_osimage возвращает информацию об образе в виде словаря facts со следующими ключами:
| Ключ | Тип данных | Описание |
| ------ | ------ | ------ |
| accountId | int | Идентификатор аккаунта.
| id | int | Уникальный целочисленный идентификатор данного образа. |
| linkto | int | Уникальный целочисленный идентификатор образа, который привязан к данному виртуальному. |
| name | string | Имя образа. |
| pool | string | Имя пула на системе хранения данных, в котором находится данный образ.|
| sep_id | int | Идентификатор системы хранения данных, на которой хранится данный образ. |
| size | int | Размер образа в ГБ. |
| state | string | Текущий статус образа. |
| type | string | Тип образа. |
## Пример использования модуля decort_osimage
Пример создания шаблонного образа с операционной системой Alpine Linux.
```
- name: Create template image
decort_osimage:
account_Id: 12345
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
authenticator: oauth2
controller_url: "https://ds1.digitalenergy.online"
image_name: alpine_linux_3.19.1
url: https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/cloud/nocloud_alpine-3.19.1-x86_64-uefi-cloudinit-r0.qcow2
verify_ssl: false
register: osimage
```
Пример получения информации о существующем шаблонном образе по его имени.
```
- name: Get template image
decort_osimage:
account_Id: 12345
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
authenticator: oauth2
controller_url: "https://ds1.digitalenergy.online"
image_name: alpine_linux_3.19.1
verify_ssl: false
register: osimage
```
Пример создания виртуального образа. Также в случае, если виртуальный образ уже существует, но к нему привязан другой шаблонный образ, он привяжет к себе указанный в примере шаблонный образ.
```
- name: Create virtual image
decort_osimage:
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
authenticator: oauth2
controller_url: "https://ds1.digitalenergy.online"
image_name: alpine_linux_3.19.1
virt_name: alpine_last
register: osimage
```
Обратите внимание, что в данном примере можно использовать как `image_name`, так и `image_id`. Также можно использовать либо `virt_name`, либо `virt_id`.
Пример переименования образа.
```
- name: Rename template image
decort_osimage:
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
authenticator: oauth2
controller_url: "https://ds1.digitalenergy.online"
image_name: alpine_linux_3.19.1_new_name
image_id: 54321
register: osimage
```

@ -0,0 +1,76 @@
# Модуль decort_pfw
## Обзор модуля decort_pfw
Модуль **decort_pfw** предназначен для настройки правил переадресации портов (port forwarding, destination NAT) на виртуальном маршрутизаторе заданной внутренней сети для заданной виртуальной машины.
Модуль поддерживает выполнение следующих действий над правилами:
- добавить
- получить информацию
- удалить
## Параметры модуля decort_pfw
Ниже в алфавитном порядке приведен полный список параметров для модуля **decort_pfw**. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
`ansible-doc -t module decort_pfw`
| Параметр | Тип, допустимые значения | Описание|
| ------ | ------ | ------ |
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. |
| authenticator | (str)<br>Значения:<br/>`oauth2`<br/>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. |
| compute_id | (int) | Идентификатор виртуальной машины. IP-адрес, который данная ВМ имеет во внутренней сети, заданной параметром `vins_id`, будет использоваться как внутренний IP-адрес в правилах. Обязательный параметр. |
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT. Данный параметр является обязательным. |
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`. |
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
| rules | (list) | Список словарей, описывающих правила переадресации портов для заданной ВМ (параметр `compute_id`) на виртуальном маршрутизаторе заданной внутренней сети (параметр `vins_id`).<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`). |
| verify_ssl | (bool)<br>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
| 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,228 @@
# Модуль decort_rg
## Обзор модуля decort_rg
Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет:
- создавать ресурсные группы
- удалять ресурсные группы (в корзину или безвозвратно)
- восстанавливать ресурсные группы из корзины
- включать/отключать ресурсные группы
- запрашивать информацию об уже существующих ресурсных группах
- изменять ресурсные группы:
- переименовывать
- настраивать квоты
- задавать стандартную сеть
- настраивать права доступа для пользователей
- изменять доступные пулы СХД
## Параметры модуля decort_rg
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_rg. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: `ansible-doc -t module decort_rg`
| Параметр | Тип, допустимые значения | Описание |
|----------|--------------------------|----------|
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то account_name игнорируется. |
| account_name | (string) | Имя аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
| access | (dict) | Параметр, позволяющий выдать, забрать или изменить права у пользователя в ресурсной группе. |
| description | (string) | Текстовое описание ресурсной группы. Данный параметр является опциональным и учитывается только при создании ресурсной группы, а при всех прочих операциях игнорируется. |
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения DECORT_APP_SECRET. |
| authenticator | Значения:<br>`oauth2`<br>`jwt`| Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным.|
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должна быть создана (или уже существует) данная ресурсная группа. Данный параметр является обязательным. |
| 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`. |
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`<br>Данный параметр является обязательным для указанного режима.<br>Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в _playbook_.<br>Если этот параметр не определен в _playbook_, то модуль будет использовать значение переменной окружения `DECORT_JWT`. |
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. |
| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
| 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` | Целевое состояние ресурсной группы. |
| verify_ssl | (bool)<br/>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
## Возвращаемые значения модуля decort_rg
Модуль decort_rg возвращает информацию о ресурсной группе в виде словаря facts со следующими ключами:
| Ключ | Тип данных | Описание |
|------|------------|----------|
| account_id | int | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данная ресурсная группа. |
| gid | int | Идентификатор физического кластера (Grid ID), на базе которого развёрнута ресурсная группа. |
| id | int | Уникальный целочисленный идентификатор ресурсной группы. |
| name | string | Имя ресурсной группы. Обратите внимание, что это имя уникально только в рамках аккаунта, которому принадлежит данная ресурсная группа. |
| state | string | Текущее состояние ресурсной группы. |
| quota | dict | Текущие квоты ресурсной группы. |
| resTypes | list | Список типов ресурсов, разрешенных к созданию в данной ресурсной группе. |
| defNetId | int | Уникальный целочисленный идентификатор сети по умолчанию в данной ресурсной группе. |
| defNetType | string | Тип сети по умолчанию в данной ресурсной группе. |
| ViNS | list | Список идентификаторов внутренних сетей ресурсной группы. |
| computes | list | Список идентификаторов виртуальных машин ресурсной группы. |
| uniqPools | list | Список доступных пулов СХД. |
## Пример использования модуля decort_rg
В данном примере показано, как создать ресурсную группу по имени MyRG в аккаунте MyAccount.
```
- name: manage resource group
decort_rg:
authenticator: oauth2
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
controller_url: "https://cloud.digitalenergy.online"
account_name: "MyAccount"
rg_name: "MyRG"
state: present
register: my_rg
delegate_to: localhost
```
В данном примере показано, как создать ресурсную группу по имени MyRG в аккаунте MyAccount, также задать квоты и выдать права на чтение пользователю MyUser.
```
- name: manage resource group
decort_rg:
authenticator: oauth2
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
controller_url: "https://cloud.digitalenergy.online"
account_name: "MyAccount"
rg_name: "MyRG"
access:
action: "grant"
user: "MyUser"
right: "R"
quotas:
cpu: 16
ram: 16384
disk: 100
ext_ips: 20
net_transfer: 1000
state: present
register: my_rg
delegate_to: localhost
```
В данном примере показано, как выдать доступ на чтение и запись пользователю MyUser в ресурсной группе по имени MyRG в аккаунте MyAccount.
```
- name: manage resource group
decort_rg:
authenticator: oauth2
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
controller_url: "https://cloud.digitalenergy.online"
account_name: "MyAccount"
rg_name: "MyRG"
access:
action: "grant"
user: "MyUser"
right: "RCX"
state: present
register: my_rg
delegate_to: localhost
```
В данном примере показано, как сменить квоту в ресурсной группе по имени MyRG в аккаунте MyAccount.
```
- name: manage resource group
decort_rg:
authenticator: oauth2
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
controller_url: "https://cloud.digitalenergy.online"
account_name: "MyAccount"
rg_name: "MyRG"
quotas:
cpu: 16
ram: 16384
disk: 100
ext_ips: 20
net_transfer: 1000
state: present
register: my_rg
delegate_to: localhost
```
В данном примере показано, как изменить сеть по умолчанию в ресурсной группе по имени MyRG в аккаунте MyAccount.
```
- name: manage resource group
decort_rg:
authenticator: oauth2
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
controller_url: "https://cloud.digitalenergy.online"
account_name: "MyAccount"
rg_name: "MyRG"
def_netType: "PRIVATE"
def_netId: 99
state: present
register: my_rg
delegate_to: localhost
```
В данном примере показано, как переименовать ресурсную группу по имени MyRG на новое имя "NewRg" в аккаунте MyAccount.
```
- name: manage resource group
decort_rg:
authenticator: oauth2
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
controller_url: "https://cloud.digitalenergy.online"
account_name: "MyAccount"
rg_name: "MyRG"
rename: "NewRg"
rg_id: 27
state: present
register: my_rg
delegate_to: localhost
```
В данном примере результат работы модуля decort_rg записывается в переменную my_rg.
Модули DECORT, которым для работы требуется ресурсная группа, в качестве одного из параметров, как правило, принимают идентификатор `rg_id`. Так, например, используя модуль `decort_kvmvm` для создания виртуального сервера необходимо указать ресурсную группу, к которой будет принадлежать этот виртуальный сервер. Сделать это можно следующим образом:
```
<прочие детали опущены>
rg_id: "{{ my_rg.facts.id }}"
```
В данном примере показано, как изменить доступные пулы СХД в ресурсной группе по имени MyRG в аккаунте MyAccount.
```
- name: change available sep pools
decort_rg:
authenticator: oauth2
app_id: "{{ my_app_id }}"
app_secret: "{{ my_app_secret }}"
oauth2_url: "https://sso.digitalenergy.online"
controller_url: "https://cloud.digitalenergy.online"
account_name: "MyAccount"
rg_name: "MyRG"
sep_pools:
- sep_id: 1
pool_names:
- sep1_pool1
- sep1_pool2
- sep_id: 2
pool_names:
- sep2_pool1
state: present
register: my_rg
delegate_to: localhost
```

File diff suppressed because it is too large Load Diff

@ -0,0 +1,120 @@
# Модуль decort_vins
## Обзор модуля decort_vins
Модуль decort_vins предназначен для управления внутренними сетями (Virtual Network Segment, ViNS) и позволяет производить с ними следующие действия:
- создавать
- на уровне ресурсной группы (если РГ задана)
- на уровне аккаунта (если РГ не задана)
- удалять (безвозвратно)
- восстанавливать из корзины
- запрашивать информацию
- включать/отключать
- соединять (необходимы права администратора)
- изменять:
- включать/отключать SSH-доступ к виртуальному маршрутизатору (необходимы права администратора)
- включать/отключать режим **Custom Config** для виртуального маршрутизатора (необходимы права администратора)
- сохранять конфигурацию виртуального маршрутизатора для возможности последующего отката к ней (необходимы права администратора)
## Параметры модуля decort_vins
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_vins. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
`ansible-doc -t module decort_vins`
| Параметр | Тип, допустимые значения | Описание |
| ------ | ------ | ------ |
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данная внутреняя сеть. При идентификации внутренней сети по имени (см. параметр `vins_name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
| account_name | (string) | Имя аккаунта, которому принадлежит данная внутренняя сеть. При идентификации внутренней сети по имени (см. параметр `vins_name`) должно быть задано либо имя, либо идентификатор аккаунта (см. параметр account_id). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|description | (string)| Текстовое описание внутренней сети. Данный аргумент является опциональным и учитывается только при создании внутренней сети, а при всех прочих операциях игнорируется.|
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.|
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
| authenticator | Значения:<br/>`oauth2`<br/>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным. |
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должна быть создана (или уже существует) данный внутренняя сеть. Данный параметр является обязательным.
| ext_net_id | (int) | Идентификатор внешней сети, к которой должна быть подключена внутренняя сеть. Если задать значение `0`, то платформой будет выбрана внешняя сеть по умолчанию. |
| ext_ip_addr | (string) | IP-адрес внешней сети, заданной через параметр `ext_net_id`. Если не задан, то IP-адрес для внешней сети будет выбран платформой автоматически.
| ipcidr | (string) | Адрес сети для создаваемой внутренней сети. Если этот параметр не задан, то платформа назначит адрес автоматически. Обратите внимание, что внутренние сети, принадлежащие одному и тому же аккаунту, не могут иметь пересекающихся сетей.|
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt`. Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.|
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу _Oauth2_, который должен использоваться в режиме `authenticator: oauth2`.<br/>Данный параметр является обязательным для указанного режима.<br/>Если параметр не задан в _playbook_, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
|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` | Целевое состояние внутренней сети. |
| verify_ssl | (bool)<br/>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
| 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 версии 6.1.0](./6.1.0/Home.md)
- [Модули Ansible версии 6.0.0](./6.0.0/Home.md)
- [Модули Ansible версии 5.6.0](./5.6.0/Home.md)
- [Модули Ansible версии 5.5.0](./5.5.0/Home.md)

Loading…
Cancel
Save