Compare commits
284 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 54c306b13b | |||
| dd2fca15f3 | |||
| aa3f84095f | |||
| ba305a0ccb | |||
|
|
7d60e5f97b | ||
| bbc352715d | |||
| c34f02f7bd | |||
| 3c6ce85dba | |||
| fe1e8a32f9 | |||
| 0ca3399026 | |||
| ce54341a64 | |||
| 7422464109 | |||
| 0c0fde8470 | |||
| aefc920e1a | |||
| b73a57dd0d | |||
| cd663a4a01 | |||
| 0cdfa6a0ec | |||
| 53938d9d94 | |||
| 8e4ce18d8a | |||
| ced031bba8 | |||
| 25795e9fe9 | |||
| a46ed24168 | |||
| 53ba9a4f02 | |||
| 682f19c4ce | |||
| 3516843c41 | |||
| 94586345a1 | |||
| c1dfaccb61 | |||
| d99af4498a | |||
| a0805d45b3 | |||
| 3b2be18346 | |||
| f230325968 | |||
| 1d56940e7e | |||
| 10dba22834 | |||
| b6bbc31961 | |||
| 412bd704f1 | |||
| 77a2b6a182 | |||
| f00055e009 | |||
| 37de8afbc1 | |||
| 53e30105b1 | |||
| 734408ab10 | |||
| 0fcde3f4bd | |||
| 32324ee184 | |||
| 5161649fe9 | |||
| ce4ac4630c | |||
| 8ee5bcce52 | |||
| 1d6141117d | |||
| 5d6a278b8f | |||
| cf4d43d23e | |||
| 11168827e6 | |||
| 2507a65d89 | |||
| 22f487b626 | |||
| 89b03213df | |||
| 96b163ba00 | |||
| 21470542ea | |||
| 7eed30d2ab | |||
| efa60a5caf | |||
| b7b02fdb85 | |||
| c5f2e143ba | |||
| 68f4bcbcc6 | |||
| a94a5a2e62 | |||
| 3b84a5f633 | |||
| 2d04cad3d4 | |||
| f12e6fc941 | |||
| 02e55e77f4 | |||
| dac66fac77 | |||
| 3ce022a800 | |||
| 59000feb00 | |||
| 614c7d98d9 | |||
| 3428b74b00 | |||
| 36930bda0d | |||
|
|
eb91d5200f | ||
| d7711e58ca | |||
| d287c88293 | |||
| 309d5b91eb | |||
| db854acc11 | |||
| 7b682f0340 | |||
| b51136b711 | |||
|
|
daa91bee95 | ||
|
|
5227e2be0b | ||
| 9ccf2de256 | |||
| 825ce068c8 | |||
| efb51ab8b4 | |||
| 190a1d302c | |||
| 840e4bec21 | |||
| f22be4fe08 | |||
| 4b1a7d9d9e | |||
| 3a2d9904cf | |||
| 9393bb76cc | |||
| 27e7c2749f | |||
| e578742bb2 | |||
| 7998046cfb | |||
| 06b4686e18 | |||
| cb13649586 | |||
| 7e372511bc | |||
| bb8e9ad6f7 | |||
| 3fec6f014b | |||
| 4a08cd86f6 | |||
| 3dc9cbcbd8 | |||
| 0008372e6b | |||
| 5c3194b94d | |||
| 20b9228351 | |||
| 9449afa2ac | |||
| b2477d2035 | |||
| ea63959289 | |||
| b3b47c57a1 | |||
| bb6394873b | |||
| ff1c43e8de | |||
| 6b4957f8aa | |||
| d824e599b9 | |||
| b1f2167d00 | |||
| aad2f89e6d | |||
| 4311eee435 | |||
| 3bdac96760 | |||
| a6a6954d46 | |||
| 6d003e4541 | |||
| 0ae16ddc1d | |||
| c5f68fea38 | |||
| 23ad78b1cf | |||
| 93a929aff5 | |||
| 90ae212d0c | |||
| 421d19bfa8 | |||
| 41731c3dd7 | |||
| 034aeca3f0 | |||
| db67a3b2d2 | |||
| af6eff33f7 | |||
| ca45f49c2e | |||
| 88d9ddcdbe | |||
| 876ff5b98d | |||
| c46edd4f86 | |||
| 9ce5a3d711 | |||
| 38757aa902 | |||
| 56f7f354c1 | |||
| 2b09b9449a | |||
| eb0766b15f | |||
| d7a32376db | |||
| 8a9c354f20 | |||
| 1e994410fe | |||
| e2bbeb7ffb | |||
| 2777059b6b | |||
| 38f11ee480 | |||
| dc24c0e7ee | |||
| 9a5fd176f0 | |||
| 279d60083d | |||
| 1d53fd3213 | |||
| a0da034499 | |||
| e5504b3ac9 | |||
| 2eb43815e7 | |||
| 2f9716a51d | |||
| aa96af1455 | |||
| a39ab95c1f | |||
| 76a1ff1788 | |||
| 9dc3a5e780 | |||
| ff32b509f8 | |||
| 5b731d009b | |||
| 57dba89b5a | |||
| 007c7f4bad | |||
|
|
7f87642b47 | ||
| 2873e4da82 | |||
| 9c97f4b645 | |||
| 772f389d98 | |||
| 36e1383c7e | |||
| 35fe2bdf0e | |||
| 7e7a4898ec | |||
| fde986bb42 | |||
| 538c7e6f47 | |||
| 53634b7fa5 | |||
| b68e562fc1 | |||
| df619e7998 | |||
|
|
877b84d650 | ||
| 10b98b7c4a | |||
| 51707cbb69 | |||
| 3f4cfd40d6 | |||
|
|
4cf0316dad | ||
| abcb7d52f8 | |||
|
|
8a6d624069 | ||
|
|
2b96881849 | ||
| 6725e4342e | |||
| 5003991cf5 | |||
| 8a99097b6c | |||
| 6a99ea4d85 | |||
| 236c3b6d26 | |||
| bcf384a910 | |||
| 8cf3d05d0b | |||
| 5da120f2d3 | |||
| 6abd78882c | |||
| 7fa2d07ab0 | |||
| 8b407c6f69 | |||
| 4c4be07550 | |||
|
|
eb542fa46c | ||
| 240e2ce2df | |||
|
|
f4fcf5b7b7 | ||
|
|
d2dabdb194 | ||
| 694e68fe22 | |||
| 9e7a33a44a | |||
|
|
31b72b3806 | ||
|
|
fa79b90269 | ||
|
|
aa9f26bf1a | ||
| 6cd828d031 | |||
| d50509e0c3 | |||
| a45ab19d38 | |||
|
|
a3c1dcad7a | ||
|
|
9bf50c958f | ||
|
|
d769119ade | ||
| 200e8f7151 | |||
| f11ec8fefb | |||
| 19534384a8 | |||
| 1304a0fcbf | |||
|
|
a5f03389f2 | ||
|
|
6760167e4e | ||
|
|
2b4ba7ee55 | ||
|
|
5b66c98cc6 | ||
|
|
55268beaad | ||
| b18bdef269 | |||
| 21e853c1f2 | |||
| 1c6b46c535 | |||
| 058de4884f | |||
|
|
d622dd8453 | ||
|
|
e26011ab20 | ||
|
|
f2e9b550bb | ||
|
|
a8f50bfb6b | ||
|
|
9222fdd866 | ||
|
|
e94faef2ad | ||
|
|
66e72a3d3b | ||
|
|
740271b2f2 | ||
|
|
207c04bb77 | ||
|
|
5be2e850ce | ||
|
|
7fffdd0ab5 | ||
|
|
ae85826129 | ||
|
|
b03b82e492 | ||
|
|
15893f58bb | ||
|
|
3681949ea6 | ||
|
|
8713ebe099 | ||
|
|
87ecb762aa | ||
|
|
b30d8f2b3c | ||
|
|
36d6fe092d | ||
|
|
8f737397de | ||
|
|
72d9da0234 | ||
|
|
4b3f34376b | ||
| 72b591723f | |||
| f0e9ac10cc | |||
|
|
82eef4492d | ||
|
|
889618f843 | ||
|
|
ef33532a83 | ||
|
|
8f7c933fb8 | ||
|
|
dd28084b76 | ||
|
|
8d6ed618ab | ||
|
|
e2c9f591b8 | ||
|
|
ebdf9aa012 | ||
|
|
31d6774475 | ||
|
|
6148e67dd1 | ||
|
|
4c7922cb55 | ||
|
|
8d51555db1 | ||
|
|
ebfb465531 | ||
|
|
f3504a3d50 | ||
|
|
1c3558d6f3 | ||
|
|
12a80e7cf4 | ||
|
|
38d24cfa0a | ||
|
|
ebe1c76a43 | ||
|
|
224ac59779 | ||
|
|
ff4273cbce | ||
|
|
5e5b6f6b8a | ||
|
|
c497979efa | ||
|
|
28876ae38d | ||
|
|
ebe1a9194f | ||
|
|
d9ad1fee21 | ||
|
|
4b23cf8bae | ||
|
|
5b809dee4f | ||
|
|
ac93e76005 | ||
|
|
aae60a46b9 | ||
|
|
25af1b4428 | ||
|
|
e058925f9b | ||
|
|
f6b0da976b | ||
|
|
9b9b92ff07 | ||
|
|
498b46b4f2 | ||
|
|
85da544614 | ||
|
|
be7841ba38 | ||
|
|
aabd5dab6e | ||
|
|
4a9d181782 | ||
|
|
ec7d1fd181 | ||
|
|
4f151e174b | ||
|
|
0237c469c5 | ||
|
|
ab44d18d21 | ||
|
|
75bda6d76d | ||
|
|
41ca42dcab |
88
CHANGELOG.md
Normal file
88
CHANGELOG.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# Список изменений в версии 6.1.0
|
||||
|
||||
## Добавлено
|
||||
|
||||
### Модуль decort_kvmvm
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-602 | Добавлена возможность изменения параметра `chipset` у существующей виртуальной машины. |
|
||||
| BANS-620 | Добавлены параметры `cpu_pin`, `hp_backed`, `numa_affinity` для создания и изменения виртуальной машины. |
|
||||
| BANS-622 | Добавлена возможность изменения параметра `description` у существующей виртуальной машины. |
|
||||
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
|
||||
| BANS-625 | Добавлен параметр `custom_fields` для создания и изменения виртуальной машины.|
|
||||
|
||||
### Модуль decort_k8s
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| 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_disk
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
|
||||
|
||||
### Модуль decort_lb
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
|
||||
|
||||
### Модуль decort_vins
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
|
||||
|
||||
### Модуль decort_rg
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Добавлен параметр `description` в связи с переименованием из `annotation`.|
|
||||
|
||||
## Удалено
|
||||
|
||||
### Модуль decort_group
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-656 | Удалён неиспользуемый ключ `config` в возвращаемом словаре. |
|
||||
| BANS-201 | Удалены неиспользуемые параметры `annotation` и `description`.|
|
||||
|
||||
### Модуль decort_disk
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
|
||||
|
||||
### Модуль decort_kvmvm
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
|
||||
|
||||
### Модуль decort_lb
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
|
||||
|
||||
### Модуль decort_rg
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
|
||||
|
||||
### Модуль decort_vins
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Удален параметр `annotation` в связи с переименованием в `description`.|
|
||||
|
||||
### Модуль decort_bservice
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Удалены неиспользуемые параметры `annotation` и `description`.|
|
||||
|
||||
### Модуль decort_k8s
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-201 | Удален неиспользуемый параметр `annotation`.|
|
||||
|
||||
## Исправлено
|
||||
|
||||
### Модуль decort_kvmvm
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BANS-9 | Исправлена ошибка, из-за которой модуль не устанавливал параметр `description` при создании виртуальной машины. |
|
||||
| BANS-13 | Исправлена ошибка, из-за которой модуль не возвращал ошибку при попытке уменьшить размер загрузочного диска. |
|
||||
24
README.md
24
README.md
@@ -1,12 +1,18 @@
|
||||
# decort-ansible
|
||||
Ansible modules for Digital Energy Orchestration Technology (DECORT) platform v3.6.1 and above.
|
||||
Модули Ansible для платформы Digital Energy Orchestration Technology (DECORT).
|
||||
|
||||
Note that this module may produce unreliable results when used with older DECORT API versions.
|
||||
## Соответствие версий платформы версиям модулей Ansible
|
||||
|
||||
Requirements:
|
||||
* Ansible 2.7 or higher
|
||||
* Python 2.6 or higher
|
||||
* PyJWT 1.7.1 Python module
|
||||
* requests Python module
|
||||
* netaddr Python module
|
||||
* DECORT cloud platform version 3.5.0 or higher
|
||||
| Версия платформы | Версия модулей Ansible |
|
||||
|:----------------:|:--------------------------:|
|
||||
| 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 |
|
||||
| 3.8.6 | 5.2.4 |
|
||||
|
||||
## Ссылки
|
||||
|
||||
- [Документация](./wiki/Home.md)
|
||||
|
||||
- [Список изменений](./CHANGELOG.md)
|
||||
|
||||
0
examples/.gitkeep
Normal file
0
examples/.gitkeep
Normal file
40
examples/VINS.yaml
Normal file
40
examples/VINS.yaml
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
#
|
||||
# DECORT vins module example
|
||||
#
|
||||
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: obtain JWT
|
||||
decort_jwt:
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
validity: 1200
|
||||
register: my_jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out JWT
|
||||
debug:
|
||||
var: my_jwt.jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: Manage ViNS at resource group level
|
||||
decort_vins:
|
||||
authenticator: jwt
|
||||
jwt: "{{ my_jwt.jwt }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
vins_name: "vins_created_by_decort_VINS_module"
|
||||
state: present
|
||||
rg_id: 198
|
||||
ext_net_id: -1
|
||||
ipcidr: "10.20.30.0/24"
|
||||
mgmtaddr: "10.20.30.1"
|
||||
custom_config: false
|
||||
config_save: false
|
||||
verify_ssl: false
|
||||
|
||||
register: managed_vins
|
||||
|
||||
- name: print VINS facter
|
||||
debug:
|
||||
msg: "{{managed_vins.facts.password}}"
|
||||
when: managed_vins.facts.password is defined
|
||||
36
examples/affinity.yaml
Normal file
36
examples/affinity.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
---
|
||||
#
|
||||
# DECORT kvmvm module example
|
||||
#
|
||||
- hosts: ansible_master
|
||||
tasks:
|
||||
- name: create a VM named cloud-init_example
|
||||
decort_kvmvm:
|
||||
name: affinity_example
|
||||
annotation: "VM managed by decort_kvmvm module"
|
||||
authenticator: oauth2
|
||||
app_id: "" # Application id from SSO Digital Energy
|
||||
app_secret: "" # API key from SSO Digital Energy
|
||||
controller_url: "" #"https://mr4.digitalenergy.online"
|
||||
rg_id: # Resource group id
|
||||
cpu: 2
|
||||
ram: 2048
|
||||
boot_disk: 10
|
||||
image_name: "DECS Ubuntu 18.04 v1.2.3" # Name of OS image
|
||||
networks:
|
||||
- type: VINS
|
||||
id: # VINS id
|
||||
tags: "Ansible cloud init example"
|
||||
aff_lable: "Affinity lable"
|
||||
tag:
|
||||
- key: bd
|
||||
value: main
|
||||
aff_rule:
|
||||
- key: app
|
||||
value: main
|
||||
topology: compute
|
||||
policy: REQUIRED
|
||||
mode: EQ
|
||||
state: present
|
||||
delegate_to: localhost
|
||||
register: simple_vm
|
||||
40
examples/annotations.yaml
Normal file
40
examples/annotations.yaml
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
#
|
||||
# DECORT k8s module labels, taints, annotations example
|
||||
#
|
||||
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: obtain JWT
|
||||
decort_jwt:
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
validity: 1200
|
||||
register: my_jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out JWT
|
||||
debug:
|
||||
var: my_jwt.jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: Create k8s cluster
|
||||
decort_k8s:
|
||||
authenticator: jwt
|
||||
jwt: "{{ my_jwt.jwt }}"
|
||||
controller_url: "https://mr4.digitalenergy.online"
|
||||
name: "example_kubernetes"
|
||||
rg_id: 199
|
||||
k8ci_id: 4
|
||||
state: present
|
||||
workers:
|
||||
- name: workgroup1
|
||||
labels:
|
||||
- disktype1=ssd1
|
||||
- disktype2=ssd2
|
||||
taints:
|
||||
- key1=value1:NoSchedule
|
||||
- key2=value2:NoSchedule
|
||||
annotations:
|
||||
- node.deckhouse.io/group1=g1
|
||||
- node.deckhouse.io/group2=g2
|
||||
register: kube
|
||||
36
examples/anti_affinity.yaml
Normal file
36
examples/anti_affinity.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
---
|
||||
#
|
||||
# DECORT kvmvm module example
|
||||
#
|
||||
- hosts: ansible_master
|
||||
tasks:
|
||||
- name: create a VM named cloud-init_example
|
||||
decort_kvmvm:
|
||||
name: anti-affinity_example
|
||||
annotation: "VM managed by decort_kvmvm module"
|
||||
authenticator: oauth2
|
||||
app_id: "" # Application id from SSO Digital Energy
|
||||
app_secret: "" # API key from SSO Digital Energy
|
||||
controller_url: "" #"https://mr4.digitalenergy.online"
|
||||
rg_id: # Resource group id
|
||||
cpu: 2
|
||||
ram: 2048
|
||||
boot_disk: 10
|
||||
image_name: "DECS Ubuntu 18.04 v1.2.3" #Name of OS image
|
||||
networks:
|
||||
- type: VINS
|
||||
id: #VINS id
|
||||
tags: "Ansible cloud init example"
|
||||
aff_lable: "Anti affinity lable"
|
||||
tag:
|
||||
- key: bd
|
||||
value: main
|
||||
aaff_rule:
|
||||
- key: app
|
||||
value: main
|
||||
topology: compute
|
||||
policy: REQUIRED
|
||||
mode: ANY
|
||||
state: present
|
||||
delegate_to: localhost
|
||||
register: simple_vm
|
||||
31
examples/basicservices.yaml
Normal file
31
examples/basicservices.yaml
Normal file
@@ -0,0 +1,31 @@
|
||||
---
|
||||
#
|
||||
# DECORT bservice module example
|
||||
#
|
||||
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: obtain JWT
|
||||
decort_jwt:
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
validity: 1200
|
||||
register: my_jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out JWT
|
||||
debug:
|
||||
var: my_jwt.jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: Manage bservice at RG
|
||||
decort_bservice:
|
||||
account_id: 98
|
||||
verify_ssl: false
|
||||
authenticator: jwt
|
||||
jwt: "{{ my_jwt.jwt }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
rg_id: 1629
|
||||
state: present
|
||||
name: databases
|
||||
started: True
|
||||
register: db_bservice
|
||||
38
examples/cloud_init.yaml
Normal file
38
examples/cloud_init.yaml
Normal file
@@ -0,0 +1,38 @@
|
||||
#
|
||||
# DECORT kvmvm module example
|
||||
#
|
||||
- hosts: ansible_master
|
||||
tasks:
|
||||
- name: create a VM named cloud-init_example
|
||||
decort_kvmvm:
|
||||
annotation: "VM managed by decort_kvmvm module"
|
||||
authenticator: oauth2
|
||||
app_id: "" # Application id from SSO Digital Energy
|
||||
app_secret: "" # API key from SSO Digital Energy
|
||||
controller_url: "" #"https://mr4.digitalenergy.online"
|
||||
name: cloud-init_example
|
||||
cpu: 2
|
||||
ram: 2048
|
||||
boot_disk: 10
|
||||
image_name: "DECS Ubuntu 18.04 v1.2.3" #Name of OS image
|
||||
networks:
|
||||
- type: VINS
|
||||
id: #VINS id
|
||||
tags: "Ansible cloud init example"
|
||||
state: present
|
||||
rg_id: #Resource group id
|
||||
ci_user_data:
|
||||
packages:
|
||||
- apache2
|
||||
write_files:
|
||||
- content: |
|
||||
<div>
|
||||
Hello World!
|
||||
</div>
|
||||
owner: user:user
|
||||
path: /var/www/html/index.html
|
||||
hostname: test-apache
|
||||
ssh_keys:
|
||||
- rsa_public: ssh-rsa AAAAOasDmLxnD= user@pc
|
||||
delegate_to: localhost
|
||||
register: simple_vm
|
||||
22
examples/decort_disk/disk_create.yaml
Normal file
22
examples/decort_disk/disk_create.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: manage data disk 01
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: #Application id from SSO DigitalEnergy
|
||||
app_secret: #Application secret from SSO DigitalEnergy
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
account_name: "account_name"
|
||||
name: "example_disk"
|
||||
sep_id: 1
|
||||
pool: 0
|
||||
gid: 0
|
||||
size: 2
|
||||
type: "D"
|
||||
description: "Disk created by decort_disk module"
|
||||
iops: 2000
|
||||
state: present
|
||||
verify_ssl: false
|
||||
|
||||
delegate_to: localhost
|
||||
18
examples/decort_disk/disk_delete.yaml
Normal file
18
examples/decort_disk/disk_delete.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: manage data disk 01
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: #Application id from SSO DigitalEnergy
|
||||
app_secret: #Application secret from SSO DigitalEnergy
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
account_name: "account_name"
|
||||
name: "example_disk"
|
||||
permanently: False
|
||||
force_detach: True
|
||||
reason: "Just to test module decort_disk"
|
||||
state: absent
|
||||
verify_ssl: false
|
||||
|
||||
delegate_to: localhost
|
||||
28
examples/decort_disk/disk_limitIO.yaml
Normal file
28
examples/decort_disk/disk_limitIO.yaml
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: manage data disk 01
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: #Application id from SSO DigitalEnergy
|
||||
app_secret: #Application secret from SSO DigitalEnergy
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
account_name: "account_name"
|
||||
id: 111
|
||||
limitIO:
|
||||
read_bytes_sec: 100
|
||||
read_bytes_sec_max: 100
|
||||
read_iops_sec: 100
|
||||
read_iops_sec_max: 100
|
||||
size_iops_sec: 100
|
||||
write_bytes_sec: 100
|
||||
write_bytes_sec_max: 100
|
||||
write_iops_sec: 100
|
||||
write_iops_sec_max: 100
|
||||
total_bytes_sec: 0
|
||||
total_iops_sec: 0
|
||||
total_bytes_sec_max: 0
|
||||
total_iops_sec_max: 0
|
||||
verify_ssl: false
|
||||
|
||||
delegate_to: localhost
|
||||
15
examples/decort_disk/disk_rename.yaml
Normal file
15
examples/decort_disk/disk_rename.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: manage data disk 01
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: #Application id from SSO DigitalEnergy
|
||||
app_secret: #Application secret from SSO DigitalEnergy
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
account_name: "account_name"
|
||||
id: 111
|
||||
name: "example_disk2"
|
||||
verify_ssl: false
|
||||
|
||||
delegate_to: localhost
|
||||
15
examples/decort_disk/disk_restore.yaml
Normal file
15
examples/decort_disk/disk_restore.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: manage data disk 01
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: #Application id from SSO DigitalEnergy
|
||||
app_secret: #Application secret from SSO DigitalEnergy
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
account_name: "account_name"
|
||||
id: 111
|
||||
state: present
|
||||
verify_ssl: false
|
||||
|
||||
delegate_to: localhost
|
||||
27
examples/decort_osimage/create-osimage.yaml
Normal file
27
examples/decort_osimage/create-osimage.yaml
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
#
|
||||
# DECORT osimage module example
|
||||
#
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
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@ssword"
|
||||
usernameDL: "testDL"
|
||||
passwordDL: "p@sswordDL"
|
||||
architecture: "X86_64"
|
||||
drivers: "KVM_X86"
|
||||
|
||||
delegate_to: localhost
|
||||
register: simple_vm
|
||||
15
examples/decort_osimage/create-virtual-osimage.yaml
Normal file
15
examples/decort_osimage/create-virtual-osimage.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
#
|
||||
# DECORT osimage module example
|
||||
#
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- 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
|
||||
|
||||
14
examples/decort_osimage/get-osimage.yaml
Normal file
14
examples/decort_osimage/get-osimage.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
#
|
||||
# DECORT osimage module example
|
||||
#
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: get_osimage
|
||||
decort_osimage:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
image_name: "alpine_linux_3.14.0"
|
||||
account_Id: 79349
|
||||
delegate_to: localhost
|
||||
register: simple_vm
|
||||
15
examples/decort_osimage/rename-osimage.yaml
Normal file
15
examples/decort_osimage/rename-osimage.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
#
|
||||
# DECORT osimage module example
|
||||
#
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- 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
|
||||
|
||||
20
examples/decort_rg/changeLimits_rg.yaml
Normal file
20
examples/decort_rg/changeLimits_rg.yaml
Normal file
@@ -0,0 +1,20 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "rg_created_by_module"
|
||||
# or
|
||||
#rg_id: 999
|
||||
account_id: 99
|
||||
quotas:
|
||||
cpu: 8
|
||||
ram: 4096
|
||||
disk: 20
|
||||
ext_ips: 10
|
||||
net_transfer: 200
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
21
examples/decort_rg/changeResTypes_rg.yaml
Normal file
21
examples/decort_rg/changeResTypes_rg.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "rg_created_by_module"
|
||||
# or
|
||||
#rg_id: 999
|
||||
account_id: 99
|
||||
resType:
|
||||
- vins
|
||||
- compute
|
||||
- k8s
|
||||
- openshift
|
||||
- lb
|
||||
- flipgroup
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
30
examples/decort_rg/create_rg.yaml
Normal file
30
examples/decort_rg/create_rg.yaml
Normal file
@@ -0,0 +1,30 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "rg_created_by_module"
|
||||
account_id: 99
|
||||
owner: "user_1" #Leave blank to set current user as owner.
|
||||
quotas:
|
||||
cpu: 8
|
||||
ram: 4096
|
||||
disk: 20
|
||||
ext_ips: 10
|
||||
net_transfer: 200
|
||||
access:
|
||||
action: "grant"
|
||||
user: "user_2"
|
||||
right: "RCX"
|
||||
def_netType: "PRIVATE"
|
||||
ipcidr: "" "192.168.1.1"
|
||||
extNetId: 0
|
||||
extNetIp: "" "10.100.1.10"
|
||||
resType:
|
||||
- vins
|
||||
- compute
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
15
examples/decort_rg/delete_rg.yaml
Normal file
15
examples/decort_rg/delete_rg.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "test_rg"
|
||||
# or
|
||||
#rg_id: 999
|
||||
account_id: 99
|
||||
state: present
|
||||
permanently: True
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
12
examples/decort_rg/disable_rg.yaml
Normal file
12
examples/decort_rg/disable_rg.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_id: 999 # rg can be restored only by rg id
|
||||
account_id: 99
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
14
examples/decort_rg/enable_rg.yaml
Normal file
14
examples/decort_rg/enable_rg.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "rg_created_by_module"
|
||||
# or
|
||||
#rg_id: 999
|
||||
account_id: 99
|
||||
state: enabled
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
18
examples/decort_rg/grantAccess_rg.yaml
Normal file
18
examples/decort_rg/grantAccess_rg.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "rg_created_by_module"
|
||||
# or
|
||||
#rg_id: 999
|
||||
account_id: 99
|
||||
access:
|
||||
action: "grant"
|
||||
user: "new_user"
|
||||
right: "R"
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
15
examples/decort_rg/rename_rg.yaml
Normal file
15
examples/decort_rg/rename_rg.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "old_rg_name"
|
||||
# or
|
||||
#rg_id: 1737
|
||||
account_id: 99
|
||||
rename: "new_rg_name"
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
17
examples/decort_rg/revokeAccess_rg.yaml
Normal file
17
examples/decort_rg/revokeAccess_rg.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "rg_created_by_module"
|
||||
# or
|
||||
#rg_id: 999
|
||||
account_id: 99
|
||||
access:
|
||||
action: "revoke"
|
||||
user: "old_user"
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
16
examples/decort_rg/setDefNet_rg.yaml
Normal file
16
examples/decort_rg/setDefNet_rg.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_rg:
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
rg_name: "rg_created_by_module"
|
||||
# or
|
||||
#rg_id: 999
|
||||
account_id: 99
|
||||
def_netType: "PRIVATE"
|
||||
def_netId: 199
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
14
examples/hashivault/hashivault_create_engine.yaml
Normal file
14
examples/hashivault/hashivault_create_engine.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
#
|
||||
# This playbook create engine "test".
|
||||
#
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- hashivault_secret_engine:
|
||||
url: "https://vault.domain.local"
|
||||
authtype: ldap
|
||||
username: "user"
|
||||
password: "p@ssword"
|
||||
state: present
|
||||
name: test
|
||||
backend: generic
|
||||
17
examples/hashivault/hashivault_create_secret.yaml
Normal file
17
examples/hashivault/hashivault_create_secret.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
#
|
||||
# This playbook create secret "secret" with data foo:foe. If secret "secret" exists - add data foo:foe.
|
||||
#
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- hashivault_secret:
|
||||
url: "https://vault.domain.local"
|
||||
authtype: ldap
|
||||
username: "user"
|
||||
password: "p@ssword"
|
||||
mount_point: "kv"
|
||||
state: present
|
||||
permanent: true
|
||||
secret: secret
|
||||
data:
|
||||
foo: foe
|
||||
35
examples/hashivault/hashivault_example.yaml
Normal file
35
examples/hashivault/hashivault_example.yaml
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- hashivault_read:
|
||||
url: "https://vault.domain.local"
|
||||
authtype: ldap
|
||||
username: "user"
|
||||
password: "p@ssword"
|
||||
mount_point: kv
|
||||
secret: secrets/myaccount
|
||||
key: app_secret
|
||||
version: 2
|
||||
register: key
|
||||
|
||||
- name: create a VM using app_secret from hashicorp vault
|
||||
decort_kvmvm:
|
||||
annotation: "VM managed by decort_kvmvm module"
|
||||
authenticator: oauth2
|
||||
app_id: "" # Application id from SSO Digital Energy
|
||||
app_secret: "{{ key }}" # API key from SSO Digital Energy
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: hashivault_read_example
|
||||
cpu: 2
|
||||
ram: 2048
|
||||
boot_disk: 10
|
||||
image_name: "DECS Ubuntu 18.04 v1.2.3" #Name of OS image
|
||||
networks:
|
||||
- type: VINS
|
||||
id: 99 #VINS id
|
||||
tags: "Ansible hashivault_read example"
|
||||
state: present
|
||||
rg_id: 99 #Resource group id
|
||||
delegate_to: localhost
|
||||
register: simple_vm
|
||||
31
examples/hashivault/hashivault_plugin_example.yaml
Normal file
31
examples/hashivault/hashivault_plugin_example.yaml
Normal file
@@ -0,0 +1,31 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: Read a kv2 secret with kv mount point
|
||||
vars:
|
||||
ansible_hashi_vault_auth_method: ldap
|
||||
ansible_hashi_vault_username: username
|
||||
ansible_hashi_vault_password: pwd
|
||||
ansible_hashi_vault_engine_mount_point: kv
|
||||
ansible.builtin.set_fact:
|
||||
response: "{{ lookup('community.hashi_vault.vault_kv2_get', 'secret', url='https://vault.domain.local') }}"
|
||||
|
||||
- name: create a VM using app_secret from hashicorp vault
|
||||
decort_kvmvm:
|
||||
annotation: "VM managed by decort_kvmvm module"
|
||||
authenticator: oauth2
|
||||
app_id: "" # Application id from SSO Digital Energy
|
||||
app_secret: "{{ response.data.password }}" # API key from SSO Digital Energy
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: hashivault_read_example
|
||||
cpu: 2
|
||||
ram: 2048
|
||||
boot_disk: 10
|
||||
image_name: "DECS Ubuntu 18.04 v1.2.3" #Name of OS image
|
||||
networks:
|
||||
- type: VINS
|
||||
id: 99 #VINS id
|
||||
tags: "Ansible hashivault_read example"
|
||||
state: present
|
||||
rg_id: 99 #Resource group id
|
||||
delegate_to: localhost
|
||||
register: simple_vm
|
||||
16
examples/hashivault/hashivault_plugin_login.yaml
Normal file
16
examples/hashivault/hashivault_plugin_login.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: Get auth token from vault
|
||||
set_fact:
|
||||
login_data: "{{ lookup('community.hashi_vault.vault_login', url='https://vault.domain.local', auth_method='ldap', username='username', password='pwd') }}"
|
||||
|
||||
- name: Perform multiple kv2 reads with a single Vault login, showing the secrets
|
||||
vars:
|
||||
ansible_hashi_vault_auth_method: token
|
||||
ansible_hashi_vault_token: '{{ login_data | community.hashi_vault.vault_login_token }}'
|
||||
ansible_hashi_vault_engine_mount_point: kv
|
||||
paths:
|
||||
- secret
|
||||
- secret2
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ lookup('community.hashi_vault.vault_kv2_get', *paths, auth_method='token', url='https://vault.domain.local') }}"
|
||||
18
examples/hashivault/hashivault_plugin_read_secret.yaml
Normal file
18
examples/hashivault/hashivault_plugin_read_secret.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: Read a kv2 secret with the default mount point
|
||||
vars:
|
||||
ansible_hashi_vault_auth_method: ldap
|
||||
ansible_hashi_vault_username: username
|
||||
ansible_hashi_vault_password: pwd
|
||||
ansible_hashi_vault_engine_mount_point: kv
|
||||
ansible.builtin.set_fact:
|
||||
response: "{{ lookup('community.hashi_vault.vault_kv2_get', 'secret', url='https://vault.domain.local') }}"
|
||||
|
||||
- name: Display the results
|
||||
ansible.builtin.debug:
|
||||
msg:
|
||||
- "Secret: {{ response.secret }}"
|
||||
- "Data: {{ response.data }} (contains secret data & metadata in kv2)"
|
||||
- "Metadata: {{ response.metadata }}"
|
||||
- "Full response: {{ response.raw }}"
|
||||
13
examples/hashivault/hashivault_read_secret.yaml
Normal file
13
examples/hashivault/hashivault_read_secret.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- hashivault_read:
|
||||
url: "https://vault.domain.local"
|
||||
authtype: ldap
|
||||
username: "uset"
|
||||
password: "p@ssword"
|
||||
mount_point: kv
|
||||
secret: secret
|
||||
key: foo
|
||||
version: 2
|
||||
register: key
|
||||
@@ -1,2 +0,0 @@
|
||||
[all]
|
||||
ansible_master ansible_host=<ansible host IP address> ansible_port=<SSH port on ansible host> ansible_user=root
|
||||
@@ -1,18 +0,0 @@
|
||||
#
|
||||
# More details on how to use DECORT Ansible module can be found at:
|
||||
# https://github.com/rudecs/decort-ansible/wiki
|
||||
#
|
||||
|
||||
- hosts: ansible_master
|
||||
tasks:
|
||||
- name: obtain JWT
|
||||
decort_jwt:
|
||||
oauth2_url: "{{ decort_sso }}" # "https://sso.digitalenergy.online"
|
||||
validity: 1200
|
||||
register: my_jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out JWT
|
||||
debug:
|
||||
var: my_jwt.jwt
|
||||
delegate_to: localhost
|
||||
39
examples/kubernetes.yaml
Normal file
39
examples/kubernetes.yaml
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
#
|
||||
# DECORT k8s module example
|
||||
#
|
||||
- hosts: ansible_master
|
||||
tasks:
|
||||
- name: obtain JWT
|
||||
decort_jwt:
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
validity: 1200
|
||||
verify_ssl: false
|
||||
register: token
|
||||
delegate_to: localhost
|
||||
|
||||
- name: create a VM named cluster-test
|
||||
decort_k8s:
|
||||
state: present
|
||||
started: True
|
||||
getConfig: True
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
name: "cluster-test"
|
||||
rg_id: 125
|
||||
k8ci_id: 18
|
||||
workers:
|
||||
- name: wg1
|
||||
ram: 1024
|
||||
cpu: 10
|
||||
disk: 10
|
||||
num: 1
|
||||
- name: wg2
|
||||
ram: 1024
|
||||
cpu: 10
|
||||
disk: 10
|
||||
num: 2
|
||||
verify_ssl: false
|
||||
delegate_to: localhost
|
||||
register: kube
|
||||
@@ -1,190 +0,0 @@
|
||||
#
|
||||
# More details on how to use DECORT Ansible module can be found at:
|
||||
# https://github.com/rudecs/decort-ansible/wiki
|
||||
#
|
||||
|
||||
- hosts: ansible_master
|
||||
vars_files:
|
||||
- vars.yaml
|
||||
tasks:
|
||||
- name: obtain JWT
|
||||
decort_jwt:
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
validity: 1200
|
||||
register: token
|
||||
delegate_to: localhost
|
||||
|
||||
- name: obtain OS image
|
||||
decort_osimage:
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
controller_url: "{{ decort_ctrl }}"
|
||||
image_name: "{{ os_image_name }}"
|
||||
account_name: "{{ target_account_name }}"
|
||||
verify_ssl: false
|
||||
register: my_image
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out the result
|
||||
debug:
|
||||
var: my_image.facts
|
||||
delegate_to: localhost
|
||||
|
||||
- name: manage RG
|
||||
decort_rg:
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
controller_url: "{{ decort_ctrl }}"
|
||||
account_id: 32
|
||||
rg_name: "{{ target_rg_name }}"
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out the result
|
||||
debug:
|
||||
var: my_rg.facts
|
||||
delegate_to: localhost
|
||||
|
||||
- name: manage ViNS 01
|
||||
decort_vins:
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
controller_url: "{{ decort_ctrl }}"
|
||||
vins_name: "{{ vins01_name }}"
|
||||
rg_id: "{{ my_rg.facts.id }}"
|
||||
ext_net_id: "{{ target_ext_net_id }}"
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_vins01
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out the result
|
||||
debug:
|
||||
var: my_vins01.facts
|
||||
delegate_to: localhost
|
||||
|
||||
- name: manage ViNS 02
|
||||
decort_vins:
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
controller_url: "{{ decort_ctrl }}"
|
||||
vins_name: "{{ vins02_name }}"
|
||||
rg_id: "{{ my_rg.facts.id }}"
|
||||
ext_net_id: -1
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_vins02
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out the result
|
||||
debug:
|
||||
var: my_vins02.facts
|
||||
delegate_to: localhost
|
||||
|
||||
- name: manage data disk 01
|
||||
decort_disk:
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
controller_url: "{{ decort_ctrl }}"
|
||||
name: "{{ datadisk01_name }}"
|
||||
size: "{{ datadisk01_size }}"
|
||||
account_name: "{{ target_account_name }}"
|
||||
pool: data01
|
||||
place_with: "{{ my_image.facts.id }}"
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_disk01
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out the result
|
||||
debug:
|
||||
var: my_disk01.facts
|
||||
delegate_to: localhost
|
||||
|
||||
- name: manage data disk 02
|
||||
decort_disk:
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
controller_url: "{{ decort_ctrl }}"
|
||||
name: "{{ datadisk02_name }}"
|
||||
size: "{{ datadisk02_size }}"
|
||||
account_name: "{{ target_account_name }}"
|
||||
pool: data01
|
||||
place_with: "{{ my_image.facts.id }}"
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_disk02
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out the result
|
||||
debug:
|
||||
var: my_disk02.facts
|
||||
delegate_to: localhost
|
||||
|
||||
- name: manage KVM X86 VM
|
||||
decort_kvmvm:
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
controller_url: "{{ decort_ctrl }}"
|
||||
name: "{{ vm01_name }}"
|
||||
arch: KVM_X86
|
||||
ram: "{{ vm01_ram }}"
|
||||
cpu: "{{ vm01_cpu }}"
|
||||
image_id: "{{ my_image.facts.id }}"
|
||||
boot_disk: "{{ vm01_boot_disk }}"
|
||||
data_disks:
|
||||
- "{{ my_disk01.facts.id }}"
|
||||
- "{{ my_disk02.facts.id }}"
|
||||
networks:
|
||||
- type: VINS
|
||||
id: "{{ my_vins01.facts.id }}"
|
||||
- type: VINS
|
||||
id: "{{ my_vins02.facts.id }}"
|
||||
- type: EXTNET
|
||||
id: "{{ target_ext_net_id }}"
|
||||
rg_id: "{{ my_rg.facts.id }}"
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_kvmvm
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out the result
|
||||
debug:
|
||||
var: my_kvmvm.facts
|
||||
delegate_to: localhost
|
||||
|
||||
- name: manage PFW rules on Compute
|
||||
decort_pfw:
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
oauth2_url: "{{ decort_sso }}"
|
||||
controller_url: "{{ decort_ctrl }}"
|
||||
compute_id: "{{ my_kvmvm.facts.id }}"
|
||||
vins_id: "{{ my_vins01.facts.id }}"
|
||||
rules:
|
||||
- public_port_start: 30022
|
||||
local_port: 22
|
||||
proto: tcp
|
||||
- public_port_start: 30080
|
||||
public_port_end: 30085
|
||||
local_port: 30080
|
||||
proto: tcp
|
||||
state: present
|
||||
verify_ssl: false
|
||||
register: my_pfw
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out the result
|
||||
debug:
|
||||
var: my_pfw.facts
|
||||
delegate_to: localhost
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 1. As this file will contain sensitive data (application ID & Secret pair) put this file
|
||||
# in a directory, where only you will have access to it, e.g. your ~/.ssh directory.
|
||||
# 2. Make sure this file is not readable by anybody else (chmod 400).
|
||||
# 3. Paste your Application ID (obtained from DECORT SSO application) to DECORT_APP_ID.
|
||||
# 4. Paste your Application Secret (obtained from DECORT SSO application) to DECORT_APP_SECRET.
|
||||
# 5. Paste DECORT SSO application URL to DECORT_OAUTH2_URL.
|
||||
#
|
||||
# Source this file into shell to prepare environment for running DECORT Ansible module, e.g.
|
||||
# . ~/.ssh/prepenv.sh
|
||||
#
|
||||
# More informaiton on DECORT Ansible module can be found at:
|
||||
# https://github.com/rudecs/decort-ansible/wiki
|
||||
#
|
||||
|
||||
export DECORT_APP_ID="put your application ID here"
|
||||
export DECORT_APP_SECRET="put your application secret here"
|
||||
export DECORT_OAUTH2_URL="put DECORT SSO URL here" # "https://sso.digitalenergy.online"
|
||||
|
||||
export ANSIBLE_HOST_KEY_CHEKCING=False
|
||||
@@ -1,26 +0,0 @@
|
||||
#
|
||||
# More details on how to use DECORT Ansible module can be found at:
|
||||
# https://github.com/rudecs/decort-ansible/wiki
|
||||
#
|
||||
|
||||
decort_sso: "put DECORT SSO application URL here" # "https://sso.digitalenergy.online"
|
||||
decort_ctrl: "put DECORT controller URL here" # "https://ds1.digitalenergy.online"
|
||||
|
||||
target_account_name: "your account name"
|
||||
target_rg_name: "target resource group name"
|
||||
os_image_name: "OS image name"
|
||||
|
||||
vins01_name: "Vins01-ansible"
|
||||
vins02_name: "Vins02-ansible"
|
||||
target_ext_net_id: 0
|
||||
|
||||
datadisk01_name: "Data01-ansible"
|
||||
datadisk01_size: 5
|
||||
|
||||
datadisk02_name: "Data02-ansible"
|
||||
datadisk02_size: 5
|
||||
|
||||
vm01_name: "Vm01-ansible"
|
||||
vm01_cpu: 1
|
||||
vm01_ram: 1024
|
||||
vm01_boot_disk: 10
|
||||
42
examples/vins_connect.yaml
Normal file
42
examples/vins_connect.yaml
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
#
|
||||
# DECORT vins module example
|
||||
#
|
||||
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: obtain JWT
|
||||
decort_jwt:
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
validity: 1200
|
||||
register: my_jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: print out JWT
|
||||
debug:
|
||||
var: my_jwt.jwt
|
||||
delegate_to: localhost
|
||||
|
||||
- name: Manage ViNS at 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"
|
||||
state: present
|
||||
rg_id: 98
|
||||
connect_to:
|
||||
- type: VINS
|
||||
id: 864
|
||||
ipaddr: 192.168.5.66
|
||||
netmask: 24
|
||||
- type: VINS
|
||||
id: 196
|
||||
ipaddr: 192.168.9.133
|
||||
netmask: 24
|
||||
register: managed_vins
|
||||
|
||||
- name: print VINS facter
|
||||
debug:
|
||||
msg: "{{managed_vins.facts.password}}"
|
||||
when: managed_vins.facts.password is defined
|
||||
369
library/decort_account.py
Normal file
369
library/decort_account.py
Normal file
@@ -0,0 +1,369 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
DOCUMENTATION = r'''
|
||||
---
|
||||
module: decort_account
|
||||
|
||||
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
|
||||
'''
|
||||
|
||||
from typing import Iterable
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.decort_utils import DecortController
|
||||
|
||||
|
||||
class DecortAccount(DecortController):
|
||||
OBJ = 'account'
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(AnsibleModule(**self.amodule_init_args))
|
||||
self.check_amodule_args()
|
||||
|
||||
@property
|
||||
def amodule_init_args(self) -> dict:
|
||||
return self.pack_amodule_init_args(
|
||||
argument_spec=dict(
|
||||
access_emails=dict(
|
||||
type='bool',
|
||||
),
|
||||
acl=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
mode=dict(
|
||||
type='str',
|
||||
choices=[
|
||||
'match',
|
||||
'revoke',
|
||||
'update',
|
||||
],
|
||||
default='update',
|
||||
),
|
||||
users=dict(
|
||||
type='list',
|
||||
required=True,
|
||||
elements='dict',
|
||||
options=dict(
|
||||
rights=dict(
|
||||
type='str',
|
||||
choices=['R', 'RCX', 'ARCXDU'],
|
||||
default='R',
|
||||
),
|
||||
id=dict(
|
||||
type='str',
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
name=dict(
|
||||
type='str',
|
||||
),
|
||||
quotas=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
cpu=dict(
|
||||
type='int',
|
||||
),
|
||||
disks_size=dict(
|
||||
type='int',
|
||||
),
|
||||
ext_traffic=dict(
|
||||
type='int',
|
||||
),
|
||||
gpu=dict(
|
||||
type='int',
|
||||
),
|
||||
public_ip=dict(
|
||||
type='int',
|
||||
),
|
||||
ram=dict(
|
||||
type='int',
|
||||
),
|
||||
),
|
||||
),
|
||||
state=dict(
|
||||
type='str',
|
||||
choices=[
|
||||
'absent',
|
||||
'absent_permanently',
|
||||
'confirmed',
|
||||
'disabled',
|
||||
'present',
|
||||
],
|
||||
default='present',
|
||||
),
|
||||
sep_pools=dict(
|
||||
type='list',
|
||||
elements='dict',
|
||||
options=dict(
|
||||
sep_id=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
pool_names=dict(
|
||||
type='list',
|
||||
required=True,
|
||||
elements='str',
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
required_one_of=[
|
||||
('id', 'name')
|
||||
],
|
||||
supports_check_mode=True,
|
||||
)
|
||||
|
||||
def check_amodule_args(self):
|
||||
"""
|
||||
Additional Ansible Module arguments validation that
|
||||
cannot be implemented using Ansible Argument spec.
|
||||
"""
|
||||
|
||||
arg_state = self.aparams['state']
|
||||
if 'absent' in arg_state:
|
||||
# Parameters or combinations of parameters that can
|
||||
# cause changing the object.
|
||||
changing_params = [
|
||||
'access_emails',
|
||||
'acl',
|
||||
['id', 'name'],
|
||||
'quotas',
|
||||
]
|
||||
check_error = False
|
||||
for elem in changing_params:
|
||||
if isinstance(elem, str):
|
||||
param = elem
|
||||
if self.aparams[elem] is not None:
|
||||
self.message(
|
||||
f'If the parameter "state" is set to'
|
||||
f' "{arg_state}", then using the parameter'
|
||||
f' "{param}" is not allowed.'
|
||||
)
|
||||
check_error = True
|
||||
elif isinstance(elem, Iterable):
|
||||
params = elem
|
||||
params_using = map(
|
||||
lambda x: self.aparams[x] is not None, params
|
||||
)
|
||||
if all(params_using):
|
||||
params_str = ', '.join(f'"{p}"' for p in params)
|
||||
self.message(
|
||||
f'If the parameter "state" is set to'
|
||||
f' "{arg_state}", then using the combination'
|
||||
f' of parameters {params_str} are not allowed.'
|
||||
)
|
||||
check_error = True
|
||||
if check_error:
|
||||
self.exit(fail=True)
|
||||
|
||||
def run(self):
|
||||
self.get_info()
|
||||
self.change()
|
||||
self.exit()
|
||||
|
||||
def get_info(self):
|
||||
# If this is the first getting info
|
||||
if not getattr(self, 'id', None):
|
||||
self.id, self.facts = self.account_find(
|
||||
account_name=self.aparams['name'],
|
||||
account_id=self.aparams['id'],
|
||||
)
|
||||
# If this is a repeated getting info
|
||||
else:
|
||||
# If check mode is enabled, there is no needed to
|
||||
# request info again
|
||||
if not self.amodule.check_mode:
|
||||
self.id, self.facts = self.account_find(account_id=self.id)
|
||||
|
||||
def change(self):
|
||||
self.change_state()
|
||||
|
||||
self.change_acl()
|
||||
|
||||
if self.account_update_args:
|
||||
self.account_update(account_id=self.id,
|
||||
**self.account_update_args)
|
||||
self.get_info()
|
||||
|
||||
def change_state(self):
|
||||
match self.facts:
|
||||
case None:
|
||||
self.message(self.MESSAGES.obj_not_found(obj=self.OBJ))
|
||||
match self.aparams:
|
||||
case {'state': 'absent' | 'absent_permanently'}:
|
||||
pass
|
||||
case {'state': 'confirmed' | 'disabled' | 'present'}:
|
||||
self.exit(fail=True)
|
||||
case {'status': 'DESTROYED'}:
|
||||
match self.aparams:
|
||||
case {'state': 'absent' | 'absent_permanently'}:
|
||||
self.message(
|
||||
self.MESSAGES.obj_deleted(
|
||||
obj=self.OBJ,
|
||||
id=self.id,
|
||||
permanently=True,
|
||||
already=True,
|
||||
)
|
||||
)
|
||||
case {'state': 'confirmed' | 'disabled' | 'present'}:
|
||||
self.message(
|
||||
self.MESSAGES.obj_not_restored(obj=self.OBJ,
|
||||
id=self.id)
|
||||
)
|
||||
self.exit(fail=True)
|
||||
case {'status': 'DELETED'}:
|
||||
match self.aparams:
|
||||
case {'state': 'absent'}:
|
||||
self.message(
|
||||
self.MESSAGES.obj_deleted(
|
||||
obj=self.OBJ,
|
||||
id=self.id,
|
||||
permanently=False,
|
||||
already=True,
|
||||
)
|
||||
)
|
||||
case {'state': 'absent_permanently'}:
|
||||
self.delete(permanently=True)
|
||||
case {'state': 'confirmed' | 'present'}:
|
||||
self.restore()
|
||||
case {'state': 'disabled'}:
|
||||
self.restore()
|
||||
self.disable()
|
||||
case {'status': 'CONFIRMED'}:
|
||||
match self.aparams:
|
||||
case {'state': 'absent'}:
|
||||
self.delete()
|
||||
case {'state': 'absent_permanently'}:
|
||||
self.delete(permanently=True)
|
||||
case {'state': 'confirmed' | 'present'}:
|
||||
pass
|
||||
case {'state': 'disabled'}:
|
||||
self.disable()
|
||||
case {'status': 'DISABLED'}:
|
||||
match self.aparams:
|
||||
case {'state': 'absent'}:
|
||||
self.delete()
|
||||
case {'state': 'absent_permanently'}:
|
||||
self.delete(permanently=True)
|
||||
case {'state': 'confirmed'}:
|
||||
self.enable()
|
||||
case {'state': 'present' | 'disabled'}:
|
||||
pass
|
||||
|
||||
def delete(self, permanently=False):
|
||||
self.account_delete(account_id=self.id, permanently=permanently)
|
||||
self.get_info()
|
||||
|
||||
def disable(self):
|
||||
self.account_disable(account_id=self.id)
|
||||
self.get_info()
|
||||
|
||||
def enable(self):
|
||||
self.account_enable(account_id=self.id)
|
||||
self.get_info()
|
||||
|
||||
def restore(self):
|
||||
self.account_restore(account_id=self.id)
|
||||
self.get_info()
|
||||
|
||||
def change_acl(self):
|
||||
if not self.aparams['acl']:
|
||||
return
|
||||
|
||||
actual_users = {u['userGroupId']: u['right'] for u in self.facts['acl']}
|
||||
actual_users_ids = set(actual_users.keys())
|
||||
|
||||
aparams_acl = self.aparams['acl']
|
||||
aparams_users = {u['id']: u['rights'] for u in aparams_acl['users']}
|
||||
aparams_users_ids = set(aparams_users.keys())
|
||||
|
||||
del_users_ids = None
|
||||
upd_users = None
|
||||
new_users = None
|
||||
|
||||
match aparams_acl:
|
||||
case {'mode': 'revoke'}:
|
||||
del_users_ids = aparams_users_ids.intersection(actual_users_ids)
|
||||
case {'mode': 'update' | 'match' as mode}:
|
||||
new_users_ids = aparams_users_ids.difference(actual_users_ids)
|
||||
new_users = dict(
|
||||
u for u in aparams_users.items() if u[0] in new_users_ids
|
||||
)
|
||||
|
||||
upd_users_ids =\
|
||||
aparams_users_ids.intersection(actual_users_ids)
|
||||
upd_users = dict()
|
||||
for id in upd_users_ids:
|
||||
if actual_users[id] == 'CXDRAU':
|
||||
actual_user_rights = 'ARCXDU'
|
||||
else:
|
||||
actual_user_rights = actual_users[id]
|
||||
|
||||
if actual_user_rights != aparams_users[id]:
|
||||
upd_users[id] = aparams_users[id]
|
||||
|
||||
if mode == 'match':
|
||||
del_users_ids =\
|
||||
actual_users_ids.difference(aparams_users_ids)
|
||||
|
||||
if del_users_ids or new_users or upd_users:
|
||||
self.account_change_acl(account_id=self.id,
|
||||
del_users=del_users_ids,
|
||||
add_users=new_users,
|
||||
upd_users=upd_users)
|
||||
self.get_info()
|
||||
|
||||
@property
|
||||
def account_update_args(self) -> dict:
|
||||
result_args = dict()
|
||||
|
||||
aparam_access_emails = self.aparams['access_emails']
|
||||
if (aparam_access_emails is not None
|
||||
and self.facts['sendAccessEmails'] != aparam_access_emails):
|
||||
result_args['access_emails'] = aparam_access_emails
|
||||
|
||||
aparam_name = self.aparams['name']
|
||||
if (self.aparams['id'] and aparam_name
|
||||
and self.facts['name'] != aparam_name):
|
||||
result_args['name'] = aparam_name
|
||||
|
||||
aparam_quotas = self.aparams['quotas']
|
||||
if aparam_quotas:
|
||||
quotas_naming = [
|
||||
['cpu', 'CU_C', 'cpu_quota'],
|
||||
['disks_size', 'CU_DM', 'disks_size_quota'],
|
||||
['ext_traffic', 'CU_NP', 'ext_traffic_quota'],
|
||||
['gpu', 'gpu_units', 'gpu_quota'],
|
||||
['public_ip', 'CU_I', 'public_ip_quota'],
|
||||
['ram', 'CU_M', 'ram_quota'],
|
||||
]
|
||||
for aparam, info_key, result_arg in quotas_naming:
|
||||
current_value = int(self.facts['resourceLimits'][info_key])
|
||||
if (aparam_quotas[aparam] is not None
|
||||
and current_value != aparam_quotas[aparam]):
|
||||
result_args[result_arg] = aparam_quotas[aparam]
|
||||
|
||||
aparam_sep_pools = self.aparams['sep_pools']
|
||||
if aparam_sep_pools is not None:
|
||||
sep_pools = set()
|
||||
for sep in aparam_sep_pools:
|
||||
for pool_name in sep['pool_names']:
|
||||
sep_pools.add(
|
||||
f'{sep["sep_id"]}_{pool_name}'
|
||||
)
|
||||
if set(self.facts['uniqPools']) != sep_pools:
|
||||
result_args['sep_pools'] = sep_pools
|
||||
return result_args
|
||||
|
||||
|
||||
def main():
|
||||
DecortAccount().run()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
578
library/decort_account_info.py
Normal file
578
library/decort_account_info.py
Normal file
@@ -0,0 +1,578 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
DOCUMENTATION = r'''
|
||||
---
|
||||
module: decort_account_info
|
||||
|
||||
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.decort_utils import DecortController
|
||||
|
||||
|
||||
class DecortAccountInfo(DecortController):
|
||||
def __init__(self):
|
||||
super().__init__(AnsibleModule(**self.amodule_init_args))
|
||||
|
||||
@property
|
||||
def amodule_init_args(self) -> dict:
|
||||
return self.pack_amodule_init_args(
|
||||
argument_spec=dict(
|
||||
audits=dict(
|
||||
type='bool',
|
||||
default=False
|
||||
),
|
||||
computes=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
filter=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
ext_net_id=dict(
|
||||
type='int',
|
||||
),
|
||||
ext_net_name=dict(
|
||||
type='str'
|
||||
),
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
ip=dict(
|
||||
type='str'
|
||||
),
|
||||
name=dict(
|
||||
type='str'
|
||||
),
|
||||
rg_id=dict(
|
||||
type='int',
|
||||
),
|
||||
rg_name=dict(
|
||||
type='str'
|
||||
),
|
||||
tech_status=dict(
|
||||
type='str',
|
||||
choices=self.COMPUTE_TECH_STATUSES,
|
||||
),
|
||||
),
|
||||
),
|
||||
pagination=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
number=dict(
|
||||
type='int',
|
||||
default=1,
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
sorting=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
asc=dict(
|
||||
type='bool',
|
||||
default=True,
|
||||
),
|
||||
field=dict(
|
||||
type='str',
|
||||
choices=\
|
||||
self.FIELDS_FOR_SORTING_ACCOUNT_COMPUTE_LIST,
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
disks=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
filter=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
name=dict(
|
||||
type='str',
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
),
|
||||
type=dict(
|
||||
type='str',
|
||||
choices=self.DISK_TYPES,
|
||||
),
|
||||
),
|
||||
),
|
||||
pagination=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
number=dict(
|
||||
type='int',
|
||||
default=1,
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
sorting=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
asc=dict(
|
||||
type='bool',
|
||||
default=True,
|
||||
),
|
||||
field=dict(
|
||||
type='str',
|
||||
choices=\
|
||||
self.FIELDS_FOR_SORTING_ACCOUNT_DISK_LIST,
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
flip_groups=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
filter=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
ext_net_id=dict(
|
||||
type='int',
|
||||
),
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
ip=dict(
|
||||
type='str',
|
||||
),
|
||||
name=dict(
|
||||
type='str',
|
||||
),
|
||||
vins_id=dict(
|
||||
type='int',
|
||||
),
|
||||
vins_name=dict(
|
||||
type='str',
|
||||
),
|
||||
),
|
||||
),
|
||||
pagination=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
number=dict(
|
||||
type='int',
|
||||
default=1,
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
images=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
filter=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
name=dict(
|
||||
type='str',
|
||||
),
|
||||
type=dict(
|
||||
type='str',
|
||||
choices=self.IMAGE_TYPES,
|
||||
),
|
||||
),
|
||||
),
|
||||
pagination=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
number=dict(
|
||||
type='int',
|
||||
default=1,
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
sorting=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
asc=dict(
|
||||
type='bool',
|
||||
default=True,
|
||||
),
|
||||
field=dict(
|
||||
type='str',
|
||||
choices=\
|
||||
self.FIELDS_FOR_SORTING_ACCOUNT_IMAGE_LIST,
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
name=dict(
|
||||
type='str',
|
||||
),
|
||||
resource_groups=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
filter=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
name=dict(
|
||||
type='str'
|
||||
),
|
||||
status=dict(
|
||||
type='str',
|
||||
choices=self.RESOURCE_GROUP_STATUSES,
|
||||
),
|
||||
vins_id=dict(
|
||||
type='int'
|
||||
),
|
||||
vm_id=dict(
|
||||
type='int'
|
||||
),
|
||||
),
|
||||
),
|
||||
pagination=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
number=dict(
|
||||
type='int',
|
||||
default=1,
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
sorting=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
asc=dict(
|
||||
type='bool',
|
||||
default=True,
|
||||
),
|
||||
field=dict(
|
||||
type='str',
|
||||
choices=\
|
||||
self.FIELDS_FOR_SORTING_ACCOUNT_RG_LIST,
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
resource_consumption=dict(
|
||||
type='bool',
|
||||
default=False
|
||||
),
|
||||
vinses=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
filter=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
ext_ip=dict(
|
||||
type='str',
|
||||
),
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
name=dict(
|
||||
type='str'
|
||||
),
|
||||
rg_id=dict(
|
||||
type='int',
|
||||
),
|
||||
),
|
||||
),
|
||||
pagination=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
number=dict(
|
||||
type='int',
|
||||
default=1,
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
sorting=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
asc=dict(
|
||||
type='bool',
|
||||
default=True,
|
||||
),
|
||||
field=dict(
|
||||
type='str',
|
||||
choices=\
|
||||
self.FIELDS_FOR_SORTING_ACCOUNT_VINS_LIST,
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
mutually_exclusive=[
|
||||
('id', 'name')
|
||||
],
|
||||
required_one_of=[
|
||||
('id', 'name')
|
||||
],
|
||||
supports_check_mode=True,
|
||||
)
|
||||
|
||||
@property
|
||||
def mapped_computes_args(self) -> None | dict:
|
||||
"""
|
||||
Map the module argument `computes` to
|
||||
arguments dictionary for the method
|
||||
`DecortController.account_computes`
|
||||
(excluding for `account_id`).
|
||||
"""
|
||||
|
||||
input_args = self.aparams['computes']
|
||||
if not input_args:
|
||||
return input_args
|
||||
|
||||
mapped_args = {}
|
||||
if input_args['filter']:
|
||||
mapped_args['compute_id'] = input_args['filter']['id']
|
||||
mapped_args['compute_ip'] = input_args['filter']['ip']
|
||||
mapped_args['compute_name'] = input_args['filter']['name']
|
||||
mapped_args['compute_tech_status'] =\
|
||||
input_args['filter']['tech_status']
|
||||
mapped_args['ext_net_id'] = input_args['filter']['ext_net_id']
|
||||
mapped_args['ext_net_name'] =\
|
||||
input_args['filter']['ext_net_name']
|
||||
mapped_args['rg_id'] = input_args['filter']['rg_id']
|
||||
mapped_args['rg_name'] = input_args['filter']['rg_name']
|
||||
if input_args['pagination']:
|
||||
mapped_args['page_number'] =\
|
||||
input_args['pagination']['number']
|
||||
mapped_args['page_size'] =\
|
||||
input_args['pagination']['size']
|
||||
if input_args['sorting']:
|
||||
mapped_args['sort_by_asc'] =\
|
||||
input_args['sorting']['asc']
|
||||
mapped_args['sort_by_field'] =\
|
||||
input_args['sorting']['field']
|
||||
|
||||
return mapped_args
|
||||
|
||||
@property
|
||||
def mapped_disks_args(self) -> None | dict:
|
||||
"""
|
||||
Map the module argument `disks` to
|
||||
arguments dictionary for the method
|
||||
`DecortController.account_disks`
|
||||
(excluding for `account_id`).
|
||||
"""
|
||||
|
||||
input_args = self.aparams['disks']
|
||||
if not input_args:
|
||||
return input_args
|
||||
|
||||
mapped_args = {}
|
||||
if input_args['filter']:
|
||||
mapped_args['disk_id'] = input_args['filter']['id']
|
||||
mapped_args['disk_name'] = input_args['filter']['name']
|
||||
mapped_args['disk_size'] = input_args['filter']['size']
|
||||
mapped_args['disk_type'] = input_args['filter']['type']
|
||||
if input_args['pagination']:
|
||||
mapped_args['page_number'] =\
|
||||
input_args['pagination']['number']
|
||||
mapped_args['page_size'] =\
|
||||
input_args['pagination']['size']
|
||||
if input_args['sorting']:
|
||||
mapped_args['sort_by_asc'] =\
|
||||
input_args['sorting']['asc']
|
||||
mapped_args['sort_by_field'] =\
|
||||
input_args['sorting']['field']
|
||||
|
||||
return mapped_args
|
||||
|
||||
@property
|
||||
def mapped_flip_groups_args(self) -> None | dict:
|
||||
"""
|
||||
Map the module argument `flip_groups` to
|
||||
arguments dictionary for the method
|
||||
`DecortController.account_flip_groups`
|
||||
(excluding for `account_id`).
|
||||
"""
|
||||
|
||||
input_args = self.aparams['flip_groups']
|
||||
if not input_args:
|
||||
return input_args
|
||||
|
||||
mapped_args = {}
|
||||
if input_args['filter']:
|
||||
mapped_args['ext_net_id'] = input_args['filter']['ext_net_id']
|
||||
mapped_args['flig_group_id'] = input_args['filter']['id']
|
||||
mapped_args['flig_group_ip'] = input_args['filter']['ip']
|
||||
mapped_args['flig_group_name'] = input_args['filter']['name']
|
||||
mapped_args['vins_id'] = input_args['filter']['vins_id']
|
||||
mapped_args['vins_name'] = input_args['filter']['vins_name']
|
||||
if input_args['pagination']:
|
||||
mapped_args['page_number'] =\
|
||||
input_args['pagination']['number']
|
||||
mapped_args['page_size'] =\
|
||||
input_args['pagination']['size']
|
||||
|
||||
return mapped_args
|
||||
|
||||
@property
|
||||
def mapped_images_args(self) -> None | dict:
|
||||
"""
|
||||
Map the module argument `images` to
|
||||
arguments dictionary for the method
|
||||
`DecortController.account_images`
|
||||
(excluding for `account_id`).
|
||||
"""
|
||||
|
||||
input_args = self.aparams['images']
|
||||
if not input_args:
|
||||
return input_args
|
||||
|
||||
mapped_args = {}
|
||||
if input_args['filter']:
|
||||
mapped_args['image_id'] = input_args['filter']['id']
|
||||
mapped_args['image_name'] = input_args['filter']['name']
|
||||
mapped_args['image_type'] = input_args['filter']['type']
|
||||
if input_args['pagination']:
|
||||
mapped_args['page_number'] =\
|
||||
input_args['pagination']['number']
|
||||
mapped_args['page_size'] =\
|
||||
input_args['pagination']['size']
|
||||
if input_args['sorting']:
|
||||
mapped_args['sort_by_asc'] =\
|
||||
input_args['sorting']['asc']
|
||||
mapped_args['sort_by_field'] =\
|
||||
input_args['sorting']['field']
|
||||
|
||||
return mapped_args
|
||||
|
||||
@property
|
||||
def mapped_rg_args(self) -> None | dict:
|
||||
"""
|
||||
Map the module argument `resource_groups` to
|
||||
arguments dictionary for the method
|
||||
`DecortController.account_resource_groups`
|
||||
(excluding for `account_id`).
|
||||
"""
|
||||
|
||||
input_args = self.aparams['resource_groups']
|
||||
if not input_args:
|
||||
return input_args
|
||||
|
||||
mapped_args = {}
|
||||
if input_args['filter']:
|
||||
mapped_args['rg_id'] =\
|
||||
input_args['filter']['id']
|
||||
mapped_args['rg_name'] =\
|
||||
input_args['filter']['name']
|
||||
mapped_args['rg_status'] =\
|
||||
input_args['filter']['status']
|
||||
mapped_args['vins_id'] =\
|
||||
input_args['filter']['vins_id']
|
||||
mapped_args['vm_id'] =\
|
||||
input_args['filter']['vm_id']
|
||||
if input_args['pagination']:
|
||||
mapped_args['page_number'] =\
|
||||
input_args['pagination']['number']
|
||||
mapped_args['page_size'] =\
|
||||
input_args['pagination']['size']
|
||||
if input_args['sorting']:
|
||||
mapped_args['sort_by_asc'] =\
|
||||
input_args['sorting']['asc']
|
||||
mapped_args['sort_by_field'] =\
|
||||
input_args['sorting']['field']
|
||||
|
||||
return mapped_args
|
||||
|
||||
@property
|
||||
def mapped_vinses_args(self) -> None | dict:
|
||||
"""
|
||||
Map the module argument `vinses` to
|
||||
arguments dictionary for the method
|
||||
`DecortController.account_vinses`
|
||||
(excluding for `account_id`).
|
||||
"""
|
||||
|
||||
input_args = self.aparams['vinses']
|
||||
if not input_args:
|
||||
return input_args
|
||||
|
||||
mapped_args = {}
|
||||
if input_args['filter']:
|
||||
mapped_args['vins_id'] = input_args['filter']['id']
|
||||
mapped_args['vins_name'] = input_args['filter']['name']
|
||||
mapped_args['ext_ip'] = input_args['filter']['ext_ip']
|
||||
mapped_args['rg_id'] = input_args['filter']['rg_id']
|
||||
if input_args['pagination']:
|
||||
mapped_args['page_number'] =\
|
||||
input_args['pagination']['number']
|
||||
mapped_args['page_size'] =\
|
||||
input_args['pagination']['size']
|
||||
if input_args['sorting']:
|
||||
mapped_args['sort_by_asc'] =\
|
||||
input_args['sorting']['asc']
|
||||
mapped_args['sort_by_field'] =\
|
||||
input_args['sorting']['field']
|
||||
|
||||
return mapped_args
|
||||
|
||||
def run(self):
|
||||
self.get_info()
|
||||
self.exit()
|
||||
|
||||
def get_info(self):
|
||||
self.id, self.facts = self.account_find(
|
||||
account_name=self.aparams['name'],
|
||||
account_id=self.aparams['id'],
|
||||
audits=self.aparams['audits'],
|
||||
computes_args=self.mapped_computes_args,
|
||||
disks_args=self.mapped_disks_args,
|
||||
flip_groups_args=self.mapped_flip_groups_args,
|
||||
images_args=self.mapped_images_args,
|
||||
resource_consumption=self.aparams['resource_consumption'],
|
||||
resource_groups_args=self.mapped_rg_args,
|
||||
vinses_args=self.mapped_vinses_args,
|
||||
fail_if_not_found=True,
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
DecortAccountInfo().run()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
283
library/decort_bservice.py
Normal file
283
library/decort_bservice.py
Normal file
@@ -0,0 +1,283 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
DOCUMENTATION = r'''
|
||||
---
|
||||
module: decort_bservice
|
||||
|
||||
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)
|
||||
|
||||
validated_acc_id = 0
|
||||
validated_rg_id = 0
|
||||
self.bservice_info = None
|
||||
if arg_amodule.params['name'] == "" and arg_amodule.params['id'] == 0:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = "Cannot manage Basic Services when its ID is 0 and name is empty."
|
||||
self.fail_json(**self.result)
|
||||
if not arg_amodule.params['id']:
|
||||
if not arg_amodule.params['rg_id']: # RG ID is not set -> locate RG by name -> need account ID
|
||||
validated_acc_id, _ = self.account_find(arg_amodule.params['account_name'],
|
||||
arg_amodule.params['account_id'])
|
||||
if not validated_acc_id:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = ("Current user does not have access to the account ID {} / "
|
||||
"name '{}' or non-existent account specified.").format(arg_amodule.params['account_id'],
|
||||
arg_amodule.params['account_name'])
|
||||
self.fail_json(**self.result)
|
||||
# fail the module -> exit
|
||||
# now validate RG
|
||||
validated_rg_id, validated_rg_facts = self.rg_find(
|
||||
arg_account_id=validated_acc_id,
|
||||
arg_rg_id=arg_amodule.params['rg_id'],
|
||||
arg_rg_name=arg_amodule.params['rg_name']
|
||||
)
|
||||
if not validated_rg_id:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = "Cannot find RG ID {} / name '{}'.".format(arg_amodule.params['rg_id'],
|
||||
arg_amodule.params['rg_name'])
|
||||
self.fail_json(**self.result)
|
||||
|
||||
arg_amodule.params['rg_id'] = validated_rg_id
|
||||
arg_amodule.params['rg_name'] = validated_rg_facts['name']
|
||||
validated_acc_id = validated_rg_facts['accountId']
|
||||
|
||||
self.bservice_id, self.bservice_info = self.bservice_find(
|
||||
validated_acc_id,
|
||||
validated_rg_id,
|
||||
arg_amodule.params['name'],
|
||||
arg_amodule.params['id']
|
||||
)
|
||||
|
||||
if self.bservice_id == 0:
|
||||
self.bservice_should_exist = False
|
||||
else:
|
||||
self.bservice_should_exist = True
|
||||
|
||||
def nop(self):
|
||||
"""No operation (NOP) handler for B-service.
|
||||
This function is intended to be called from the main switch construct of the module
|
||||
when current state -> desired state change logic does not require any changes to
|
||||
the actual Compute state.
|
||||
"""
|
||||
self.result['failed'] = False
|
||||
self.result['changed'] = False
|
||||
if self.bservice_id:
|
||||
self.result['msg'] = ("No state change required for B-service ID {} because of its "
|
||||
"current status '{}'.").format(self.bservice_id, self.bservice_info['status'])
|
||||
else:
|
||||
self.result['msg'] = ("No state change to '{}' can be done for "
|
||||
"non-existent B-service instance.").format(self.amodule.params['state'])
|
||||
return
|
||||
|
||||
def error(self):
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
if self.bservice_id:
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for B-service ID {} in the "
|
||||
"current status '{}'.").format(self.bservice_id,
|
||||
self.amodule.params['state'],
|
||||
self.bservice_info['status'])
|
||||
else:
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for non-existent B-service name '{}' "
|
||||
"in RG ID {} / name '{}'").format(self.amodule.params['state'],
|
||||
self.amodule.params['name'],
|
||||
self.amodule.params['rg_id'],
|
||||
self.amodule.params['rg_name'])
|
||||
return
|
||||
|
||||
def create(self):
|
||||
self.bservice_id = self.bservice_id = self.bservice_provision(
|
||||
self.amodule.params['name'],
|
||||
self.amodule.params['rg_id'],
|
||||
self.amodule.params['sshuser'],
|
||||
self.amodule.params['sshkey']
|
||||
)
|
||||
if self.bservice_id:
|
||||
_, self.bservice_info = self.bservice_get_by_id(self.bservice_id)
|
||||
self.bservice_state(self.bservice_info,'enabled',self.amodule.params['started'])
|
||||
return
|
||||
|
||||
def action(self,d_state,started=False):
|
||||
self.bservice_state(self.bservice_info,d_state,started)
|
||||
return
|
||||
|
||||
def restore(self):
|
||||
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = "Restore B-Service ID {} manualy.".format(self.bservice_id)
|
||||
pass
|
||||
|
||||
def destroy(self):
|
||||
self.bservice_delete(self.bservice_id)
|
||||
self.bservice_info['status'] = 'DELETED'
|
||||
self.bservice_should_exist = False
|
||||
return
|
||||
|
||||
def package_facts(self,check_mode=False):
|
||||
|
||||
ret_dict = dict(
|
||||
name="",
|
||||
state="CHECK_MODE",
|
||||
account_id=0,
|
||||
rg_id=0,
|
||||
config=None,
|
||||
)
|
||||
|
||||
if check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
ret_dict['id'] = self.bservice_info['id']
|
||||
ret_dict['name'] = self.bservice_info['name']
|
||||
ret_dict['techStatus'] = self.bservice_info['techStatus']
|
||||
ret_dict['state'] = self.bservice_info['status']
|
||||
ret_dict['rg_id'] = self.bservice_info['rgId']
|
||||
ret_dict['account_id'] = self.bservice_info['accountId']
|
||||
ret_dict['groups'] = self.bservice_info['groups']
|
||||
return ret_dict
|
||||
@staticmethod
|
||||
def build_parameters():
|
||||
return dict(
|
||||
account_id=dict(type='int', required=False),
|
||||
account_name=dict(type='str', required=False, default=''),
|
||||
app_id=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'disabled', 'enabled', 'present','check']),
|
||||
started=dict(type='bool', required=False, default=True),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
name=dict(type='str', required=False, default=''),
|
||||
sshuser=dict(type='str', required=False,default=None),
|
||||
sshkey=dict(type='str', required=False,default=None),
|
||||
id=dict(type='int', required=False, default=0),
|
||||
rg_id=dict(type='int', default=0),
|
||||
rg_name=dict(type='str',default=""),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),)
|
||||
def main():
|
||||
module_parameters = decort_bservice.build_parameters()
|
||||
|
||||
amodule = AnsibleModule(argument_spec=module_parameters,
|
||||
supports_check_mode=True,
|
||||
mutually_exclusive=[
|
||||
['oauth2', 'password'],
|
||||
['password', 'jwt'],
|
||||
['jwt', 'oauth2'],
|
||||
],
|
||||
required_together=[
|
||||
['app_id', 'app_secret'],
|
||||
['user', 'password'],
|
||||
],
|
||||
required_one_of=[
|
||||
['id', 'name'],
|
||||
['rg_id','rg_name']
|
||||
],
|
||||
)
|
||||
|
||||
subj = decort_bservice(amodule)
|
||||
|
||||
if amodule.params['state'] == 'check':
|
||||
subj.result['changed'] = False
|
||||
if subj.bservice_id:
|
||||
subj.result['failed'] = False
|
||||
subj.result['facts'] = subj.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**subj.result)
|
||||
# we exit the module at this point
|
||||
else:
|
||||
subj.result['failed'] = True
|
||||
subj.result['msg'] = ("Cannot locate B-service name '{}'. Other arguments are: B-service ID {}, "
|
||||
"RG name '{}', RG ID {}, Account '{}'.").format(amodule.params['name'],
|
||||
amodule.params['id'],
|
||||
amodule.params['rg_name'],
|
||||
amodule.params['rg_id'],
|
||||
amodule.params['account_name'])
|
||||
amodule.fail_json(**subj.result)
|
||||
pass
|
||||
|
||||
|
||||
#MAIN MANAGE PART
|
||||
|
||||
if subj.bservice_id:
|
||||
if subj.bservice_info['status'] in ("DELETING","DESTROYNG","RECONFIGURING","DESTROYING",
|
||||
"ENABLING","DISABLING","RESTORING","MODELED"):
|
||||
subj.error()
|
||||
elif subj.bservice_info['status'] == "DELETED":
|
||||
if amodule.params['state'] in ('disabled', 'enabled', 'present'):
|
||||
subj.restore(subj.bservice_id)
|
||||
subj.action(amodule.params['state'],amodule.params['started'])
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.nop()
|
||||
elif subj.bservice_info['techStatus'] in ("STARTED","STOPPED"):
|
||||
if amodule.params['state'] == 'disabled':
|
||||
subj.action(amodule.params['state'],amodule.params['started'])
|
||||
elif amodule.params['state'] == 'absent':
|
||||
subj.destroy()
|
||||
else:
|
||||
subj.action(amodule.params['state'],amodule.params['started'])
|
||||
elif subj.bservice_info['status'] == "DISABLED":
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.destroy()
|
||||
elif amodule.params['state'] in ('present','enabled'):
|
||||
subj.action(amodule.params['state'],amodule.params['started'])
|
||||
else:
|
||||
subj.nop()
|
||||
elif subj.bservice_info['status'] == "DESTROED":
|
||||
if amodule.params['state'] in ('present','enabled'):
|
||||
subj.create()
|
||||
subj.action(amodule.params['state'],amodule.params['started'])
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.nop()
|
||||
else:
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.nop()
|
||||
if amodule.params['state'] in ('present','started'):
|
||||
subj.create()
|
||||
elif amodule.params['state'] in ('stopped', 'disabled','enabled'):
|
||||
subj.error()
|
||||
|
||||
if subj.result['failed']:
|
||||
amodule.fail_json(**subj.result)
|
||||
else:
|
||||
if subj.bservice_should_exist:
|
||||
subj.result['facts'] = subj.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**subj.result)
|
||||
else:
|
||||
amodule.exit_json(**subj.result)
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,237 +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_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
|
||||
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
|
||||
attached_to: 18
|
||||
gid: 1001
|
||||
description: See L(Module Documentation,https://repository.basistech.ru/BASIS/decort-ansible/wiki/Home).
|
||||
'''
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
@@ -240,97 +13,243 @@ from ansible.module_utils.basic import env_fallback
|
||||
from ansible.module_utils.decort_utils import *
|
||||
|
||||
|
||||
def decort_disk_package_facts(disk_facts, check_mode=False):
|
||||
"""Package a dictionary of disk facts according to the decort_disk module specification.
|
||||
This dictionary will be returned to the upstream Ansible engine at the completion of
|
||||
the module run.
|
||||
class decort_disk(DecortController):
|
||||
def __init__(self,arg_amodule):
|
||||
super(decort_disk, self).__init__(arg_amodule)
|
||||
|
||||
@param (dict) disk_facts: dictionary with Disk facts as returned by API call to .../disks/get
|
||||
@param (bool) check_mode: boolean that tells if this Ansible module is run in check mode
|
||||
"""
|
||||
validated_acc_id = 0
|
||||
validated_acc_info = None
|
||||
self.disk_id = 0
|
||||
self.account_id = 0
|
||||
# limitIO check for exclusive parameters
|
||||
|
||||
if arg_amodule.params['limitIO']:
|
||||
self.disk_check_iotune_arg(arg_amodule.params['limitIO'])
|
||||
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
state="CHECK_MODE",
|
||||
size=0,
|
||||
account_id=0,
|
||||
sep_id=0,
|
||||
pool="none",
|
||||
attached_to=0,
|
||||
gid=0
|
||||
)
|
||||
if not arg_amodule.params['id']:
|
||||
if (
|
||||
not arg_amodule.params['account_id']
|
||||
and not arg_amodule.params['account_name']
|
||||
):
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = (
|
||||
'Cannot manage Disk by name without specifying account ID '
|
||||
'or name.'
|
||||
)
|
||||
self.amodule.fail_json(**self.result)
|
||||
validated_acc_id, validated_acc_info = self.account_find(
|
||||
arg_amodule.params['account_name'],
|
||||
arg_amodule.params['account_id'])
|
||||
if not validated_acc_id:
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = (
|
||||
f"Current user does not have access to the account "
|
||||
f"ID {arg_amodule.params['account_id']} / "
|
||||
f"name '{arg_amodule.params['account_name']}' "
|
||||
f"or non-existent account specified."
|
||||
)
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
self.acc_id = validated_acc_id
|
||||
self.acc_info = validated_acc_info
|
||||
validated_disk_id, validated_disk_facts = self.disk_find(
|
||||
disk_id=arg_amodule.params['id'],
|
||||
name=arg_amodule.params['name'] if "name" in arg_amodule.params else "",
|
||||
account_id=self.acc_id,
|
||||
check_state=False,
|
||||
)
|
||||
|
||||
if arg_amodule.params['place_with']:
|
||||
image_id, image_facts = self.image_find(arg_amodule.params['place_with'], "", 0)
|
||||
arg_amodule.params['sep_id'] = image_facts['sepId']
|
||||
|
||||
self.disk_id = validated_disk_id
|
||||
self.disk_info = validated_disk_facts
|
||||
|
||||
def create(self):
|
||||
|
||||
self.disk_id = self.disk_create(accountId=self.acc_id,
|
||||
name = self.amodule.params['name'],
|
||||
description=self.amodule.params['description'],
|
||||
size=self.amodule.params['size'],
|
||||
type=self.amodule.params['type'],
|
||||
iops=self.amodule.params['iops'],
|
||||
sep_id=self.amodule.params['sep_id'],
|
||||
pool=self.amodule.params['pool'],
|
||||
)
|
||||
#IO tune
|
||||
if self.amodule.params['limitIO']:
|
||||
self.disk_limitIO(disk_id=self.disk_id,
|
||||
limits=self.amodule.params['limitIO'])
|
||||
#set share status
|
||||
if self.amodule.params['shareable'] and self.amodule.params['type'] == "D":
|
||||
self.disk_share(self.disk_id,self.amodule.params['shareable'])
|
||||
return
|
||||
|
||||
def action(self,restore=False):
|
||||
|
||||
#restore never be done
|
||||
if restore:
|
||||
self.disk_restore(self.disk_id)
|
||||
#rename if id present
|
||||
if (
|
||||
self.amodule.params['name'] is not None
|
||||
and self.amodule.params['name'] != self.disk_info['name']
|
||||
):
|
||||
self.disk_rename(disk_id=self.disk_id,
|
||||
name=self.amodule.params['name'])
|
||||
#resize
|
||||
if (
|
||||
self.amodule.params['size'] is not None
|
||||
and self.amodule.params['size'] != self.disk_info['sizeMax']
|
||||
):
|
||||
self.disk_resize(self.disk_info,self.amodule.params['size'])
|
||||
#IO TUNE
|
||||
if self.amodule.params['limitIO']:
|
||||
clean_io = [param for param in self.amodule.params['limitIO'] \
|
||||
if self.amodule.params['limitIO'][param] == None]
|
||||
for key in clean_io: del self.amodule.params['limitIO'][key]
|
||||
if self.amodule.params['limitIO'] != self.disk_info['iotune']:
|
||||
self.disk_limitIO(self.disk_id,self.amodule.params['limitIO'])
|
||||
#share check/update
|
||||
#raise Exception(self.amodule.params['shareable'])
|
||||
if self.amodule.params['shareable'] != self.disk_info['shareable'] and \
|
||||
self.amodule.params['type'] == "D":
|
||||
self.disk_share(self.disk_id,self.amodule.params['shareable'])
|
||||
return
|
||||
|
||||
def delete(self):
|
||||
self.disk_id = self.disk_delete(disk_id=self.disk_id,
|
||||
detach=self.amodule.params['force_detach'],
|
||||
permanently=self.amodule.params['permanently'],
|
||||
reason=self.amodule.params['reason'])
|
||||
self.disk_info['status'] = "DELETED"
|
||||
return
|
||||
|
||||
def rename(self):
|
||||
|
||||
|
||||
self.disk_rename(diskId = self.disk_id,
|
||||
name = self.amodule.params['name'])
|
||||
self.disk_info['name'] = self.amodule.params['name']
|
||||
return
|
||||
|
||||
def nop(self):
|
||||
|
||||
self.result['failed'] = False
|
||||
self.result['changed'] = False
|
||||
if self.disk_id:
|
||||
self.result['msg'] = ("No state change required for Disk ID {} because of its "
|
||||
"current status '{}'.").format(self.disk_id, self.disk_info['status'])
|
||||
else:
|
||||
self.result['msg'] = ("No state change to '{}' can be done for "
|
||||
"non-existent Disk.").format(self.amodule.params['state'])
|
||||
return
|
||||
|
||||
def package_facts(self, check_mode=False):
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
state="CHECK_MODE",
|
||||
size=0,
|
||||
account_id=0,
|
||||
sep_id=0,
|
||||
pool="none",
|
||||
gid=0
|
||||
)
|
||||
|
||||
if check_mode or self.disk_info is None:
|
||||
return ret_dict
|
||||
|
||||
# remove io param with zero value
|
||||
clean_io = [param for param in self.disk_info['iotune'] if self.disk_info['iotune'][param] == 0]
|
||||
for key in clean_io: del self.disk_info['iotune'][key]
|
||||
|
||||
ret_dict['id'] = self.disk_info['id']
|
||||
ret_dict['name'] = self.disk_info['name']
|
||||
ret_dict['size'] = self.disk_info['sizeMax']
|
||||
ret_dict['state'] = self.disk_info['status']
|
||||
ret_dict['account_id'] = self.disk_info['accountId']
|
||||
ret_dict['sep_id'] = self.disk_info['sepId']
|
||||
ret_dict['pool'] = self.disk_info['pool']
|
||||
ret_dict['computes'] = self.disk_info['computes']
|
||||
ret_dict['gid'] = self.disk_info['gid']
|
||||
ret_dict['iotune'] = self.disk_info['iotune']
|
||||
|
||||
if check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
@staticmethod
|
||||
def build_parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_disk module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
|
||||
if disk_facts is None:
|
||||
# if void facts provided - change state value to ABSENT and return
|
||||
ret_dict['state'] = "ABSENT"
|
||||
return ret_dict
|
||||
|
||||
ret_dict['id'] = disk_facts['id']
|
||||
ret_dict['name'] = disk_facts['name']
|
||||
ret_dict['size'] = disk_facts['sizeMax']
|
||||
ret_dict['state'] = disk_facts['status']
|
||||
ret_dict['account_id'] = disk_facts['accountId']
|
||||
ret_dict['sep_id'] = disk_facts['sepId']
|
||||
ret_dict['pool'] = disk_facts['pool']
|
||||
ret_dict['attached_to'] = disk_facts['vmid']
|
||||
ret_dict['gid'] = disk_facts['gid']
|
||||
|
||||
return ret_dict
|
||||
|
||||
def decort_disk_parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_disk module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
|
||||
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'),
|
||||
app_id=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
return dict(
|
||||
account_id=dict(type='int', required=False, default=0),
|
||||
account_name=dict(type='str', required=False, default=''),
|
||||
description=dict(type='str', required=False, default='Disk by decort_disk'),
|
||||
app_id=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
id=dict(type='int', required=False, default=0),
|
||||
name=dict(type='str', required=False),
|
||||
force_detach=dict(type='bool', required=False, default=False),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
id=dict(type='int', required=False, default=0),
|
||||
name=dict(type='str', required=False),
|
||||
force_detach=dict(type='bool', required=False, default=False),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
place_with=dict(type='int', default=0),
|
||||
pool=dict(type='str', default=''),
|
||||
sep_id=dict(type='int', default=0),
|
||||
size=dict(type='int'),
|
||||
type=dict(type='str',
|
||||
required=False,
|
||||
default="D",
|
||||
choices=['B', 'D', 'T']),
|
||||
iops=dict(type='int',required=False,default=2000),
|
||||
limitIO=dict(type='dict',
|
||||
options=dict(
|
||||
total_bytes_sec=dict(required=False,type='int'),
|
||||
read_bytes_sec=dict(required=False,type='int'),
|
||||
write_bytes_sec=dict(required=False,type='int'),
|
||||
total_iops_sec=dict(required=False,type='int'),
|
||||
read_iops_sec=dict(required=False,type='int'),
|
||||
write_iops_sec=dict(required=False,type='int'),
|
||||
total_bytes_sec_max=dict(required=False,type='int'),
|
||||
read_bytes_sec_max=dict(required=False,type='int'),
|
||||
write_bytes_sec_max=dict(required=False,type='int'),
|
||||
total_iops_sec_max=dict(required=False,type='int'),
|
||||
read_iops_sec_max=dict(required=False,type='int'),
|
||||
write_iops_sec_max=dict(required=False,type='int'),
|
||||
size_iops_sec=dict(required=False,type='int'),)),
|
||||
permanently=dict(type='bool', required=False, default=False),
|
||||
shareable=dict(type='bool', required=False, default=False),
|
||||
reason=dict(type='str', required=False,default='Managed by Ansible decort_disk'),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'present']),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
place_with=dict(type='int', required=False, default=0),
|
||||
pool=dict(type='str', required=False, default=''),
|
||||
sep_id=dict(type='int', required=False, default=0),
|
||||
size=dict(type='int', required=False),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'present']),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
)
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
)
|
||||
|
||||
def main():
|
||||
module_parameters = decort_disk_parameters()
|
||||
module_parameters = decort_disk.build_parameters()
|
||||
|
||||
amodule = AnsibleModule(argument_spec=module_parameters,
|
||||
supports_check_mode=True,
|
||||
@@ -343,199 +262,60 @@ def main():
|
||||
['app_id', 'app_secret'],
|
||||
['user', 'password'],
|
||||
],
|
||||
required_one_of=[
|
||||
['id', 'name'],
|
||||
],
|
||||
)
|
||||
|
||||
decon = DecortController(amodule)
|
||||
|
||||
disk_id = 0
|
||||
disk_facts = None # will hold Disk facts
|
||||
validated_acc_id = 0
|
||||
acc_facts = None # will hold Account facts
|
||||
|
||||
if amodule.params['id']:
|
||||
# expect existing Disk with the specified ID
|
||||
# This call to disk_find will abort the module if no Disk with such ID is present
|
||||
disk_id, disk_facts = decon.disk_find(amodule.params['id'])
|
||||
if not disk_id:
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = "Specified Disk ID {} not found.".format(amodule.params['id'])
|
||||
amodule.fail_json(**decon.result)
|
||||
validated_acc_id =disk_facts['accountId']
|
||||
elif amodule.params['account_id'] > 0 or amodule.params['account_name'] != "":
|
||||
# Make sure disk name is specified, if not - fail the module
|
||||
if amodule.params['name'] == "":
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = ("Cannot manage disk if both ID is 0 and disk name is empty.")
|
||||
amodule.fail_json(**decon.result)
|
||||
# Specified account must be present and accessible by the user, otherwise abort the module
|
||||
validated_acc_id, acc_facts = decon.account_find(amodule.params['account_name'], amodule.params['account_id'])
|
||||
if not validated_acc_id:
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = ("Current user does not have access to the requested account "
|
||||
"or non-existent account specified.")
|
||||
amodule.fail_json(**decon.result)
|
||||
# This call to disk_find may return disk_id=0 if no Disk with this name found in
|
||||
disk_id, disk_facts = decon.disk_find(disk_id=0, disk_name=amodule.params['name'],
|
||||
account_id=validated_acc_id,
|
||||
check_state=False)
|
||||
else:
|
||||
# this is "invalid arguments combination" sink
|
||||
# if we end up here, it means that module was invoked with disk_id=0 and undefined account
|
||||
decon.result['failed'] = True
|
||||
if amodule.params['account_id'] == 0 and amodule.params['account_name'] == "":
|
||||
decon.result['msg'] = "Cannot find Disk by name when account name is empty and account ID is 0."
|
||||
if amodule.params['name'] == "":
|
||||
decon.result['msg'] = "Cannot find Disk by empty name."
|
||||
amodule.fail_json(**decon.result)
|
||||
|
||||
decon = decort_disk(amodule)
|
||||
#
|
||||
# Initial validation of module arguments is complete
|
||||
#Full range of Disk status is as follows:
|
||||
#
|
||||
# At this point non-zero disk_id means that we will be managing pre-existing Disk
|
||||
# Otherwise we are about to create a new disk
|
||||
# "ASSIGNED","MODELED", "CREATING","CREATED","DELETED", "DESTROYED","PURGED",
|
||||
#
|
||||
# Valid Disk model statii are as follows:
|
||||
#
|
||||
# "CREATED", "ASSIGNED", DELETED", "DESTROYED", "PURGED"
|
||||
#
|
||||
|
||||
disk_should_exist = False
|
||||
target_sep_id = 0
|
||||
# target_pool = ""
|
||||
|
||||
if disk_id:
|
||||
disk_should_exist = True
|
||||
if disk_facts['status'] in ["MODELED", "CREATING" ]:
|
||||
# error: nothing can be done to existing Disk in the listed statii regardless of
|
||||
# the requested state
|
||||
if decon.disk_id:
|
||||
#disk exist
|
||||
if decon.disk_info['status'] in ["MODELED", "CREATING"]:
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("No change can be done for existing Disk ID {} because of its current "
|
||||
"status '{}'").format(disk_id, disk_facts['status'])
|
||||
elif disk_facts['status'] in ["CREATED", "ASSIGNED"]:
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.disk_delete(disk_id, True, amodule.params['force_detach']) # delete permanently
|
||||
disk_facts['status'] = 'DESTROYED'
|
||||
disk_should_exist = False
|
||||
"status '{}'").format(decon.disk_id, decon.disk_info['status'])
|
||||
# "ASSIGNED","CREATED","DELETED","PURGED", "DESTROYED"
|
||||
elif decon.disk_info['status'] in ["ASSIGNED","CREATED"]:
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.delete()
|
||||
elif amodule.params['state'] == 'present':
|
||||
# resize Disk as necessary & if possible
|
||||
if decon.check_amodule_argument('size', False):
|
||||
decon.disk_resize(disk_facts, amodule.params['size'])
|
||||
elif disk_facts['status'] == "DELETED":
|
||||
if amodule.params['state'] == 'present':
|
||||
# restore
|
||||
decon.disk_restore(disk_id)
|
||||
_, disk_facts = decon.disk_find(disk_id)
|
||||
decon.disk_resize(disk_facts, amodule.params['size'])
|
||||
disk_should_exist = True
|
||||
elif amodule.params['state'] == 'absent':
|
||||
# destroy permanently
|
||||
decon.disk_delete(disk_id, permanently=True)
|
||||
disk_facts['status'] = 'DESTROYED'
|
||||
disk_should_exist = False
|
||||
elif disk_facts['status'] in ["DESTROYED", "PURGED"]:
|
||||
if amodule.params['state'] == 'present':
|
||||
# Need to re-provision this Disk.
|
||||
# Some attributes may change, some must stay the same:
|
||||
# - disk name - stays, take from disk_facts
|
||||
# - account ID - stays, take from validated account ID
|
||||
# - size - may change, take from module arguments
|
||||
# - SEP ID - may change, build based on module arguments
|
||||
# - pool - may change, take from module arguments
|
||||
# - annotation - may change, take from module arguments
|
||||
#
|
||||
# First validate required parameters:
|
||||
decon.check_amodule_argument('size') # this will fail the module if size is not specified
|
||||
target_sep_id = 0
|
||||
if decon.check_amodule_argument('sep_id', False) and amodule.params['sep_id'] > 0:
|
||||
# non-zero sep_id is explicitly passed in module arguments
|
||||
target_sep_id = amodule.params['sep_id']
|
||||
elif decon.check_amodule_argument('place_with', False) and amodule.params['place_with'] > 0:
|
||||
# request to place this disk on the same SEP as the specified OS image
|
||||
# validate specified OS image and assign SEP ID accordingly
|
||||
image_id, image_facts = decon.image_find(amodule.params['place_with'], "", 0)
|
||||
target_sep_id = image_facts['sepId']
|
||||
else:
|
||||
# no new SEP ID is explicitly specified, and no place_with option - use sepId from the disk_facts
|
||||
target_sep_id = disk_facts['sepId']
|
||||
disk_id = decon.disk_provision(disk_name=disk_facts['name'], # as this disk was found, its name is in the facts
|
||||
size=amodule.params['size'],
|
||||
account_id=validated_acc_id,
|
||||
sep_id=target_sep_id,
|
||||
pool=amodule.params['pool'],
|
||||
desc=amodule.params['annotation'],
|
||||
location="")
|
||||
disk_should_exist = True
|
||||
elif amodule.params['state'] == 'absent':
|
||||
# nop
|
||||
decon.result['failed'] = False
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("No state change required for Disk ID {} because of its "
|
||||
"current status '{}'").format(disk_id,
|
||||
disk_facts['status'])
|
||||
disk_should_exist = False
|
||||
else:
|
||||
# disk_id =0 -> pre-existing Disk was not found.
|
||||
disk_should_exist = False # we will change it back to True if Disk is created successfully
|
||||
# If requested state is 'absent' - nothing to do
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.result['failed'] = False
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Nothing to do as target state 'absent' was requested for "
|
||||
"non-existent Disk name '{}'").format(amodule.params['name'])
|
||||
elif amodule.params['state'] == 'present':
|
||||
decon.check_amodule_argument('name') # if disk name not specified, fail the module
|
||||
decon.check_amodule_argument('size') # if disk size not specified, fail the module
|
||||
|
||||
# as we already have account ID, we can create Disk and get disk id on success
|
||||
if decon.check_amodule_argument('sep_id', False) and amodule.params['sep_id'] > 0:
|
||||
# non-zero sep_id is explicitly passed in module arguments
|
||||
target_sep_id = amodule.params['sep_id']
|
||||
elif decon.check_amodule_argument('place_with', False) and amodule.params['place_with'] > 0:
|
||||
# request to place this disk on the same SEP as the specified OS image
|
||||
# validate specified OS image and assign SEP ID accordingly
|
||||
image_id, image_facts = decon.image_find(amodule.params['place_with'], "", 0)
|
||||
target_sep_id = image_facts['sepId']
|
||||
decon.action()
|
||||
elif decon.disk_info['status'] in ["PURGED", "DESTROYED"]:
|
||||
#re-provision disk
|
||||
if amodule.params['state'] in ('present'):
|
||||
decon.create()
|
||||
else:
|
||||
# no SEP ID is explicitly specified, and no place_with option - we do not know where
|
||||
# to place the new disk - fail the module
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = ("Cannot create new Disk name '{}': no SEP ID specified and "
|
||||
"no 'place_with' option used.").format(amodule.params['name'])
|
||||
amodule.fail_json(**decon.result)
|
||||
|
||||
disk_id = decon.disk_provision(disk_name=amodule.params['name'],
|
||||
size=amodule.params['size'],
|
||||
account_id=validated_acc_id,
|
||||
sep_id=target_sep_id,
|
||||
pool_name=amodule.params['pool'],
|
||||
desc=amodule.params['annotation'],
|
||||
location="")
|
||||
disk_should_exist = True
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Invalid target state '{}' requested for non-existent "
|
||||
"Disk name '{}'").format(amodule.params['state'],
|
||||
amodule.params['name'])
|
||||
decon.nop()
|
||||
elif decon.disk_info['status'] == "DELETED":
|
||||
if amodule.params['state'] in ('present'):
|
||||
decon.action(restore=True)
|
||||
elif (amodule.params['state'] == 'absent' and
|
||||
amodule.params['permanently']):
|
||||
decon.delete()
|
||||
else:
|
||||
decon.nop()
|
||||
else:
|
||||
# preexisting Disk was not found
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.nop()
|
||||
else:
|
||||
decon.create()
|
||||
|
||||
#
|
||||
# conditional switch end - complete module run
|
||||
#
|
||||
if decon.result['failed']:
|
||||
amodule.fail_json(**decon.result)
|
||||
else:
|
||||
# prepare Disk facts to be returned as part of decon.result and then call exit_json(...)
|
||||
if disk_should_exist:
|
||||
if decon.result['changed']:
|
||||
# If we arrive here, there is a good chance that the Disk is present - get fresh Disk
|
||||
# facts by Disk ID.
|
||||
# Otherwise, Disk facts from previous call (when the Disk was still in existence) will
|
||||
# be returned.
|
||||
_, disk_facts = decon.disk_find(disk_id)
|
||||
decon.result['facts'] = decort_disk_package_facts(disk_facts, amodule.check_mode)
|
||||
if decon.result['changed'] and amodule.params['state'] in ('present'):
|
||||
_, decon.disk_info = decon.disk_find(decon.disk_id)
|
||||
decon.result['facts'] = decon.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**decon.result)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
#SHARE
|
||||
309
library/decort_group.py
Normal file
309
library/decort_group.py
Normal file
@@ -0,0 +1,309 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
DOCUMENTATION = r'''
|
||||
---
|
||||
module: decort_group
|
||||
|
||||
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)
|
||||
self.group_should_exist = False
|
||||
validated_bservice_id = None
|
||||
#find and validate B-Service
|
||||
|
||||
validated_bservice_id, bservice_info = self.bservice_get_by_id(arg_amodule.params['bservice_id'])
|
||||
if not validated_bservice_id:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = ("Cannot find B-service ID {}.").format(arg_amodule.params['bservice_id'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
#find group
|
||||
self.bservice_id = validated_bservice_id
|
||||
self.bservice_info = bservice_info
|
||||
self.group_id,self.group_info = self.group_find(
|
||||
bs_id=validated_bservice_id,
|
||||
bs_info=bservice_info,
|
||||
group_id=arg_amodule.params['id'],
|
||||
group_name=arg_amodule.params['name'],
|
||||
)
|
||||
|
||||
if self.group_id:
|
||||
self.group_should_exist = True
|
||||
|
||||
return
|
||||
def nop(self):
|
||||
"""No operation (NOP) handler for B-service.
|
||||
This function is intended to be called from the main switch construct of the module
|
||||
when current state -> desired state change logic does not require any changes to
|
||||
the actual Compute state.
|
||||
"""
|
||||
self.result['failed'] = False
|
||||
self.result['changed'] = False
|
||||
if self.group_id:
|
||||
self.result['msg'] = ("No state change required for B-service ID {} because of its "
|
||||
"current status '{}'.").format(self.group_id, self.group_info['status'])
|
||||
else:
|
||||
self.result['msg'] = ("No state change to '{}' can be done for "
|
||||
"non-existent B-service instance.").format(self.amodule.params['state'])
|
||||
return
|
||||
|
||||
def error(self):
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
if self.group_id:
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for Group ID {} in the "
|
||||
"current status '{}'.").format(self.group_id,
|
||||
self.amodule.params['state'],
|
||||
self.group_info['status'])
|
||||
else:
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for non-existent Group name '{}' "
|
||||
"in B-service {}").format(self.amodule.params['state'],
|
||||
self.amodule.params['name'],
|
||||
self.amodule.params['bservice_id'],
|
||||
)
|
||||
return
|
||||
|
||||
def create(self):
|
||||
self.group_id=self.group_provision(
|
||||
self.bservice_id,
|
||||
self.amodule.params['name'],
|
||||
self.amodule.params['count'],
|
||||
self.amodule.params['cpu'],
|
||||
self.amodule.params['ram'],
|
||||
self.amodule.params['boot_disk'],
|
||||
self.amodule.params['image_id'],
|
||||
self.amodule.params['driver'],
|
||||
self.amodule.params['role'],
|
||||
self.amodule.params['networks'],
|
||||
self.amodule.params['timeoutStart'],
|
||||
)
|
||||
|
||||
if self.amodule.params['state'] in ('started','present'):
|
||||
self.group_state(self.bservice_id,self.group_id,self.amodule.params['state'])
|
||||
return
|
||||
|
||||
def action(self):
|
||||
#change desired state
|
||||
if (
|
||||
self.group_info['techStatus'] == 'STARTED' and self.amodule.params['state'] == 'stopped') or (
|
||||
self.group_info['techStatus'] == 'STOPPED' and self.amodule.params['state'] in ('started','present')
|
||||
):
|
||||
self.group_state(self.bservice_id,self.group_id,self.amodule.params['state'])
|
||||
|
||||
if self.aparams['count'] != None:
|
||||
self.group_resize_count(
|
||||
bs_id=self.bservice_id,
|
||||
gr_dict=self.group_info,
|
||||
desired_count=self.aparams['count'],
|
||||
)
|
||||
|
||||
for aparam_name, info_key in {'cpu': 'cpu',
|
||||
'boot_disk': 'disk',
|
||||
'role': 'role',
|
||||
'ram': 'ram',
|
||||
'name': 'name',
|
||||
}.items():
|
||||
aparam_value = self.aparams[aparam_name]
|
||||
group_info_value = self.group_info[info_key]
|
||||
if aparam_value != None and aparam_value != group_info_value:
|
||||
self.group_update(
|
||||
bs_id=self.bservice_id,
|
||||
gr_dict=self.group_info,
|
||||
arg_cpu=self.aparams['cpu'],
|
||||
arg_disk=self.aparams['boot_disk'],
|
||||
arg_name=self.aparams['name'],
|
||||
arg_role=self.aparams['role'],
|
||||
arg_ram=self.aparams['ram'],
|
||||
)
|
||||
break
|
||||
|
||||
if self.aparams['networks'] != None:
|
||||
self.group_update_net(
|
||||
bs_id=self.bservice_id,
|
||||
gr_dict=self.group_info,
|
||||
arg_net=self.aparams['networks'],
|
||||
)
|
||||
|
||||
def destroy(self):
|
||||
|
||||
self.group_delete(
|
||||
self.bservice_id,
|
||||
self.group_id
|
||||
)
|
||||
self.group_should_exist = False
|
||||
|
||||
return
|
||||
|
||||
def package_facts(self,check_mode=False):
|
||||
|
||||
ret_dict = dict(
|
||||
name="",
|
||||
state="CHECK_MODE",
|
||||
account_id=0,
|
||||
rg_id=0,
|
||||
)
|
||||
|
||||
if check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
if self.result['changed'] == True:
|
||||
self.group_id,self.group_info = self.group_find(
|
||||
self.bservice_id,
|
||||
self.bservice_info,
|
||||
self.group_id
|
||||
)
|
||||
|
||||
ret_dict['account_id'] = self.group_info['accountId']
|
||||
ret_dict['rg_id'] = self.group_info['rgId']
|
||||
ret_dict['id'] = self.group_info['id']
|
||||
ret_dict['name'] = self.group_info['name']
|
||||
ret_dict['techStatus'] = self.group_info['techStatus']
|
||||
ret_dict['state'] = self.group_info['status']
|
||||
ret_dict['Computes'] = self.group_info['computes']
|
||||
return ret_dict
|
||||
@staticmethod
|
||||
def build_parameters():
|
||||
return dict(
|
||||
account_id=dict(type='int', required=False),
|
||||
account_name=dict(type='str', required=False, default=''),
|
||||
app_id=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'started', 'stopped', 'present','check']),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
name=dict(type='str'),
|
||||
id=dict(type='int', required=False),
|
||||
image_id=dict(type='int', required=False),
|
||||
image_name=dict(type='str', required=False),
|
||||
driver=dict(type='str', required=False, choices=['KVM_X86', 'SVA_KVM_X86'], default="KVM_X86"),
|
||||
boot_disk=dict(type='int', required=False),
|
||||
bservice_id=dict(type='int', required=True),
|
||||
count=dict(type='int'),
|
||||
timeoutStart=dict(type='int', required=False),
|
||||
role=dict(type='str', required=False),
|
||||
cpu=dict(type='int', required=False),
|
||||
ram=dict(type='int', required=False),
|
||||
networks=dict(
|
||||
type='list', elements='dict',
|
||||
options=dict(
|
||||
type=dict(
|
||||
type='str',
|
||||
required=True,
|
||||
choices=['VINS', 'EXTNET']
|
||||
),
|
||||
id=dict(
|
||||
type='int',
|
||||
required=True
|
||||
)
|
||||
)
|
||||
),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),)
|
||||
def main():
|
||||
module_parameters = decort_group.build_parameters()
|
||||
|
||||
amodule = AnsibleModule(argument_spec=module_parameters,
|
||||
supports_check_mode=True,
|
||||
mutually_exclusive=[
|
||||
['oauth2', 'password'],
|
||||
['password', 'jwt'],
|
||||
['jwt', 'oauth2'],
|
||||
],
|
||||
required_together=[
|
||||
['app_id', 'app_secret'],
|
||||
['user', 'password'],
|
||||
],
|
||||
required_one_of=[
|
||||
['id', 'name'],
|
||||
['id', 'networks'],
|
||||
['id', 'count'],
|
||||
['id', 'cpu'],
|
||||
['id', 'ram'],
|
||||
['id', 'boot_disk'],
|
||||
['id', 'image_id'],
|
||||
['id', 'driver'],
|
||||
],
|
||||
)
|
||||
|
||||
subj = decort_group(amodule)
|
||||
|
||||
if amodule.params['state'] == 'check':
|
||||
subj.result['changed'] = False
|
||||
if subj.group_id:
|
||||
# cluster is found - package facts and report success to Ansible
|
||||
subj.result['failed'] = False
|
||||
subj.result['facts'] = subj.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**subj.result)
|
||||
# we exit the module at this point
|
||||
else:
|
||||
subj.result['failed'] = True
|
||||
subj.result['msg'] = ("Cannot locate Group name '{}'. "
|
||||
"B-service ID {}").format(amodule.params['name'],
|
||||
amodule.params['bservice_id'],)
|
||||
amodule.fail_json(**subj.result)
|
||||
|
||||
if subj.group_id:
|
||||
if subj.group_info['status'] in ("DELETING","DESTROYNG","CREATING","DESTROYING",
|
||||
"ENABLING","DISABLING","RESTORING","MODELED",
|
||||
"DISABLED","DESTROYED"):
|
||||
subj.error()
|
||||
elif subj.group_info['status'] in ("DELETED","DESTROYED"):
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.nop()
|
||||
if amodule.params['state'] in ('present','started','stopped'):
|
||||
subj.create()
|
||||
elif subj.group_info['techStatus'] in ("STARTED","STOPPED"):
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.destroy()
|
||||
else:
|
||||
subj.action()
|
||||
|
||||
else:
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.nop()
|
||||
if amodule.params['state'] in ('present','started','stopped'):
|
||||
subj.create()
|
||||
|
||||
if subj.result['failed']:
|
||||
amodule.fail_json(**subj.result)
|
||||
else:
|
||||
if subj.group_should_exist:
|
||||
subj.result['facts'] = subj.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**subj.result)
|
||||
else:
|
||||
amodule.exit_json(**subj.result)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -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"""
|
||||
|
||||
463
library/decort_k8s.py
Normal file
463
library/decort_k8s.py
Normal file
@@ -0,0 +1,463 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
DOCUMENTATION = r'''
|
||||
---
|
||||
module: decort_k8s
|
||||
|
||||
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):
|
||||
super(decort_k8s, self).__init__(arg_amodule)
|
||||
|
||||
validated_acc_id = 0
|
||||
validated_rg_id = 0
|
||||
validated_rg_facts = None
|
||||
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
|
||||
self.result['msg'] = "Cannot manage k8s cluster when its ID is 0 and name is empty."
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
if arg_amodule.params['id'] is None:
|
||||
if not arg_amodule.params['rg_id']: # RG ID is not set -> locate RG by name -> need account ID
|
||||
validated_acc_id, _ = self.account_find(arg_amodule.params['account_name'],
|
||||
arg_amodule.params['account_id'])
|
||||
if not validated_acc_id:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = ("Current user does not have access to the account ID {} / "
|
||||
"name '{}' or non-existent account specified.").format(arg_amodule.params['account_id'],
|
||||
arg_amodule.params['account_name'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
# fail the module -> exit
|
||||
# now validate RG
|
||||
validated_rg_id, validated_rg_facts = self.rg_find(
|
||||
arg_account_id=validated_acc_id,
|
||||
arg_rg_id=arg_amodule.params['rg_id'],
|
||||
arg_rg_name=arg_amodule.params['rg_name']
|
||||
)
|
||||
if not validated_rg_id:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = "Cannot find RG ID {} / name '{}'.".format(arg_amodule.params['rg_id'],
|
||||
arg_amodule.params['rg_name'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
# fail the module - exit
|
||||
|
||||
self.rg_id = validated_rg_id
|
||||
arg_amodule.params['rg_id'] = validated_rg_id
|
||||
arg_amodule.params['rg_name'] = validated_rg_facts['name']
|
||||
self.acc_id = validated_rg_facts['accountId']
|
||||
|
||||
self.k8s_id,self.k8s_info = self.k8s_find(k8s_id=arg_amodule.params['id'],
|
||||
k8s_name=arg_amodule.params['name'],
|
||||
rg_id=validated_rg_id,
|
||||
check_state=False)
|
||||
|
||||
if self.k8s_id:
|
||||
self.k8s_should_exist = True
|
||||
self.acc_id = self.k8s_info['accountId']
|
||||
# check workers and groups for add or remove?
|
||||
|
||||
if not self.k8s_id:
|
||||
validated_k8ci_id = self.k8s_k8ci_find(arg_amodule.params['k8ci_id'])
|
||||
if not validated_k8ci_id:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = "Cannot find K8CI ID {}.".format(arg_amodule.params['k8ci_id'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
if not arg_amodule.params['workers']:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = "At least one worker group must be present"
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
return
|
||||
|
||||
def package_facts(self,check_mode=False):
|
||||
|
||||
ret_dict = dict(
|
||||
name="",
|
||||
state="CHECK_MODE",
|
||||
account_id=0,
|
||||
rg_id=0,
|
||||
config=None,
|
||||
)
|
||||
|
||||
if self.amodule.params['getConfig'] and self.k8s_info['techStatus'] == "STARTED":
|
||||
ret_dict['config'] = self.k8s_getConfig()
|
||||
|
||||
if check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
#if self.k8s_facts is None:
|
||||
# #if void facts provided - change state value to ABSENT and return
|
||||
# ret_dict['state'] = "ABSENT"
|
||||
# return ret_dict
|
||||
|
||||
ret_dict['id'] = self.k8s_info['id']
|
||||
ret_dict['name'] = self.k8s_info['name']
|
||||
ret_dict['techStatus'] = self.k8s_info['techStatus']
|
||||
ret_dict['state'] = self.k8s_info['status']
|
||||
ret_dict['rg_id'] = self.k8s_info['rgId']
|
||||
ret_dict['vins_id'] = self.k8s_vins_id
|
||||
ret_dict['account_id'] = self.acc_id
|
||||
ret_dict['k8s_Masters'] = self.k8s_info['k8sGroups']['masters']
|
||||
ret_dict['k8s_Workers'] = self.k8s_info['k8sGroups']['workers']
|
||||
|
||||
return ret_dict
|
||||
|
||||
def nop(self):
|
||||
"""No operation (NOP) handler for k8s cluster management by decort_k8s module.
|
||||
This function is intended to be called from the main switch construct of the module
|
||||
when current state -> desired state change logic does not require any changes to
|
||||
the actual k8s cluster state.
|
||||
"""
|
||||
self.result['failed'] = False
|
||||
self.result['changed'] = False
|
||||
if self.k8s_id:
|
||||
self.result['msg'] = ("No state change required for K8s ID {} because of its "
|
||||
"current status '{}'.").format(self.k8s_id, self.k8s_info['status'])
|
||||
else:
|
||||
self.result['msg'] = ("No state change to '{}' can be done for "
|
||||
"non-existent K8s instance.").format(self.amodule.params['state'])
|
||||
return
|
||||
|
||||
def error(self):
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
if self.k8s_id:
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for K8s cluster ID {} in the "
|
||||
"current status '{}'.").format(self.k8s_id,
|
||||
self.amodule.params['state'],
|
||||
self.k8s_info['status'])
|
||||
else:
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for non-existent K8s Cluster name '{}' "
|
||||
"in RG ID {} / name '{}'").format(self.amodule.params['state'],
|
||||
self.amodule.params['name'],
|
||||
self.amodule.params['rg_id'],
|
||||
self.amodule.params['rg_name'])
|
||||
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'],
|
||||
self.amodule.params['vins_id'],
|
||||
self.amodule.params['network_plugin'],
|
||||
self.amodule.params['master_count'],
|
||||
self.amodule.params['master_cpu'],
|
||||
self.amodule.params['master_ram'],
|
||||
self.amodule.params['master_disk'],
|
||||
self.amodule.params['master_sepid'],
|
||||
self.amodule.params['master_pool'],
|
||||
target_wgs[0],
|
||||
self.amodule.params['extnet_id'],
|
||||
self.amodule.params['with_lb'],
|
||||
self.amodule.params['ha_lb'],
|
||||
self.amodule.params['additionalSANs'],
|
||||
self.amodule.params['init_conf'],
|
||||
self.amodule.params['cluster_conf'],
|
||||
self.amodule.params['kublet_conf'],
|
||||
self.amodule.params['kubeproxy_conf'],
|
||||
self.amodule.params['join_conf'],
|
||||
self.amodule.params['oidc_cert'],
|
||||
self.amodule.params['description'],
|
||||
self.amodule.params['extnet_only'],
|
||||
master_chipset,
|
||||
)
|
||||
|
||||
if not k8s_id:
|
||||
if k8s_id == 0:
|
||||
return
|
||||
else:
|
||||
self.result['failed'] = True
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
self.k8s_id,self.k8s_info = self.k8s_find(k8s_id=k8s_id,
|
||||
k8s_name=self.amodule.params['name'],
|
||||
rg_id=self.rg_id,
|
||||
check_state=False)
|
||||
|
||||
if self.k8s_id:
|
||||
self.k8s_should_exist = True
|
||||
self.k8s_workers_modify(
|
||||
arg_k8swg=self.k8s_info,
|
||||
arg_modwg=target_wgs,
|
||||
)
|
||||
return
|
||||
|
||||
def destroy(self):
|
||||
self.k8s_delete(self.k8s_id,self.amodule.params['permanent'])
|
||||
self.k8s_info['status'] = 'DELETED'
|
||||
self.k8s_should_exist = False
|
||||
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)
|
||||
#k8s state
|
||||
self.k8s_state(self.k8s_info, disared_state, started)
|
||||
self.k8s_info = self.k8s_get_by_id(k8s_id=self.k8s_id)
|
||||
if started == True and self.k8s_info['techStatus'] == "STOPPED":
|
||||
self.k8s_state(self.k8s_info, disared_state,started)
|
||||
self.k8s_info['techStatus'] == "STARTED"
|
||||
#check groups and modify if needed
|
||||
if self.aparams['workers'] is not None:
|
||||
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=''),
|
||||
app_id=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
# datacenter=dict(type='str', required=False, default=''),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
quotas=dict(type='dict', required=False),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'disabled', 'enabled', 'present','check']),
|
||||
permanent=dict(type='bool', default=False),
|
||||
started=dict(type='bool', default=True),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
name=dict(type='str', required=False, default=""),
|
||||
id=dict(type='int', required=False),
|
||||
getConfig=dict(type='bool',required=False, default=False),
|
||||
rg_id=dict(type='int', default=0),
|
||||
rg_name=dict(type='str',default=""),
|
||||
vins_id=dict(type='int', required=False,default=None),
|
||||
k8ci_id=dict(type='int'),
|
||||
network_plugin=dict(type='str',required=False,default="flannel"),
|
||||
master_count=dict(type='int', default=1),
|
||||
master_cpu=dict(type='int', default=2),
|
||||
master_ram=dict(type='int', default=2048),
|
||||
master_disk=dict(type='int', default=10),
|
||||
master_sepid=dict(type='int', required=False, default=None),
|
||||
master_pool=dict(type='str', required=False, default=None),
|
||||
workers=dict(
|
||||
type='list',
|
||||
elements='dict',
|
||||
options=dict(
|
||||
name=dict(
|
||||
type='str',
|
||||
required=True,
|
||||
),
|
||||
num=dict(
|
||||
type='int',
|
||||
),
|
||||
cpu=dict(
|
||||
type='int',
|
||||
),
|
||||
ram=dict(
|
||||
type='int',
|
||||
),
|
||||
disk=dict(
|
||||
type='int',
|
||||
),
|
||||
sep_id=dict(
|
||||
type='int',
|
||||
),
|
||||
pool=dict(
|
||||
type='str',
|
||||
),
|
||||
annotations=dict(
|
||||
type='list',
|
||||
elements='str',
|
||||
),
|
||||
ci_user_data=dict(
|
||||
type='dict',
|
||||
),
|
||||
labels=dict(
|
||||
type='list',
|
||||
elements='str',
|
||||
),
|
||||
taints=dict(
|
||||
type='list',
|
||||
elements='str',
|
||||
),
|
||||
chipset=dict(
|
||||
type='str',
|
||||
choices=['Q35', 'i440fx'],
|
||||
),
|
||||
),
|
||||
),
|
||||
workers_metadata=dict(type='bool',required=False,default=False),
|
||||
extnet_id=dict(type='int', default=0),
|
||||
description=dict(type='str', default="Created by decort ansible module"),
|
||||
with_lb=dict(type='bool', default=True),
|
||||
ha_lb=dict(type='bool', default=False),
|
||||
extnet_only=dict(type='bool', default=False),
|
||||
additionalSANs=dict(type='list',required=False, default=None),
|
||||
init_conf=dict(type='dict', required=False, default=None),
|
||||
cluster_conf=dict(type='dict', required=False, default=None),
|
||||
kublet_conf=dict(type='dict', required=False, default=None),
|
||||
kubeproxy_conf=dict(type='dict', required=False, default=None),
|
||||
join_conf=dict(type='dict', required=False, default=None),
|
||||
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),
|
||||
master_chipset=dict(
|
||||
type='str',
|
||||
choices=['Q35', 'i440fx'],
|
||||
),
|
||||
)
|
||||
|
||||
def main():
|
||||
module_parameters = decort_k8s.build_parameters()
|
||||
|
||||
amodule = AnsibleModule(argument_spec=module_parameters,
|
||||
supports_check_mode=True,
|
||||
mutually_exclusive=[
|
||||
['oauth2', 'password'],
|
||||
['password', 'jwt'],
|
||||
['jwt', 'oauth2'],
|
||||
],
|
||||
required_together=[
|
||||
['app_id', 'app_secret'],
|
||||
['user', 'password'],
|
||||
],
|
||||
required_one_of=[
|
||||
['id', 'name'],
|
||||
],
|
||||
)
|
||||
|
||||
subj = decort_k8s(amodule)
|
||||
|
||||
if amodule.params['state'] == 'check':
|
||||
subj.result['changed'] = False
|
||||
if subj.k8s_id:
|
||||
# cluster is found - package facts and report success to Ansible
|
||||
subj.result['failed'] = False
|
||||
subj.result['facts'] = subj.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**subj.result)
|
||||
# we exit the module at this point
|
||||
else:
|
||||
subj.result['failed'] = True
|
||||
subj.result['msg'] = ("Cannot locate K8s cluster name '{}'. "
|
||||
"RG ID {}").format(amodule.params['name'],
|
||||
amodule.params['rg_id'],)
|
||||
amodule.fail_json(**subj.result)
|
||||
|
||||
if subj.k8s_id:
|
||||
if subj.k8s_info['status'] in ("DELETING","DESTROYNG","CREATING","DESTROYING",
|
||||
"ENABLING","DISABLING","RESTORING","MODELED"):
|
||||
subj.error()
|
||||
elif subj.k8s_info['status'] == "DELETED":
|
||||
if amodule.params['state'] in ('disabled', 'enabled', 'present'):
|
||||
subj.k8s_restore(subj.k8s_id)
|
||||
subj.action(disared_state=amodule.params['state'],
|
||||
preupdate=True)
|
||||
if amodule.params['state'] == 'absent':
|
||||
if amodule.params['permanent']:
|
||||
subj.destroy()
|
||||
else:
|
||||
subj.nop()
|
||||
elif subj.k8s_info['techStatus'] in ("STARTED","STOPPED"):
|
||||
if amodule.params['state'] == 'disabled':
|
||||
subj.action(amodule.params['state'])
|
||||
elif amodule.params['state'] == 'absent':
|
||||
subj.destroy()
|
||||
else:
|
||||
subj.action(amodule.params['state'],amodule.params['started'])
|
||||
elif subj.k8s_info['status'] == "DISABLED":
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.destroy()
|
||||
elif amodule.params['state'] in ('present','enabled'):
|
||||
subj.action(amodule.params['state'],amodule.params['started'])
|
||||
else:
|
||||
subj.nop()
|
||||
elif subj.k8s_info['status'] == "DESTROED":
|
||||
if amodule.params['state'] in ('present','enabled'):
|
||||
subj.create()
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.nop()
|
||||
else:
|
||||
if amodule.params['state'] == 'absent':
|
||||
subj.nop()
|
||||
if amodule.params['state'] in ('present','started'):
|
||||
subj.create()
|
||||
elif amodule.params['state'] in ('stopped', 'disabled','enabled'):
|
||||
subj.error()
|
||||
|
||||
if subj.result['failed']:
|
||||
amodule.fail_json(**subj.result)
|
||||
else:
|
||||
if subj.k8s_should_exist:
|
||||
subj.result['facts'] = subj.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**subj.result)
|
||||
else:
|
||||
amodule.exit_json(**subj.result)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,384 +1,24 @@
|
||||
#!/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_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"
|
||||
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 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 and IBM PowerPC hardware.
|
||||
- This parameter is used when new KVM VM is created and ignored for all other operations.
|
||||
- Module may fail if your DECORT installation does not have physical nodes of specified architecture.
|
||||
default: X86_64
|
||||
choices: [ X86_64, PPC64_LE ]
|
||||
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
|
||||
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:
|
||||
- String of custom tags to be assigned to the VM (This feature is not implemented yet!).
|
||||
- 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:
|
||||
size: 10
|
||||
model: ovs
|
||||
pool: boot
|
||||
image_name: "Ubuntu 16.04 v1.1"
|
||||
data_disks:
|
||||
- size: 50
|
||||
model: ovs
|
||||
pool: data
|
||||
port_forwards:
|
||||
- ext_port: 21022
|
||||
int_port: 22
|
||||
proto: tcp
|
||||
- ext_port: 80
|
||||
int_port: 80
|
||||
proto: tcp
|
||||
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
|
||||
- name: check if VM exists and read in its specs.
|
||||
decort_kvmvm:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ MY_APP_ID }}"
|
||||
app_secret: "{{ MY_APP_SECRET }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
name: "{{ TARGET_VM_NAME }}"
|
||||
rg_name: "{{ TARGET_VDC_NAME }}"
|
||||
account_name: "{{ TRAGET_TENANT }}"
|
||||
state: check
|
||||
delegate_to: localhost
|
||||
register: existing_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
|
||||
super(decort_kvmvm, self).__init__(arg_amodule)
|
||||
|
||||
self.check_amodule_args()
|
||||
|
||||
self.comp_should_exist = False
|
||||
# This following flag is used to avoid extra (and unnecessary) get of compute details prior to
|
||||
# packaging facts before the module completes. As ""
|
||||
@@ -439,19 +79,73 @@ class decort_kvmvm(DecortController):
|
||||
check_state=False)
|
||||
|
||||
if self.comp_id:
|
||||
if self.comp_info['status'] != 'DESTROYED' and self.comp_info['arch'] not in ["X86_64", "PPC64_LE"]:
|
||||
# If we found a Compute in a non-DESTROYED state and it is not of type valid arch, abort the module
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = ("Compute ID {} architecture '{}' is not supported by "
|
||||
"decort_kvmvm module.").format(self.comp_id,
|
||||
self.amodule.params['arch'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
# fail the module - exit
|
||||
self.comp_should_exist = True
|
||||
self.acc_id = self.comp_info['accountId']
|
||||
|
||||
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):
|
||||
"""
|
||||
Additional Ansible Module arguments validation that
|
||||
cannot be implemented using Ansible Argument spec.
|
||||
"""
|
||||
|
||||
# Check parameter "networks" for DPDK type
|
||||
aparam_nets = self.aparams['networks']
|
||||
if aparam_nets:
|
||||
net_types = {net['type'] for net in aparam_nets}
|
||||
DPDK = 'DPDK'
|
||||
if DPDK in net_types and not net_types.issubset({'DPDK', 'EMPTY'}):
|
||||
self.message(
|
||||
'Check for parameter "networks" failed: a compute cannot'
|
||||
' be connected to a DPDK network and a network of another'
|
||||
' type at the same time.'
|
||||
)
|
||||
self.exit(fail=True)
|
||||
|
||||
aparam_custom_fields = self.aparams['custom_fields']
|
||||
if aparam_custom_fields is not None:
|
||||
if (
|
||||
aparam_custom_fields['disable']
|
||||
and aparam_custom_fields['fields'] is not None
|
||||
):
|
||||
self.message(
|
||||
'Check for parameter "custom_fields" failed: '
|
||||
'"fields" cannot be set if "disable" is True.'
|
||||
)
|
||||
self.exit(fail=True)
|
||||
|
||||
def nop(self):
|
||||
"""No operation (NOP) handler for Compute management by decort_kvmvm module.
|
||||
This function is intended to be called from the main switch construct of the module
|
||||
@@ -499,42 +193,45 @@ class decort_kvmvm(DecortController):
|
||||
# each of the following calls will abort if argument is missing
|
||||
self.check_amodule_argument('cpu')
|
||||
self.check_amodule_argument('ram')
|
||||
validated_bdisk_size = self.amodule.params['boot_disk'] or 0
|
||||
|
||||
if self.amodule.params['arch'] not in ["X86_64", "PPC64_LE"]:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = ("Unsupported architecture '{}' is specified for "
|
||||
"KVM VM create.").format(self.amodule.params['arch'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
# fail the module - exit
|
||||
|
||||
validated_bdisk_size = 0
|
||||
|
||||
image_facts = None
|
||||
# either image_name or image_id must be present
|
||||
if self.check_amodule_argument('image_id', abort=False) and self.amodule.params['image_id'] > 0 :
|
||||
# find image by image ID and account ID
|
||||
# image_find(self, image_id, image_name, account_id, rg_id=0, sepid=0, pool=""):
|
||||
_, image_facts = self.image_find(image_id=self.amodule.params['image_id'],
|
||||
image_name="",
|
||||
account_id=self.acc_id)
|
||||
elif self.check_amodule_argument('image_name', abort=False) and self.amodule.params['image_name'] != "":
|
||||
# find image by image name and account ID
|
||||
_, image_facts = self.image_find(image_id=0,
|
||||
image_name=self.amodule.params['image_name'],
|
||||
account_id=self.acc_id)
|
||||
image_id, image_facts = None, None
|
||||
if (
|
||||
self.amodule.params['image_id'] is None
|
||||
and self.amodule.params['image_name'] is None
|
||||
):
|
||||
if self.amodule.params['state'] not in ('poweredoff', 'halted'):
|
||||
self.result['msg'] = (
|
||||
'"state" parameter for a blank Compute must be either '
|
||||
'"poweredoff" or "halted".'
|
||||
)
|
||||
self.exit(fail=True)
|
||||
else:
|
||||
# neither image_name nor image_id are set - abort the script
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = "Missing both 'image_name' and 'image_id'. You need to specify one to create a Compute."
|
||||
self.amodule.fail_json(**self.result)
|
||||
# fail the module - exit
|
||||
# either image_name or image_id must be present
|
||||
if (
|
||||
self.check_amodule_argument('image_id', abort=False)
|
||||
and self.amodule.params['image_id'] > 0
|
||||
):
|
||||
# find image by image ID and account ID
|
||||
# image_find(self, image_id, image_name, account_id, rg_id=0, sepid=0, pool=""):
|
||||
image_id, image_facts = self.image_find(
|
||||
image_id=self.amodule.params['image_id'],
|
||||
image_name="",
|
||||
account_id=self.acc_id)
|
||||
elif (
|
||||
self.check_amodule_argument('image_name', abort=False)
|
||||
and self.amodule.params['image_name'] != ""
|
||||
):
|
||||
# find image by image name and account ID
|
||||
image_id, image_facts = self.image_find(
|
||||
image_id=0,
|
||||
image_name=self.amodule.params['image_name'],
|
||||
account_id=self.acc_id,
|
||||
)
|
||||
|
||||
if ((not self.check_amodule_argument('boot_disk', False)) or
|
||||
self.amodule.params['boot_disk'] <= image_facts['size']):
|
||||
# adjust disk size to the minimum allowed by OS image, which will be used to spin off this Compute
|
||||
validated_bdisk_size = image_facts['size']
|
||||
else:
|
||||
validated_bdisk_size =self.amodule.params['boot_disk']
|
||||
if validated_bdisk_size <= image_facts['size']:
|
||||
# adjust disk size to the minimum allowed by OS image, which will be used to spin off this Compute
|
||||
validated_bdisk_size = image_facts['size']
|
||||
|
||||
# NOTE: due to a libvirt "feature", that impacts management of a VM created without any network interfaces,
|
||||
# we create KVM VM in HALTED state.
|
||||
@@ -548,26 +245,54 @@ class decort_kvmvm(DecortController):
|
||||
if self.amodule.params['state'] in ('halted', 'poweredoff'):
|
||||
start_compute = False
|
||||
|
||||
if self.amodule.params['ssh_key'] and self.amodule.params['ssh_key_user']:
|
||||
if self.amodule.params['ssh_key'] and self.amodule.params['ssh_key_user'] and not self.amodule.params['ci_user_data']:
|
||||
cloud_init_params = {'users': [
|
||||
{"name": self.amodule.params['ssh_key_user'],
|
||||
"ssh-authorized-keys": [self.amodule.params['ssh_key']],
|
||||
"shell": '/bin/bash'}
|
||||
]}
|
||||
elif self.amodule.params['ci_user_data']:
|
||||
cloud_init_params = self.amodule.params['ci_user_data']
|
||||
else:
|
||||
cloud_init_params = None
|
||||
|
||||
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,
|
||||
comp_name=self.amodule.params['name'], arch=self.amodule.params['arch'],
|
||||
comp_name=self.amodule.params['name'],
|
||||
cpu=self.amodule.params['cpu'], ram=self.amodule.params['ram'],
|
||||
boot_disk=validated_bdisk_size,
|
||||
image_id=image_facts['id'],
|
||||
annotation=self.amodule.params['annotation'],
|
||||
image_id=image_id,
|
||||
description=self.amodule.params['description'],
|
||||
userdata=cloud_init_params,
|
||||
start_on_create=start_compute)
|
||||
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=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
|
||||
@@ -585,16 +310,33 @@ class decort_kvmvm(DecortController):
|
||||
'techStatus': "STOPPED",
|
||||
'interfaces': [], # new compute instance is created network-less
|
||||
'disks': [], # new compute instance is created without any data disks attached
|
||||
'tags': {},
|
||||
'affinityLabel': "",
|
||||
'affinityRules': [],
|
||||
'antiAffinityRules': [],
|
||||
}
|
||||
|
||||
#
|
||||
# Compute was created
|
||||
#
|
||||
# Setup network connections
|
||||
self.compute_networks(self.comp_info, self.amodule.params['networks'])
|
||||
if self.amodule.params['networks'] is not None:
|
||||
self.compute_networks(
|
||||
comp_dict=self.comp_info,
|
||||
new_networks=self.amodule.params['networks'],
|
||||
)
|
||||
# Next manage data disks
|
||||
self.compute_data_disks(self.comp_info, self.amodule.params['data_disks'])
|
||||
if self.amodule.params['data_disks'] is not None:
|
||||
self.compute_data_disks(
|
||||
comp_dict=self.comp_info,
|
||||
new_data_disks=self.amodule.params['data_disks'],
|
||||
)
|
||||
|
||||
self.compute_affinity(self.comp_info,
|
||||
self.amodule.params['tag'],
|
||||
self.amodule.params['aff_rule'],
|
||||
self.amodule.params['aaff_rule'],
|
||||
label=self.amodule.params['affinity_label'],)
|
||||
# NOTE: see NOTE above regarding libvirt "feature" and new VMs created in HALTED state
|
||||
if self.amodule.params['state'] not in ('halted', 'poweredoff'):
|
||||
self.compute_powerstate(self.comp_info, 'started')
|
||||
@@ -635,14 +377,78 @@ class decort_kvmvm(DecortController):
|
||||
|
||||
Note that it does not modify power state of KVM VM.
|
||||
"""
|
||||
self.compute_networks(self.comp_info, self.amodule.params['networks'])
|
||||
self.compute_bootdisk_size(self.comp_info, self.amodule.params['boot_disk'])
|
||||
self.compute_data_disks(self.comp_info, self.amodule.params['data_disks'])
|
||||
if self.amodule.params['networks'] is not None:
|
||||
self.compute_networks(
|
||||
comp_dict=self.comp_info,
|
||||
new_networks=self.aparams['networks'],
|
||||
order_changing=self.aparams['network_order_changing'],
|
||||
)
|
||||
|
||||
boot_disk_new_size = self.amodule.params['boot_disk']
|
||||
if boot_disk_new_size:
|
||||
self.compute_bootdisk_size(self.comp_info, boot_disk_new_size)
|
||||
|
||||
if self.amodule.params['data_disks'] is not None:
|
||||
self.compute_data_disks(self.comp_info, self.amodule.params['data_disks'])
|
||||
|
||||
self.compute_resize(self.comp_info,
|
||||
self.amodule.params['cpu'], self.amodule.params['ram'],
|
||||
wait_for_state_change=arg_wait_cycles)
|
||||
|
||||
self.compute_affinity(self.comp_info,
|
||||
self.amodule.params['tag'],
|
||||
self.amodule.params['aff_rule'],
|
||||
self.amodule.params['aaff_rule'],
|
||||
label=self.amodule.params['affinity_label'])
|
||||
|
||||
if self.compute_update_args:
|
||||
self.compute_update(
|
||||
compute_id=self.comp_info['id'],
|
||||
**self.compute_update_args,
|
||||
)
|
||||
|
||||
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 = {}
|
||||
|
||||
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
|
||||
|
||||
|
||||
def package_facts(self, check_mode=False):
|
||||
"""Package a dictionary of KVM VM facts according to the decort_kvmvm module specification.
|
||||
This dictionary will be returned to the upstream Ansible engine at the completion of decort_kvmvm
|
||||
@@ -670,6 +476,13 @@ class decort_kvmvm(DecortController):
|
||||
public_ips=[], # direct IPs; this list can be empty
|
||||
private_ips=[], # IPs on ViNSes; usually, at least one IP is listed
|
||||
nat_ip="", # IP of the external ViNS interface; can be empty.
|
||||
tags={},
|
||||
chipset="",
|
||||
interfaces=[],
|
||||
cpu_pin="",
|
||||
hp_backed="",
|
||||
numa_affinity="",
|
||||
custom_fields={},
|
||||
)
|
||||
|
||||
if check_mode or self.comp_info is None:
|
||||
@@ -687,6 +500,8 @@ class decort_kvmvm(DecortController):
|
||||
ret_dict['tech_status'] = self.comp_info['techStatus']
|
||||
ret_dict['account_id'] = self.comp_info['accountId']
|
||||
ret_dict['rg_id'] = self.comp_info['rgId']
|
||||
if self.comp_info['tags']:
|
||||
ret_dict['tags'] = self.comp_info['tags']
|
||||
# if the VM is an imported VM, then the 'accounts' list may be empty,
|
||||
# so check for this case before trying to access login and passowrd values
|
||||
if len(self.comp_info['osUsers']):
|
||||
@@ -720,8 +535,50 @@ class decort_kvmvm(DecortController):
|
||||
# if it is a data disk - append its ID to the list of data disks IDs
|
||||
ret_dict['data_disks'].append(ddisk['id'])
|
||||
|
||||
ret_dict['chipset'] = self.comp_info['chipset']
|
||||
|
||||
ret_dict['interfaces'] = self.comp_info['interfaces']
|
||||
|
||||
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
|
||||
@@ -733,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'])),
|
||||
@@ -743,16 +598,17 @@ class decort_kvmvm(DecortController):
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
arch=dict(type='str', choices=['X86_64', 'PPC64_LE'], default='X86_64'),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
boot_disk=dict(type='int', required=False),
|
||||
sep_id=dict(type='int', required=False),
|
||||
pool=dict(type='str', required=False),
|
||||
controller_url=dict(type='str', required=True),
|
||||
# count=dict(type='int', required=False, default=1),
|
||||
cpu=dict(type='int', required=False),
|
||||
# datacenter=dict(type='str', required=False, default=''),
|
||||
data_disks=dict(type='list', default=[], required=False), # list of integer disk IDs
|
||||
data_disks=dict(type='list', required=False), # list of integer disk IDs
|
||||
id=dict(type='int', required=False, default=0),
|
||||
image_id=dict(type='int', required=False),
|
||||
image_name=dict(type='str', required=False),
|
||||
@@ -761,7 +617,39 @@ class decort_kvmvm(DecortController):
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
name=dict(type='str'),
|
||||
networks=dict(type='list', default=[], required=False), # list of dictionaries
|
||||
networks=dict(
|
||||
type='list',
|
||||
elements='dict',
|
||||
options=dict(
|
||||
type=dict(
|
||||
type='str',
|
||||
required=True,
|
||||
choices=[
|
||||
'VINS',
|
||||
'EXTNET',
|
||||
'VFNIC',
|
||||
'DPDK',
|
||||
'EMPTY',
|
||||
],
|
||||
),
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
ip_addr=dict(
|
||||
type='str',
|
||||
),
|
||||
),
|
||||
required_if=[
|
||||
('type', 'VINS', ('id',)),
|
||||
('type', 'EXTNET', ('id',)),
|
||||
('type', 'VFNIC', ('id',)),
|
||||
('type', 'DPDK', ('id',)),
|
||||
],
|
||||
),
|
||||
network_order_changing=dict(
|
||||
type='bool',
|
||||
default=False,
|
||||
),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
@@ -774,6 +662,11 @@ class decort_kvmvm(DecortController):
|
||||
rg_name=dict(type='str', default=""),
|
||||
ssh_key=dict(type='str', required=False),
|
||||
ssh_key_user=dict(type='str', required=False),
|
||||
tag=dict(type='dict', required=False),
|
||||
affinity_label=dict(type='str', required=False),
|
||||
aff_rule=dict(type='list', required=False),
|
||||
aaff_rule=dict(type='list', required=False),
|
||||
ci_user_data=dict(type='dict', required=False),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'paused', 'poweredoff', 'halted', 'poweredon', 'present', 'check']),
|
||||
@@ -785,7 +678,54 @@ class decort_kvmvm(DecortController):
|
||||
# wait_for_ip_address=dict(type='bool', required=False, default=False),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
chipset=dict(
|
||||
type='str',
|
||||
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
|
||||
@@ -845,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()
|
||||
@@ -876,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':
|
||||
|
||||
350
library/decort_lb.py
Normal file
350
library/decort_lb.py
Normal file
@@ -0,0 +1,350 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
DOCUMENTATION = r'''
|
||||
---
|
||||
module: decort_lb
|
||||
|
||||
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_lb(DecortController):
|
||||
def __init__(self,arg_amodule) -> None:
|
||||
super(decort_lb,self).__init__(arg_amodule)
|
||||
|
||||
self.lb_id = 0
|
||||
self.lb_facts = None
|
||||
self.vins_id = 0
|
||||
self.vins_facts = None
|
||||
self.rg_id = 0
|
||||
self.rg_facts = None
|
||||
self.acc_id = 0
|
||||
self.acc_facts = None
|
||||
self.default_server_check = "enabled"
|
||||
self.default_alg = "roundrobin"
|
||||
self.default_settings = {
|
||||
"downinter": 10000,
|
||||
"fall": 2,
|
||||
"inter": 5000,
|
||||
"maxconn": 250,
|
||||
"maxqueue": 256,
|
||||
"rise": 2,
|
||||
"slowstart": 60000,
|
||||
"weight": 100,
|
||||
}
|
||||
if arg_amodule.params['lb_id']:
|
||||
self.lb_id, self.lb_facts = self.lb_find(arg_amodule.params['lb_id'])
|
||||
if not self.lb_id:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = "Specified LB ID {} not found."\
|
||||
.format(arg_amodule.params['lb _id'])
|
||||
self.fail_json(**self.result)
|
||||
self.rg_id = self.lb_facts['rgId']
|
||||
self.vins_id = self.lb_facts['vinsId']
|
||||
return
|
||||
|
||||
if arg_amodule.params['rg_id']:
|
||||
self.rg_id, self.rg_facts = self.rg_find(0,arg_amodule.params['rg_id'], arg_rg_name="")
|
||||
if not self.rg_id:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = "Specified RG ID {} not found.".format(arg_amodule.params['vins_id'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
elif arg_amodule.params['account_id'] or arg_amodule.params['account_name'] != "":
|
||||
|
||||
if not arg_amodule.params['rg_name']:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = ("RG name must be specified with account present")
|
||||
self.amodule.fail_json(**self.result)
|
||||
self.acc_id, self.acc_facts = self.account_find(arg_amodule.params['account_name'],
|
||||
arg_amodule.params['account_id'])
|
||||
if not self.acc_id:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = ("Current user does not have access to the requested account "
|
||||
"or non-existent account specified.")
|
||||
self.amodule.fail_json(**self.result)
|
||||
self.rg_id, self.rg_facts = self.rg_find(self.acc_id,0, arg_rg_name=arg_amodule.params['rg_name'])
|
||||
|
||||
if arg_amodule.params['vins_id']:
|
||||
self.vins_id, self.vins_facts = self.vins_find(
|
||||
vins_id=arg_amodule.params['vins_id']
|
||||
)
|
||||
if not self.vins_id:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = (
|
||||
f'Specified ViNS ID {arg_amodule.params["vins_id"]}'
|
||||
f' not found'
|
||||
)
|
||||
self.amodule.fail_json(**self.result)
|
||||
elif arg_amodule.params['vins_name']:
|
||||
self.vins_id, self.vins_facts = self.vins_find(
|
||||
vins_id=arg_amodule.params['vins_id'],
|
||||
vins_name=arg_amodule.params['vins_name'],
|
||||
rg_id=self.rg_id)
|
||||
if not self.vins_id:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = (
|
||||
f'Specified ViNS name {arg_amodule.params["vins_name"]}'
|
||||
f' not found in RG ID {self.rg_id}'
|
||||
)
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
if self.rg_id and arg_amodule.params['lb_name']:
|
||||
self.lb_id, self.lb_facts = self.lb_find(0,arg_amodule.params['lb_name'],self.rg_id)
|
||||
return
|
||||
|
||||
def create(self):
|
||||
self.lb_id = self.lb_provision(self.amodule.params['lb_name'],
|
||||
self.rg_id,self.vins_id,
|
||||
self.amodule.params['ext_net_id'],
|
||||
self.amodule.params['ha_lb'],
|
||||
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)
|
||||
self.lb_update(
|
||||
self.lb_facts['primaryNode'],
|
||||
self.lb_facts['frontendHAIP'],
|
||||
self.lb_facts['backendHAIP'],
|
||||
self.lb_facts['backends'],
|
||||
self.lb_facts['frontends'],
|
||||
self.amodule.params['backends'],
|
||||
self.amodule.params['servers'],
|
||||
self.amodule.params['frontends']
|
||||
)
|
||||
return
|
||||
|
||||
def action(self,d_state='',restore=False):
|
||||
if restore == True:
|
||||
self.lb_restore(lb_id=self.lb_id)
|
||||
_, self.lb_facts = self._lb_get_by_id(lb_id=self.lb_id)
|
||||
self.lb_state(self.lb_facts, 'enabled')
|
||||
_, self.lb_facts = self._lb_get_by_id(lb_id=self.lb_id)
|
||||
|
||||
self.lb_update(
|
||||
self.lb_facts['primaryNode'],
|
||||
self.lb_facts['frontendHAIP'],
|
||||
self.lb_facts['backendHAIP'],
|
||||
self.lb_facts['backends'],
|
||||
self.lb_facts['frontends'],
|
||||
self.amodule.params['backends'],
|
||||
self.amodule.params['servers'],
|
||||
self.amodule.params['frontends'],
|
||||
)
|
||||
|
||||
if d_state != '':
|
||||
self.lb_state(self.lb_facts, d_state)
|
||||
_, self.lb_facts = self._lb_get_by_id(lb_id=self.lb_id)
|
||||
|
||||
if (d_state == 'enabled' and
|
||||
self.lb_facts.get('status') == 'ENABLED' and
|
||||
self.lb_facts.get('techStatus') == 'STOPPED'):
|
||||
self.lb_state(self.lb_facts, 'started')
|
||||
_, self.lb_facts = self._lb_get_by_id(lb_id=self.lb_id)
|
||||
|
||||
return
|
||||
|
||||
def delete(self):
|
||||
self.lb_delete(self.lb_id, self.amodule.params['permanently'])
|
||||
self.lb_facts['status'] = 'DESTROYED'
|
||||
return
|
||||
def nop(self):
|
||||
"""No operation (NOP) handler for LB management by decort_lb module.
|
||||
This function is intended to be called from the main switch construct of the module
|
||||
when current state -> desired state change logic does not require any changes to
|
||||
the actual LB state.
|
||||
"""
|
||||
self.result['failed'] = False
|
||||
self.result['changed'] = False
|
||||
if self.lb_id:
|
||||
self.result['msg'] = ("No state change required for LB ID {} because of its "
|
||||
"current status '{}'.").format(self.lb_id, self.lb_facts['status'])
|
||||
else:
|
||||
self.result['msg'] = ("No state change to '{}' can be done for "
|
||||
"non-existent LB instance.").format(self.amodule.params['state'])
|
||||
return
|
||||
def error(self):
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
if self.vins_id:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for LB ID {} in the "
|
||||
"current status '{}'").format(self.lb_id,
|
||||
self.amodule.params['state'],
|
||||
self.lb_facts['status'])
|
||||
else:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for non-existent "
|
||||
"LB name '{}'").format(self.amodule.params['state'],
|
||||
self.amodule.params['lb_name'])
|
||||
return
|
||||
def package_facts(self, arg_check_mode=False):
|
||||
"""Package a dictionary of LB facts according to the decort_lb module specification.
|
||||
This dictionary will be returned to the upstream Ansible engine at the completion of
|
||||
the module run.
|
||||
|
||||
@param arg_check_mode: boolean that tells if this Ansible module is run in check mode
|
||||
"""
|
||||
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
state="CHECK_MODE",
|
||||
)
|
||||
|
||||
if arg_check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
if self.lb_facts is None:
|
||||
# if void facts provided - change state value to ABSENT and return
|
||||
ret_dict['state'] = "ABSENT"
|
||||
return ret_dict
|
||||
|
||||
ret_dict['id'] = self.lb_facts['id']
|
||||
ret_dict['name'] = self.lb_facts['name']
|
||||
ret_dict['state'] = self.lb_facts['status']
|
||||
#ret_dict['account_id'] = self.lb_facts['accountId']
|
||||
ret_dict['rg_id'] = self.lb_facts['rgId']
|
||||
ret_dict['gid'] = self.lb_facts['gid']
|
||||
if self.amodule.params['state']!="absent":
|
||||
ret_dict['backends'] = self.lb_facts['backends']
|
||||
ret_dict['frontends'] = self.lb_facts['frontends']
|
||||
return ret_dict
|
||||
@staticmethod
|
||||
def build_parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_vins module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
|
||||
return dict(
|
||||
account_id=dict(type='int', required=False),
|
||||
account_name=dict(type='str', required=False, default=''),
|
||||
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'])),
|
||||
app_secret=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
# datacenter=dict(type='str', required=False, default=''),
|
||||
ext_net_id=dict(type='int', required=False, default=-1),
|
||||
ext_ip_addr=dict(type='str', required=False, default=''),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'disabled', 'enabled', 'present','restart']),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
rg_id=dict(type='int', required=False, default=0),
|
||||
rg_name=dict(type='str', required=False, default=''),
|
||||
vins_name=dict(type='str', required=False, default=''),
|
||||
vins_id=dict(type='int', required=False, default=0),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
lb_id=dict(type='int', required=False, default=0),
|
||||
lb_name=dict(type='str'),
|
||||
ha_lb=dict(type='bool', required=False, default=False),
|
||||
backends=dict(type='list',required=False),
|
||||
frontends=dict(type='list',required=False),
|
||||
servers=dict(type='list',required=False),
|
||||
permanently=dict(type='bool', required=False, default=False),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
)
|
||||
|
||||
def main():
|
||||
module_parameters = decort_lb.build_parameters()
|
||||
|
||||
amodule = AnsibleModule(argument_spec=module_parameters,
|
||||
supports_check_mode=True,
|
||||
mutually_exclusive=[
|
||||
['oauth2', 'password'],
|
||||
['password', 'jwt'],
|
||||
['jwt', 'oauth2'],
|
||||
],
|
||||
required_together=[
|
||||
['app_id', 'app_secret'],
|
||||
['user', 'password']
|
||||
],
|
||||
required_one_of=[
|
||||
['rg_id','rg_name'],
|
||||
['lb_id','lb_name'],
|
||||
['vins_id','vins_name']
|
||||
]
|
||||
)
|
||||
decon = decort_lb(amodule)
|
||||
if decon.lb_id:
|
||||
if decon.lb_facts['status'] in ["MODELED", "DISABLING", "ENABLING", "DELETING","DESTROYING","RESTORING"]:
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("No change can be done for existing LB ID {} because of its current "
|
||||
"status '{}'").format(decon.lb_id, decon.lb_facts['status'])
|
||||
elif decon.lb_facts['status'] == "DISABLED":
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.delete()
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
decon.action()
|
||||
elif amodule.params['state'] in ('enabled', 'present'):
|
||||
decon.action('enabled')
|
||||
elif decon.lb_facts['status'] in ["CREATED", "ENABLED"]:
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.delete()
|
||||
elif amodule.params['state'] in ('present', 'enabled'):
|
||||
decon.action(d_state='enabled')
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
decon.action('disabled')
|
||||
elif amodule.params['state'] in ('stopped', 'started','restart'):
|
||||
decon.action(amodule.params['state'])
|
||||
elif decon.lb_facts['status'] == "DELETED":
|
||||
if amodule.params['state'] in ['present', 'enabled']:
|
||||
decon.action(d_state='enabled', restore=True)
|
||||
elif (amodule.params['state'] == 'absent' and
|
||||
amodule.params['permanently']):
|
||||
decon.delete()
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
decon.error()
|
||||
elif decon.lb_facts['status'] == "DESTROYED":
|
||||
if amodule.params['state'] in ('present', 'enabled'):
|
||||
decon.create()
|
||||
elif amodule.params['state'] == 'absent':
|
||||
decon.nop()
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
decon.error()
|
||||
else:
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.nop()
|
||||
elif amodule.params['state'] in ('present', 'enabled'):
|
||||
decon.create()
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
decon.error()
|
||||
|
||||
if decon.result['failed']:
|
||||
amodule.fail_json(**decon.result)
|
||||
else:
|
||||
if decon.result['changed'] and amodule.params['state'] != 'absent':
|
||||
_, decon.lb_facts = decon.lb_find(decon.lb_id)
|
||||
if decon.lb_id:
|
||||
decon.result['facts'] = decon.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**decon.result)
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,169 +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.
|
||||
Note that this module is effectively an information provisioner. It is not designed to and does not manage
|
||||
nor change state of OS image (or any other) objects in DECORT cloud.
|
||||
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
|
||||
vdc_id:
|
||||
description:
|
||||
- ID of the VDC to limit the search of the OS image to.
|
||||
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: locate OS image specified by its name, store result in image_to_use variable.
|
||||
decort_osimage:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ MY_APP_ID }}"
|
||||
app_secret: "{{ MY_APP_SECRET }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
image_name: "Ubuntu 18.04 v1.2.5"
|
||||
account_name: "GreyseDevelopment"
|
||||
delegate_to: localhost
|
||||
register: image_to_use
|
||||
'''
|
||||
|
||||
RETURN = '''
|
||||
facts:
|
||||
description: facts about the specified OS image
|
||||
returned: always
|
||||
type: dict
|
||||
sample:
|
||||
facts:
|
||||
id: 100
|
||||
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
|
||||
@@ -172,93 +13,217 @@ from ansible.module_utils.basic import env_fallback
|
||||
from ansible.module_utils.decort_utils import *
|
||||
|
||||
|
||||
def decort_osimage_package_facts(arg_osimage_facts, arg_check_mode=False):
|
||||
"""Package a dictionary of OS image according to the decort_osimage module specification. This
|
||||
dictionary will be returned to the upstream Ansible engine at the completion of the module run.
|
||||
class decort_osimage(DecortController):
|
||||
def __init__(self,amodule):
|
||||
super(decort_osimage, self).__init__(amodule)
|
||||
|
||||
@param arg_osimage_facts: dictionary with OS image facts as returned by API call to .../images/list
|
||||
@param arg_check_mode: boolean that tells if this Ansible module is run in check mode.
|
||||
self.validated_image_id = 0
|
||||
self.validated_virt_image_id = 0
|
||||
self.validated_image_name = amodule.params['image_name']
|
||||
self.validated_virt_image_name = None
|
||||
self.validated_virt_image_id = amodule.params['virt_id']
|
||||
if amodule.params['account_name']:
|
||||
self.validated_account_id, _ = self.account_find(amodule.params['account_name'])
|
||||
else:
|
||||
self.validated_account_id = amodule.params['account_Id']
|
||||
|
||||
if self.validated_account_id == 0:
|
||||
# we failed either to find or access the specified account - fail the module
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = ("Cannot find account '{}'").format(amodule.params['account_name'])
|
||||
amodule.fail_json(**self.result)
|
||||
|
||||
@return: dictionary with OS image specs populated from arg_osimage_facts.
|
||||
"""
|
||||
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
size=0,
|
||||
type="none",
|
||||
state="CHECK_MODE",
|
||||
)
|
||||
if amodule.params['virt_id'] != 0 and amodule.params['virt_name']:
|
||||
self.validated_virt_image_id, image_facts =\
|
||||
self.decort_virt_image_find(amodule)
|
||||
if (self.validated_virt_image_id and
|
||||
amodule.params['virt_name'] != image_facts['name']):
|
||||
self.decort_virt_image_rename(amodule)
|
||||
self.result['msg'] = 'Virtual image renamed successfully'
|
||||
elif amodule.params['image_id'] != 0 and amodule.params['image_name']:
|
||||
self.validated_image_id, image_facts = self.decort_image_find(amodule)
|
||||
if (self.validated_image_id and
|
||||
amodule.params['image_name'] != image_facts['name']):
|
||||
decort_osimage.decort_image_rename(self,amodule)
|
||||
self.result['msg'] = ("Image renamed successfully")
|
||||
|
||||
if arg_check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
if arg_osimage_facts is None:
|
||||
# if void facts provided - change state value to ABSENT and return
|
||||
ret_dict['state'] = "ABSENT"
|
||||
return ret_dict
|
||||
|
||||
def decort_image_find(self, amodule):
|
||||
# function that finds the OS image
|
||||
image_id, image_facts = self.image_find(image_id=amodule.params['image_id'], image_name=self.validated_image_name,
|
||||
account_id=self.validated_account_id, rg_id=0,
|
||||
sepid=amodule.params['sep_id'],
|
||||
pool=amodule.params['pool'])
|
||||
return image_id, image_facts
|
||||
|
||||
def decort_virt_image_find(self, amodule):
|
||||
# function that finds a virtual image
|
||||
image_id, image_facts = self.virt_image_find(image_id=amodule.params['virt_id'],
|
||||
account_id=self.validated_account_id, rg_id=0,
|
||||
sepid=amodule.params['sep_id'],
|
||||
virt_name=amodule.params['virt_name'],
|
||||
pool=amodule.params['pool'])
|
||||
return image_id, image_facts
|
||||
|
||||
|
||||
|
||||
def decort_image_create(self,amodule):
|
||||
# function that creates OS image
|
||||
image_facts = self.image_create(img_name=self.validated_image_name,
|
||||
url=amodule.params['url'],
|
||||
gid=amodule.params['gid'],
|
||||
boottype=amodule.params['boottype'],
|
||||
imagetype=amodule.params['imagetype'],
|
||||
hotresize=amodule.params['hotresize'],
|
||||
username=amodule.params['image_username'],
|
||||
password=amodule.params['image_password'],
|
||||
account_Id=self.validated_account_id,
|
||||
usernameDL=amodule.params['usernameDL'],
|
||||
passwordDL=amodule.params['passwordDL'],
|
||||
sepId=amodule.params['sepId'],
|
||||
poolName=amodule.params['poolName'],
|
||||
drivers=amodule.params['drivers'])
|
||||
self.result['changed'] = True
|
||||
return image_facts
|
||||
|
||||
def decort_virt_image_link(self,amodule):
|
||||
# function that links an OS image to a virtual one
|
||||
self.virt_image_link(imageId=self.validated_virt_image_id, targetId=self.target_image_id)
|
||||
image_id, image_facts = decort_osimage.decort_virt_image_find(self, amodule)
|
||||
self.result['facts'] = decort_osimage.decort_osimage_package_facts(image_facts, amodule.check_mode)
|
||||
self.result['msg'] = ("Image '{}' linked to virtual image '{}'").format(self.target_image_id,
|
||||
decort_osimage.decort_osimage_package_facts(image_facts)['id'],)
|
||||
return image_id, image_facts
|
||||
|
||||
ret_dict['id'] = arg_osimage_facts['id']
|
||||
ret_dict['name'] = arg_osimage_facts['name']
|
||||
ret_dict['size'] = arg_osimage_facts['size']
|
||||
ret_dict['type'] = arg_osimage_facts['type']
|
||||
# ret_dict['arch'] = arg_osimage_facts['architecture']
|
||||
ret_dict['sep_id'] = arg_osimage_facts['sepId']
|
||||
ret_dict['pool'] = arg_osimage_facts['pool']
|
||||
ret_dict['state'] = arg_osimage_facts['status']
|
||||
def decort_image_delete(self,amodule):
|
||||
# function that removes an image
|
||||
self.image_delete(imageId=amodule.image_id_delete)
|
||||
self.result['changed'] = True
|
||||
self.result['msg'] = ("Image '{}' deleted").format(amodule.image_id_delete)
|
||||
|
||||
return ret_dict
|
||||
def decort_virt_image_create(self,amodule):
|
||||
# function that creates a virtual image
|
||||
image_facts = self.virt_image_create(name=amodule.params['virt_name'], targetId=self.target_image_id)
|
||||
image_id, image_facts = decort_osimage.decort_virt_image_find(self, amodule)
|
||||
self.result['facts'] = decort_osimage.decort_osimage_package_facts(image_facts, amodule.check_mode)
|
||||
return image_id, image_facts
|
||||
|
||||
def decort_image_rename(self,amodule):
|
||||
# image renaming function
|
||||
image_facts = self.image_rename(imageId=self.validated_image_id, name=amodule.params['image_name'])
|
||||
self.result['msg'] = ("Image renamed successfully")
|
||||
image_id, image_facts = decort_osimage.decort_image_find(self, amodule)
|
||||
return image_id, image_facts
|
||||
|
||||
def decort_osimage_parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_osimage module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
def decort_virt_image_rename(self, amodule):
|
||||
image_facts = self.image_rename(imageId=self.validated_virt_image_id,
|
||||
name=amodule.params['virt_name'])
|
||||
self.result['msg'] = ("Virtual image renamed successfully")
|
||||
image_id, image_facts = self.decort_virt_image_find(amodule)
|
||||
return image_id, image_facts
|
||||
|
||||
return dict(
|
||||
app_id=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
def decort_osimage_package_facts(arg_osimage_facts, arg_check_mode=False):
|
||||
"""Package a dictionary of OS image according to the decort_osimage module specification. This
|
||||
dictionary will be returned to the upstream Ansible engine at the completion of the module run.
|
||||
|
||||
@param arg_osimage_facts: dictionary with OS image facts as returned by API call to .../images/list
|
||||
@param arg_check_mode: boolean that tells if this Ansible module is run in check mode.
|
||||
|
||||
@return: dictionary with OS image specs populated from arg_osimage_facts.
|
||||
"""
|
||||
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
size=0,
|
||||
type="none",
|
||||
state="CHECK_MODE", )
|
||||
|
||||
if arg_check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
if arg_osimage_facts is None:
|
||||
# if void facts provided - change state value to ABSENT and return
|
||||
ret_dict['state'] = "ABSENT"
|
||||
return ret_dict
|
||||
|
||||
ret_dict['id'] = arg_osimage_facts['id']
|
||||
ret_dict['name'] = arg_osimage_facts['name']
|
||||
ret_dict['size'] = arg_osimage_facts['size']
|
||||
ret_dict['type'] = arg_osimage_facts['type']
|
||||
# ret_dict['arch'] = arg_osimage_facts['architecture']
|
||||
ret_dict['sep_id'] = arg_osimage_facts['sepId']
|
||||
ret_dict['pool'] = arg_osimage_facts['pool']
|
||||
ret_dict['state'] = arg_osimage_facts['status']
|
||||
ret_dict['linkto'] = arg_osimage_facts['linkTo']
|
||||
ret_dict['accountId'] = arg_osimage_facts['accountId']
|
||||
return ret_dict
|
||||
|
||||
|
||||
def decort_osimage_parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_osimage module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
|
||||
return dict(
|
||||
app_id=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
image_name=dict(type='str', required=True),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
pool=dict(type='str', required=False, default=""),
|
||||
sep_id=dict(type='int', required=False, default=0),
|
||||
account_name=dict(type='str', required=False),
|
||||
account_Id=dict(type='int', required=False),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
pool=dict(type='str', required=False, default=""),
|
||||
sep_id=dict(type='int', required=False, default=0),
|
||||
account_name=dict(type='str', required=True),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
vdc_id=dict(type='int', required=False, default=0),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
)
|
||||
|
||||
# Workflow digest:
|
||||
# 1) authenticate to DECORT controller & validate authentication by issuing API call - done when
|
||||
# creating DecortController
|
||||
# 2) obtain a list of OS images accessible to the specified account (and optionally - within
|
||||
# the specified VDC)
|
||||
# 3) match specified OS image by its name - if image is not found abort the module
|
||||
# 5) report result to Ansible
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
image_name=dict(type='str', required=False),
|
||||
image_id=dict(type='int', required=False,default=0),
|
||||
virt_id=dict(type='int', required=False, default=0),
|
||||
virt_name=dict(type='str', required=False),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'present']),
|
||||
drivers=dict(type='str', required=False, default="KVM_X86"),
|
||||
imagetype=dict(type='str', required=False, default="linux"),
|
||||
boottype=dict(type='str', required=False, default="uefi"),
|
||||
url=dict(type='str', required=False),
|
||||
gid=dict(type='int', required=False, default=0),
|
||||
sepId=dict(type='int', required=False, default=0),
|
||||
poolName=dict(type='str', required=False),
|
||||
hotresize=dict(type='bool', required=False, default=False),
|
||||
image_username=dict(type='str', required=False),
|
||||
image_password=dict(type='str', required=False),
|
||||
usernameDL=dict(type='str', required=False),
|
||||
passwordDL=dict(type='str', required=False),
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
module_parameters = decort_osimage_parameters()
|
||||
module_parameters = decort_osimage.decort_osimage_parameters()
|
||||
|
||||
amodule = AnsibleModule(argument_spec=module_parameters,
|
||||
supports_check_mode=True,
|
||||
@@ -273,30 +238,64 @@ def main():
|
||||
],
|
||||
)
|
||||
|
||||
decon = DecortController(amodule)
|
||||
decon = decort_osimage(amodule)
|
||||
|
||||
# we need account ID to locate OS images - find the account by the specified name and get its ID
|
||||
validated_account_id, _ = decon.account_find(amodule.params['account_name'])
|
||||
if validated_account_id == 0:
|
||||
# we failed either to find or access the specified account - fail the module
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Cannot find account '{}'").format(amodule.params['account_name'])
|
||||
amodule.fail_json(**decon.result)
|
||||
if amodule.params['virt_name'] or amodule.params['virt_id']:
|
||||
|
||||
image_id, image_facts = decort_osimage.decort_virt_image_find(decon, amodule)
|
||||
if amodule.params['image_name'] or amodule.params['image_id']:
|
||||
decon.target_image_id, _ = decort_osimage.decort_image_find(decon, amodule)
|
||||
else:
|
||||
decon.target_image_id = 0
|
||||
if decort_osimage.decort_osimage_package_facts(image_facts)['id'] > 0:
|
||||
decon.result['facts'] = decort_osimage.decort_osimage_package_facts(image_facts, amodule.check_mode)
|
||||
decon.validated_virt_image_id = decort_osimage.decort_osimage_package_facts(image_facts)['id']
|
||||
decon.validated_virt_image_name = decort_osimage.decort_osimage_package_facts(image_facts)['name']
|
||||
|
||||
if decort_osimage.decort_osimage_package_facts(image_facts)['id'] == 0 and amodule.params['state'] == "present" and decon.target_image_id > 0:
|
||||
image_id, image_facts = decort_osimage.decort_virt_image_create(decon,amodule)
|
||||
decon.result['msg'] = ("Virtual image '{}' created").format(decort_osimage.decort_osimage_package_facts(image_facts)['id'])
|
||||
decon.result['changed'] = True
|
||||
elif decort_osimage.decort_osimage_package_facts(image_facts)['id'] == 0 and amodule.params['state'] == "present" and decon.target_image_id == 0:
|
||||
decon.result['msg'] = ("Cannot find OS image")
|
||||
amodule.fail_json(**decon.result)
|
||||
|
||||
if decon.validated_virt_image_id and decon.target_image_id:
|
||||
if decort_osimage.decort_osimage_package_facts(image_facts)['linkto'] != decon.target_image_id:
|
||||
decort_osimage.decort_virt_image_link(decon,amodule)
|
||||
decon.result['changed'] = True
|
||||
amodule.exit_json(**decon.result)
|
||||
|
||||
if decon.validated_virt_image_id > 0 and amodule.params['state'] == "absent":
|
||||
decon.result['msg'] = ("Osimage module cannot delete virtual images.")
|
||||
decon.result['failed'] = True
|
||||
amodule.exit_json(**decon.result)
|
||||
|
||||
elif amodule.params['image_name'] or amodule.params['image_id']:
|
||||
image_id, image_facts = decort_osimage.decort_image_find(decon, amodule)
|
||||
decon.validated_image_id = decort_osimage.decort_osimage_package_facts(image_facts)['id']
|
||||
if decort_osimage.decort_osimage_package_facts(image_facts)['id'] > 0:
|
||||
decon.result['facts'] = decort_osimage.decort_osimage_package_facts(image_facts, amodule.check_mode)
|
||||
|
||||
if amodule.params['state'] == "present" and decon.validated_image_id == 0 and amodule.params['image_name'] and amodule.params['url']:
|
||||
decort_osimage.decort_image_create(decon,amodule)
|
||||
decon.result['changed'] = True
|
||||
image_id, image_facts = decort_osimage.decort_image_find(decon, amodule)
|
||||
decon.result['msg'] = ("OS image '{}' created").format(decort_osimage.decort_osimage_package_facts(image_facts)['id'])
|
||||
decon.result['facts'] = decort_osimage.decort_osimage_package_facts(image_facts, amodule.check_mode)
|
||||
decon.validated_image_id = decort_osimage.decort_osimage_package_facts(image_facts)['id']
|
||||
|
||||
elif amodule.params['state'] == "absent" and decon.validated_image_id:
|
||||
amodule.image_id_delete = decon.validated_image_id
|
||||
decort_osimage.decort_image_delete(decon,amodule)
|
||||
|
||||
image_id, image_facts = decon.image_find(image_id=0, image_name=amodule.params['image_name'],
|
||||
account_id=validated_account_id, rg_id=0,
|
||||
sepid=amodule.params['sep_id'],
|
||||
pool=amodule.params['pool'])
|
||||
if decon.result['failed'] == True:
|
||||
# we failed to find the specified image - fail the module
|
||||
decon.result['changed'] = False
|
||||
amodule.fail_json(**decon.result)
|
||||
|
||||
decon.result['facts'] = decort_osimage_package_facts(image_facts, amodule.check_mode)
|
||||
decon.result['changed'] = False # decort_osimage is a read-only module - make sure the 'changed' flag is set to False
|
||||
amodule.exit_json(**decon.result)
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
@@ -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
|
||||
@@ -248,7 +78,7 @@ def decort_pfw_parameters():
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
rules=dict(type='list', required=False, default=[]),
|
||||
rules=dict(type='list', required=False),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'present']),
|
||||
@@ -314,9 +144,11 @@ def main():
|
||||
if amodule.params['state'] == 'absent':
|
||||
# ignore amodule.params['rules'] and remove all rules associated with this Compute
|
||||
pfw_facts = decon.pfw_configure(comp_facts, vins_facts, None)
|
||||
else:
|
||||
elif amodule.params['rules'] is not None:
|
||||
# manage PFW rules accodring to the module arguments
|
||||
pfw_facts = decon.pfw_configure(comp_facts, vins_facts, amodule.params['rules'])
|
||||
else:
|
||||
pfw_facts = decon._pfw_get(comp_facts['id'], vins_facts['id'])
|
||||
|
||||
#
|
||||
# complete module run
|
||||
|
||||
@@ -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
|
||||
@@ -210,89 +13,314 @@ from ansible.module_utils.basic import env_fallback
|
||||
from ansible.module_utils.decort_utils import *
|
||||
|
||||
|
||||
def decort_rg_package_facts(arg_rg_facts, arg_check_mode=False):
|
||||
"""Package a dictionary of RG facts according to the decort_rg module specification. This dictionary will
|
||||
be returned to the upstream Ansible engine at the completion of the module run.
|
||||
class decort_rg(DecortController):
|
||||
def __init__(self,amodule):
|
||||
super(decort_rg, self).__init__(amodule)
|
||||
|
||||
@param arg_rg_facts: dictionary with RG facts as returned by API call to .../rg/get
|
||||
@param arg_check_mode: boolean that tells if this Ansible module is run in check mode
|
||||
"""
|
||||
self.validated_acc_id = 0
|
||||
self.validated_rg_id = 0
|
||||
self.validated_rg_facts = None
|
||||
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
state="CHECK_MODE",
|
||||
)
|
||||
if amodule.params['rg_id'] is None:
|
||||
if self.amodule.params['account_id']:
|
||||
self.validated_acc_id, _ = self.account_find("", amodule.params['account_id'])
|
||||
elif amodule.params['account_name']:
|
||||
self.validated_acc_id, _ = self.account_find(amodule.params['account_name'])
|
||||
if not self.validated_acc_id:
|
||||
# we failed to locate account by either name or ID - abort with an error
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = ("Current user does not have access to the requested account "
|
||||
"or non-existent account specified.")
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
# Check if the RG with the specified parameters already exists
|
||||
self.get_info()
|
||||
|
||||
if amodule.params['state'] != "absent":
|
||||
self.rg_should_exist = True
|
||||
else:
|
||||
self.rg_should_exist = False
|
||||
|
||||
def get_info(self):
|
||||
# If this is the first getting info
|
||||
if not self.validated_rg_id:
|
||||
self.validated_rg_id, self.rg_facts = self.rg_find(
|
||||
arg_account_id=self.validated_acc_id,
|
||||
arg_rg_id=self.aparams['rg_id'],
|
||||
arg_rg_name=self.aparams['rg_name'],
|
||||
arg_check_state=False,
|
||||
)
|
||||
# If this is a repeated getting info
|
||||
else:
|
||||
# If check mode is enabled, there is no needed to
|
||||
# request info again
|
||||
if self.amodule.check_mode:
|
||||
return
|
||||
|
||||
_, self.rg_facts = self.rg_find(arg_rg_id=self.validated_rg_id)
|
||||
|
||||
def access(self):
|
||||
should_change_access = False
|
||||
acc_granted = False
|
||||
for rg_item in self.rg_facts['acl']:
|
||||
if rg_item['userGroupId'] == self.amodule.params['access']['user']:
|
||||
acc_granted = True
|
||||
if self.amodule.params['access']['action'] == 'grant':
|
||||
if rg_item['right'] != self.amodule.params['access']['right']:
|
||||
should_change_access = True
|
||||
if self.amodule.params['access']['action'] == 'revoke':
|
||||
should_change_access = True
|
||||
if acc_granted == False and self.amodule.params['access']['action'] == 'grant':
|
||||
should_change_access = True
|
||||
|
||||
if should_change_access == True:
|
||||
self.rg_access(self.validated_rg_id, self.amodule.params['access'])
|
||||
self.rg_facts['access'] = self.amodule.params['access']
|
||||
self.rg_should_exist = True
|
||||
return
|
||||
|
||||
def error(self):
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
if self.validated_rg_id > 0:
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for rg ID {} in the "
|
||||
"current status '{}'.").format(self.validated_rg_id,
|
||||
self.amodule.params['state'],
|
||||
self.rg_facts['status'])
|
||||
else:
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for non-existent rg name '{}' "
|
||||
"in account ID {} ").format(self.amodule.params['state'],
|
||||
self.amodule.params['rg_name'],
|
||||
self.validated_acc_id)
|
||||
return
|
||||
|
||||
def update(self):
|
||||
resources = self.rg_facts['Resources']['Reserved']
|
||||
incorrect_quota = dict(Requested=dict(),
|
||||
Reserved=dict(),)
|
||||
query_key_map = dict(cpu='cpu',
|
||||
ram='ram',
|
||||
disk='disksize',
|
||||
ext_ips='extips',
|
||||
net_transfer='exttraffic',)
|
||||
if self.amodule.params['quotas']:
|
||||
for quota_item in self.amodule.params['quotas']:
|
||||
if self.amodule.params['quotas'][quota_item] < resources[query_key_map[quota_item]]:
|
||||
incorrect_quota['Requested'][quota_item]=self.amodule.params['quotas'][quota_item]
|
||||
incorrect_quota['Reserved'][quota_item]=resources[query_key_map[quota_item]]
|
||||
|
||||
if incorrect_quota['Requested']:
|
||||
self.result['msg'] = ("Cannot limit less than already reserved'{}'").format(incorrect_quota)
|
||||
self.result['failed'] = True
|
||||
|
||||
if not self.result['failed']:
|
||||
self.rg_update(
|
||||
arg_rg_dict=self.rg_facts,
|
||||
arg_quotas=self.amodule.params['quotas'],
|
||||
arg_res_types=self.amodule.params['resType'],
|
||||
arg_newname=self.amodule.params['rename'],
|
||||
arg_sep_pools=self.amodule.params['sep_pools'],
|
||||
)
|
||||
self.rg_should_exist = True
|
||||
return
|
||||
|
||||
def setDefNet(self):
|
||||
rg_def_net_type = self.rg_facts['def_net_type']
|
||||
rg_def_net_id = self.rg_facts['def_net_id']
|
||||
aparam_def_net_type = self.aparams['def_netType']
|
||||
aparam_def_net_id = self.aparams['def_netId']
|
||||
|
||||
need_to_reset = (aparam_def_net_type == 'NONE'
|
||||
and rg_def_net_type != aparam_def_net_type)
|
||||
|
||||
need_to_change = False
|
||||
if aparam_def_net_id is not None:
|
||||
need_to_change = (aparam_def_net_id != rg_def_net_id
|
||||
or aparam_def_net_type != rg_def_net_type)
|
||||
|
||||
if need_to_reset or need_to_change:
|
||||
self.rg_setDefNet(
|
||||
arg_rg_id=self.validated_rg_id,
|
||||
arg_net_type=aparam_def_net_type,
|
||||
arg_net_id=aparam_def_net_id,
|
||||
)
|
||||
self.rg_should_exist = True
|
||||
return
|
||||
|
||||
def create(self):
|
||||
self.validated_rg_id = self.rg_provision(self.validated_acc_id,
|
||||
self.amodule.params['rg_name'],
|
||||
self.amodule.params['owner'],
|
||||
self.amodule.params['description'],
|
||||
self.amodule.params['resType'],
|
||||
self.amodule.params['def_netType'],
|
||||
self.amodule.params['ipcidr'],
|
||||
self.amodule.params['extNetId'],
|
||||
self.amodule.params['extNetIp'],
|
||||
self.amodule.params['quotas'],
|
||||
"", # this is location code. TODO: add module argument
|
||||
)
|
||||
|
||||
if self.validated_rg_id:
|
||||
self.validated_rg_id, self.rg_facts = self.rg_find(
|
||||
arg_account_id=self.validated_acc_id,
|
||||
arg_rg_id=self.validated_rg_id,
|
||||
arg_rg_name="",
|
||||
arg_check_state=False
|
||||
)
|
||||
self.rg_should_exist = True
|
||||
return
|
||||
|
||||
def enable(self):
|
||||
self.rg_enable(self.validated_rg_id,
|
||||
self.amodule.params['state'])
|
||||
if self.amodule.params['state'] == "enabled":
|
||||
self.rg_facts['status'] = 'CREATED'
|
||||
else:
|
||||
self.rg_facts['status'] = 'DISABLED'
|
||||
self.rg_should_exist = True
|
||||
return
|
||||
|
||||
def restore(self):
|
||||
self.rg_restore(self.validated_rg_id)
|
||||
self.rg_facts['status'] = 'DISABLED'
|
||||
self.rg_should_exist = True
|
||||
return
|
||||
|
||||
def destroy(self):
|
||||
self.rg_delete(
|
||||
rg_id=self.validated_rg_id,
|
||||
permanently=self.amodule.params['permanently'],
|
||||
recursively=self.aparams['recursive_deletion'],
|
||||
)
|
||||
if self.amodule.params['permanently'] == True:
|
||||
self.rg_facts['status'] = 'DESTROYED'
|
||||
else:
|
||||
self.rg_facts['status'] = 'DELETED'
|
||||
self.rg_should_exist = False
|
||||
return
|
||||
|
||||
def package_facts(self, check_mode=False):
|
||||
"""Package a dictionary of RG facts according to the decort_rg module specification. This dictionary will
|
||||
be returned to the upstream Ansible engine at the completion of the module run.
|
||||
|
||||
@param arg_rg_facts: dictionary with RG facts as returned by API call to .../rg/get
|
||||
@param arg_check_mode: boolean that tells if this Ansible module is run in check mode
|
||||
"""
|
||||
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
state="CHECK_MODE",
|
||||
)
|
||||
|
||||
if check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
#if arg_rg_facts is None:
|
||||
# # if void facts provided - change state value to ABSENT and return
|
||||
# ret_dict['state'] = "ABSENT"
|
||||
# return ret_dict
|
||||
|
||||
ret_dict['id'] = self.rg_facts['id']
|
||||
ret_dict['name'] = self.rg_facts['name']
|
||||
ret_dict['state'] = self.rg_facts['status']
|
||||
ret_dict['account_id'] = self.rg_facts['accountId']
|
||||
ret_dict['gid'] = self.rg_facts['gid']
|
||||
ret_dict['quota'] = self.rg_facts['resourceLimits']
|
||||
ret_dict['resTypes'] = self.rg_facts['resourceTypes']
|
||||
ret_dict['defNetId'] = self.rg_facts['def_net_id']
|
||||
ret_dict['defNetType'] = self.rg_facts['def_net_type']
|
||||
ret_dict['ViNS'] = self.rg_facts['vins']
|
||||
ret_dict['computes'] = self.rg_facts['vms']
|
||||
ret_dict['uniqPools'] = self.rg_facts['uniqPools']
|
||||
|
||||
if arg_check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
if arg_rg_facts is None:
|
||||
# if void facts provided - change state value to ABSENT and return
|
||||
ret_dict['state'] = "ABSENT"
|
||||
return ret_dict
|
||||
def parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_rg module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
|
||||
ret_dict['id'] = arg_rg_facts['id']
|
||||
ret_dict['name'] = arg_rg_facts['name']
|
||||
ret_dict['state'] = arg_rg_facts['status']
|
||||
ret_dict['account_id'] = arg_rg_facts['accountId']
|
||||
ret_dict['gid'] = arg_rg_facts['gid']
|
||||
|
||||
return ret_dict
|
||||
|
||||
def decort_rg_parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_rg module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
|
||||
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'])),
|
||||
app_secret=dict(type='str',
|
||||
return dict(
|
||||
account_id=dict(type='int', required=False),
|
||||
account_name=dict(type='str', required=False, default=''),
|
||||
access=dict(type='dict'),
|
||||
description=dict(type='str', required=False, default=''),
|
||||
app_id=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
# datacenter=dict(type='str', required=False, default=''),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
# datacenter=dict(type='str', required=False, default=''),
|
||||
def_netType=dict(type='str', choices=['PRIVATE','PUBLIC', 'NONE'], default='PRIVATE'),
|
||||
def_netId=dict(type='int'),
|
||||
extNetId=dict(type='int', default=0),
|
||||
extNetIp=dict(type='str', default=""),
|
||||
owner=dict(type='str', default=""),
|
||||
ipcidr=dict(type='str', default=""),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
rename=dict(type='str', default=""),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
quotas=dict(type='dict', required=False),
|
||||
resType=dict(type='list'),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'disabled', 'enabled', 'present']),
|
||||
permanently=dict(type='bool',
|
||||
default='False'),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
quotas=dict(type='dict', required=False),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'disabled', 'enabled', 'present']),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
rg_name=dict(type='str', required=True,),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
)
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
rg_name=dict(type='str', required=False,),
|
||||
rg_id=dict(type='int', required=False),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
sep_pools=dict(
|
||||
type='list',
|
||||
elements='dict',
|
||||
options=dict(
|
||||
sep_id=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
pool_names=dict(
|
||||
type='list',
|
||||
required=True,
|
||||
elements='str',
|
||||
),
|
||||
),
|
||||
),
|
||||
recursive_deletion=dict(
|
||||
type='bool',
|
||||
default=False,
|
||||
)
|
||||
)
|
||||
|
||||
# Workflow digest:
|
||||
# 1) authenticate to DECORT controller & validate authentication by issuing API call - done when creating DECORTController
|
||||
# 2) check if the RG with the specified id or rg_name:name exists
|
||||
# 3) if RG does not exist -> deploy
|
||||
# 4) if RG exists: check desired state, desired configuration -> initiate action accordingly
|
||||
# 5) report result to Ansible
|
||||
# Workflow digest:
|
||||
# 1) authenticate to DECORT controller & validate authentication by issuing API call - done when creating DECORTController
|
||||
# 2) check if the RG with the specified id or rg_name:name exists
|
||||
# 3) if RG does not exist -> deploy
|
||||
# 4) if RG exists: check desired state, desired configuration -> initiate action accordingly
|
||||
# 5) report result to Ansible
|
||||
|
||||
def main():
|
||||
module_parameters = decort_rg_parameters()
|
||||
module_parameters = decort_rg.parameters()
|
||||
|
||||
amodule = AnsibleModule(argument_spec=module_parameters,
|
||||
supports_check_mode=True,
|
||||
@@ -307,157 +335,70 @@ def main():
|
||||
],
|
||||
)
|
||||
|
||||
decon = DecortController(amodule)
|
||||
|
||||
# We need valid Account ID to manage RG.
|
||||
# Account may be specified either by account_id or account_name. In both cases we
|
||||
# have to validate account presence and accesibility by the current user.
|
||||
validated_acc_id = 0
|
||||
if decon.check_amodule_argument('account_id', False):
|
||||
validated_acc_id, _ = decon.account_find("", amodule.params['account_id'])
|
||||
else:
|
||||
decon.check_amodule_argument('account_name') # if no account_name, this function will abort module
|
||||
validated_acc_id, _ = decon.account_find(amodule.params['account_name'])
|
||||
|
||||
if not validated_acc_id:
|
||||
# we failed to locate account by either name or ID - abort with an error
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = ("Current user does not have access to the requested account "
|
||||
"or non-existent account specified.")
|
||||
decon.fail_json(**decon.result)
|
||||
|
||||
# Check if the RG with the specified parameters already exists
|
||||
rg_id, rg_facts = decon.rg_find(validated_acc_id,
|
||||
0, arg_rg_name=amodule.params['rg_name'],
|
||||
arg_check_state=False)
|
||||
rg_should_exist = True
|
||||
|
||||
if rg_id:
|
||||
if rg_facts['status'] in ["MODELED", "DISABLING", "ENABLING", "DELETING", "DESTROYING"]:
|
||||
# error: nothing can be done to existing RG in the listed statii regardless of
|
||||
# the requested state
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("No change can be done for existing RG ID {} because of its current "
|
||||
"status '{}'").format(rg_id, rg_facts['status'])
|
||||
elif rg_facts['status'] == "DISABLED":
|
||||
decon = decort_rg(amodule)
|
||||
#amodule.check_mode=True
|
||||
if decon.validated_rg_id > 0:
|
||||
if decon.rg_facts['status'] in ["MODELED", "DISABLING", "ENABLING", "DELETING", "DESTROYING", "CONFIRMED"]:
|
||||
decon.error()
|
||||
elif decon.rg_facts['status'] in ("CREATED"):
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.rg_delete(arg_rg_id=rg_id, arg_permanently=True)
|
||||
rg_facts['status'] = 'DESTROYED'
|
||||
rg_should_exist = False
|
||||
elif amodule.params['state'] in ('present', 'disabled'):
|
||||
# update quotas
|
||||
decon.rg_quotas(rg_facts, amodule.params['quotas'])
|
||||
elif amodule.params['state'] == 'enabled':
|
||||
# update quotas and enable
|
||||
decon.rg_quotas(rg_facts, amodule.params['quotas'])
|
||||
decon.rg_state(rg_facts, 'enabled')
|
||||
elif rg_facts['status'] == "CREATED":
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.rg_delete(arg_rg_id=rg_id, arg_permanently=True)
|
||||
rg_facts['status'] = 'DESTROYED'
|
||||
rg_should_exist = False
|
||||
elif amodule.params['state'] in ('present', 'enabled'):
|
||||
# update quotas
|
||||
decon.rg_quotas(rg_facts, amodule.params['quotas'])
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
# disable and update quotas
|
||||
decon.rg_state(rg_facts, 'disabled')
|
||||
decon.rg_quotas(rg_facts, amodule.params['quotas'])
|
||||
elif rg_facts['status'] == "DELETED":
|
||||
decon.destroy()
|
||||
elif amodule.params['state'] == "disabled":
|
||||
decon.enable()
|
||||
if amodule.params['state'] in ['present', 'enabled']:
|
||||
# restore and enable
|
||||
# TODO: check if restore RG API returns the new RG ID of the restored RG instance.
|
||||
decon.rg_restore(arg_rg_id=rg_id)
|
||||
decon.rg_state(rg_facts, 'enabled')
|
||||
# TODO: Not sure what to do with the quotas after RG is restored. May need to update rg_facts.
|
||||
rg_should_exist = True
|
||||
elif amodule.params['state'] == 'absent':
|
||||
# destroy permanently
|
||||
decon.rg_delete(arg_rg_id=rg_id, arg_permanently=True)
|
||||
rg_facts['status'] = 'DESTROYED'
|
||||
rg_should_exist = False
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
# error
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Invalid target state '{}' requested for RG ID {} in the "
|
||||
"current status '{}'").format(rg_id,
|
||||
amodule.params['state'],
|
||||
rg_facts['status'])
|
||||
rg_should_exist = False
|
||||
elif rg_facts['status'] == "DESTROYED":
|
||||
if amodule.params['state'] in ('present', 'enabled'):
|
||||
# need to re-provision RG
|
||||
decon.check_amodule_argument('rg_name')
|
||||
# As we already have validated account ID we can create RG and get rg_id on success
|
||||
# pass empty string for location code, rg_provision will select the 1st location
|
||||
rg_id = decon.rg_provision(validated_acc_id,
|
||||
amodule.params['rg_name'], decon.decort_username,
|
||||
amodule.params['quotas'],
|
||||
"", # this is location code. TODO: add module argument
|
||||
amodule.params['annotation'])
|
||||
rg_should_exist = True
|
||||
elif amodule.params['state'] == 'absent':
|
||||
# nop
|
||||
decon.result['failed'] = False
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("No state change required for RG ID {} because of its "
|
||||
"current status '{}'").format(rg_id,
|
||||
rg_facts['status'])
|
||||
rg_should_exist = False
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
# error
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Invalid target state '{}' requested for RG ID {} in the "
|
||||
"current status '{}'").format(rg_id,
|
||||
amodule.params['state'],
|
||||
rg_facts['status'])
|
||||
if (
|
||||
amodule.params['quotas']
|
||||
or amodule.params['resType']
|
||||
or amodule.params['rename'] != ""
|
||||
or amodule.params['sep_pools'] is not None
|
||||
):
|
||||
decon.update()
|
||||
if amodule.params['access']:
|
||||
decon.access()
|
||||
if amodule.params['def_netType'] is not None:
|
||||
decon.setDefNet()
|
||||
|
||||
elif decon.rg_facts['status'] == "DELETED":
|
||||
if amodule.params['state'] == 'absent' and amodule.params['permanently'] == True:
|
||||
decon.destroy()
|
||||
elif (amodule.params['state'] == 'present'
|
||||
or amodule.params['state'] == 'disabled'):
|
||||
decon.restore()
|
||||
elif amodule.params['state'] == 'enabled':
|
||||
decon.restore()
|
||||
decon.enable()
|
||||
elif decon.rg_facts['status'] in ("DISABLED"):
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.destroy()
|
||||
elif amodule.params['state'] == ("enabled"):
|
||||
decon.enable()
|
||||
|
||||
else:
|
||||
# Preexisting RG was not found.
|
||||
rg_should_exist = False # we will change it back to True if RG is explicitly created or restored
|
||||
# If requested state is 'absent' - nothing to do
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.result['failed'] = False
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Nothing to do as target state 'absent' was requested for "
|
||||
"non-existent RG name '{}'").format(amodule.params['rg_name'])
|
||||
elif amodule.params['state'] in ('present', 'enabled'):
|
||||
# Target RG does not exist yet - create it and store the returned ID in rg_id variable for later use
|
||||
# To create RG we need account name (or account ID) and RG name - check
|
||||
# that these parameters are present and proceed.
|
||||
decon.check_amodule_argument('rg_name')
|
||||
# as we already have account ID we can create RG and get rg_id on success
|
||||
# pass empty string for location code, rg_provision will select the 1st location
|
||||
rg_id = decon.rg_provision(validated_acc_id,
|
||||
amodule.params['rg_name'], decon.decort_username,
|
||||
amodule.params['quotas'],
|
||||
"", # this is location code. TODO: add module argument
|
||||
amodule.params['annotation'])
|
||||
rg_should_exist = True
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Invalid target state '{}' requested for non-existent "
|
||||
"RG name '{}' ").format(amodule.params['state'],
|
||||
amodule.params['rg_name'])
|
||||
#
|
||||
# conditional switch end - complete module run
|
||||
if amodule.params['state'] in ('present', 'enabled'):
|
||||
if not amodule.params['rg_name']:
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = (
|
||||
'Resource group could not be created because'
|
||||
' the "rg_name" parameter was not specified.'
|
||||
)
|
||||
else:
|
||||
decon.create()
|
||||
if amodule.params['access'] and not amodule.check_mode:
|
||||
decon.access()
|
||||
elif amodule.params['state'] in ('disabled'):
|
||||
decon.error()
|
||||
|
||||
|
||||
if decon.result['failed']:
|
||||
amodule.fail_json(**decon.result)
|
||||
else:
|
||||
# prepare RG facts to be returned as part of decon.result and then call exit_json(...)
|
||||
# rg_facts = None
|
||||
if rg_should_exist:
|
||||
if decon.rg_should_exist:
|
||||
if decon.result['changed']:
|
||||
# If we arrive here, there is a good chance that the RG is present - get fresh RG facts from
|
||||
# the cloud by RG ID.
|
||||
# Otherwise, RG facts from previous call (when the RG was still in existence) will be returned.
|
||||
_, rg_facts = decon.rg_find(arg_account_id=0, arg_rg_id=rg_id)
|
||||
decon.result['facts'] = decort_rg_package_facts(rg_facts, amodule.check_mode)
|
||||
amodule.exit_json(**decon.result)
|
||||
|
||||
decon.get_info()
|
||||
decon.result['facts'] = decon.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**decon.result)
|
||||
else:
|
||||
amodule.exit_json(**decon.result)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
346
library/decort_user_info.py
Normal file
346
library/decort_user_info.py
Normal file
@@ -0,0 +1,346 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
DOCUMENTATION = r'''
|
||||
---
|
||||
module: decort_user_info
|
||||
|
||||
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.decort_utils import DecortController
|
||||
|
||||
|
||||
class DecortUserInfo(DecortController):
|
||||
def __init__(self):
|
||||
super().__init__(AnsibleModule(**self.amodule_init_args))
|
||||
self.check_amodule_args()
|
||||
|
||||
@property
|
||||
def amodule_init_args(self) -> dict:
|
||||
return self.pack_amodule_init_args(
|
||||
argument_spec=dict(
|
||||
accounts=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
deleted=dict(
|
||||
type='bool',
|
||||
default=False,
|
||||
),
|
||||
filter=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
rights=dict(
|
||||
type='str',
|
||||
choices=[
|
||||
e.value
|
||||
for e in self.AccountUserRights
|
||||
],
|
||||
),
|
||||
id=dict(
|
||||
type='int',
|
||||
),
|
||||
name=dict(
|
||||
type='str',
|
||||
),
|
||||
status=dict(
|
||||
type='str',
|
||||
choices=[
|
||||
e.value for e in self.AccountStatus
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
pagination=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
number=dict(
|
||||
type='int',
|
||||
default=1,
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
resource_consumption=dict(
|
||||
type='bool',
|
||||
default=False,
|
||||
),
|
||||
sorting=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
asc=dict(
|
||||
type='bool',
|
||||
default=True,
|
||||
),
|
||||
field=dict(
|
||||
type='str',
|
||||
choices=[
|
||||
e.value
|
||||
for e in self.AccountSortableField
|
||||
],
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
api_methods=dict(
|
||||
type='bool',
|
||||
default=False,
|
||||
),
|
||||
audits=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
filter=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
api_method=dict(
|
||||
type='str',
|
||||
),
|
||||
status_code=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
min=dict(
|
||||
type='int',
|
||||
),
|
||||
max=dict(
|
||||
type='int',
|
||||
),
|
||||
),
|
||||
),
|
||||
time=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
start=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
unix=dict(
|
||||
type='int',
|
||||
),
|
||||
date_time=dict(
|
||||
type='str',
|
||||
),
|
||||
),
|
||||
mutually_exclusive=[
|
||||
('unix', 'date_time'),
|
||||
],
|
||||
),
|
||||
end=dict(
|
||||
type='dict',
|
||||
options=dict(
|
||||
unix=dict(
|
||||
type='int',
|
||||
),
|
||||
date_time=dict(
|
||||
type='str',
|
||||
),
|
||||
),
|
||||
mutually_exclusive=[
|
||||
('unix', 'date_time'),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
pagination=dict(
|
||||
type='dict',
|
||||
apply_defaults=True,
|
||||
options=dict(
|
||||
number=dict(
|
||||
type='int',
|
||||
default=1,
|
||||
),
|
||||
size=dict(
|
||||
type='int',
|
||||
default=50,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
objects_search=dict(
|
||||
type='str',
|
||||
),
|
||||
resource_consumption=dict(
|
||||
type='bool',
|
||||
default=False,
|
||||
),
|
||||
),
|
||||
supports_check_mode=True,
|
||||
)
|
||||
|
||||
def check_amodule_args(self):
|
||||
"""
|
||||
Additional validation of Ansible Module arguments.
|
||||
This validation cannot be implemented using
|
||||
Ansible Argument spec.
|
||||
"""
|
||||
|
||||
check_error = False
|
||||
|
||||
match self.aparams['audits']:
|
||||
case {'filter': {'time':
|
||||
{'start': {'date_time': str() as dt_str}}
|
||||
}
|
||||
}:
|
||||
if self.dt_str_to_sec(dt_str=dt_str) is None:
|
||||
self.message(self.MESSAGES.str_not_parsed(string=dt_str))
|
||||
check_error = True
|
||||
match self.aparams['audits']:
|
||||
case {'filter': {'time':
|
||||
{'end': {'date_time': str() as dt_str}}
|
||||
}
|
||||
}:
|
||||
if self.dt_str_to_sec(dt_str=dt_str) is None:
|
||||
self.message(self.MESSAGES.str_not_parsed(string=dt_str))
|
||||
check_error = True
|
||||
|
||||
if check_error:
|
||||
self.exit(fail=True)
|
||||
|
||||
@property
|
||||
def mapped_accounts_args(self) -> None | dict:
|
||||
"""
|
||||
Map the module argument `accounts` to
|
||||
arguments dictionary for the method
|
||||
`DecortController.user_accounts`.
|
||||
"""
|
||||
|
||||
input_args = self.aparams['accounts']
|
||||
if not input_args:
|
||||
return input_args
|
||||
|
||||
mapped_args = {}
|
||||
|
||||
mapped_args['deleted'] = input_args['deleted']
|
||||
|
||||
mapped_args['resource_consumption'] = (
|
||||
input_args['resource_consumption']
|
||||
)
|
||||
|
||||
input_args_filter = input_args['filter']
|
||||
if input_args_filter:
|
||||
input_args_filter_rights = input_args_filter['rights']
|
||||
if input_args_filter_rights:
|
||||
mapped_args['account_user_rights'] = (
|
||||
self.AccountUserRights(input_args_filter_rights)
|
||||
)
|
||||
|
||||
mapped_args['account_id'] = input_args_filter['id']
|
||||
|
||||
mapped_args['account_name'] = input_args_filter['name']
|
||||
|
||||
input_args_filter_status = input_args_filter['status']
|
||||
if input_args_filter_status:
|
||||
mapped_args['account_status'] = (
|
||||
self.AccountStatus(input_args_filter_status)
|
||||
)
|
||||
|
||||
input_args_pagination = input_args['pagination']
|
||||
if input_args_pagination:
|
||||
mapped_args['page_number'] = input_args_pagination['number']
|
||||
mapped_args['page_size'] = input_args_pagination['size']
|
||||
|
||||
input_args_sorting = input_args['sorting']
|
||||
if input_args_sorting:
|
||||
mapped_args['sort_by_asc'] = input_args_sorting['asc']
|
||||
|
||||
input_args_sorting_field = input_args_sorting['field']
|
||||
if input_args_sorting_field:
|
||||
mapped_args['sort_by_field'] = (
|
||||
self.AccountSortableField(input_args_sorting_field)
|
||||
)
|
||||
|
||||
return mapped_args
|
||||
|
||||
@property
|
||||
def mapped_audits_args(self):
|
||||
"""
|
||||
Map the module argument `audits` to
|
||||
arguments dictionary for the method
|
||||
`DecortController.user_audits`.
|
||||
"""
|
||||
|
||||
input_args = self.aparams['audits']
|
||||
if not input_args:
|
||||
return input_args
|
||||
|
||||
mapped_args = {}
|
||||
|
||||
input_args_filter = input_args['filter']
|
||||
if input_args_filter:
|
||||
mapped_args['api_method'] = input_args_filter['api_method']
|
||||
|
||||
match input_args_filter['status_code']:
|
||||
case {'min': int() as min_status_code}:
|
||||
mapped_args['min_status_code'] = min_status_code
|
||||
match input_args_filter['status_code']:
|
||||
case {'max': int() as max_status_code}:
|
||||
mapped_args['max_status_code'] = max_status_code
|
||||
|
||||
match input_args_filter['time']:
|
||||
case {'start': {'unix': int() as start_unix_time}}:
|
||||
mapped_args['start_unix_time'] = start_unix_time
|
||||
case {'start': {'date_time': str() as start_dt_str}}:
|
||||
mapped_args['start_unix_time'] = self.dt_str_to_sec(
|
||||
dt_str=start_dt_str
|
||||
)
|
||||
match input_args_filter['time']:
|
||||
case {'end': {'unix': int() as end_unix_time}}:
|
||||
mapped_args['end_unix_time'] = end_unix_time
|
||||
case {'end': {'date_time': str() as end_dt_str}}:
|
||||
mapped_args['end_unix_time'] = self.dt_str_to_sec(
|
||||
dt_str=end_dt_str
|
||||
)
|
||||
|
||||
input_args_pagination = input_args['pagination']
|
||||
if input_args_pagination:
|
||||
mapped_args['page_number'] = input_args_pagination['number']
|
||||
mapped_args['page_size'] = input_args_pagination['size']
|
||||
|
||||
return mapped_args
|
||||
|
||||
def run(self):
|
||||
self.get_info()
|
||||
self.exit()
|
||||
|
||||
def get_info(self):
|
||||
self.facts = self.user_whoami()
|
||||
self.id = self.facts['name']
|
||||
|
||||
user_get = self.user_get(id=self.id)
|
||||
for key in ['emailaddresses', 'data']:
|
||||
self.facts[key] = user_get[key]
|
||||
|
||||
if self.aparams['accounts']:
|
||||
self.facts['accounts'] = self.user_accounts(
|
||||
**self.mapped_accounts_args,
|
||||
)
|
||||
|
||||
if self.aparams['resource_consumption']:
|
||||
self.facts.update(self.user_resource_consumption())
|
||||
|
||||
if self.aparams['audits']:
|
||||
self.facts['audits'] = self.user_audits(**self.mapped_audits_args)
|
||||
|
||||
if self.aparams['api_methods']:
|
||||
self.facts['api_methods'] = self.user_api_methods(id=self.id)
|
||||
|
||||
|
||||
search_string = self.aparams['objects_search']
|
||||
if search_string:
|
||||
self.facts['objects_search'] = self.user_objects_search(
|
||||
search_string=search_string,
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
DecortUserInfo().run()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,243 +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_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:
|
||||
- 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 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
|
||||
@@ -246,101 +13,284 @@ from ansible.module_utils.basic import env_fallback
|
||||
from ansible.module_utils.decort_utils import *
|
||||
|
||||
|
||||
def decort_vins_package_facts(arg_vins_facts, arg_check_mode=False):
|
||||
"""Package a dictionary of ViNS facts according to the decort_vins module specification.
|
||||
This dictionary will be returned to the upstream Ansible engine at the completion of
|
||||
the module run.
|
||||
class decort_vins(DecortController):
|
||||
def __init__(self,arg_amodule):
|
||||
super(decort_vins, self).__init__(arg_amodule)
|
||||
|
||||
@param arg_vins_facts: dictionary with viNS facts as returned by API call to .../vins/get
|
||||
@param arg_check_mode: boolean that tells if this Ansible module is run in check mode
|
||||
"""
|
||||
self.vins_id = 0
|
||||
self.vins_level = "" # "ID" if specified by ID, "RG" - at resource group, "ACC" - at account level
|
||||
vins_facts = None # will hold ViNS facts
|
||||
validated_rg_id = 0
|
||||
rg_facts = None # will hold RG facts
|
||||
validated_acc_id = 0
|
||||
acc_facts = None # will hold Account facts
|
||||
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
state="CHECK_MODE",
|
||||
)
|
||||
|
||||
if arg_check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
if arg_vins_facts is None:
|
||||
# if void facts provided - change state value to ABSENT and return
|
||||
ret_dict['state'] = "ABSENT"
|
||||
return ret_dict
|
||||
|
||||
ret_dict['id'] = arg_vins_facts['id']
|
||||
ret_dict['name'] = arg_vins_facts['name']
|
||||
ret_dict['state'] = arg_vins_facts['status']
|
||||
ret_dict['account_id'] = arg_vins_facts['accountId']
|
||||
ret_dict['rg_id'] = arg_vins_facts['rgId']
|
||||
ret_dict['int_net_addr'] = arg_vins_facts['network']
|
||||
ret_dict['gid'] = arg_vins_facts['gid']
|
||||
|
||||
if arg_vins_facts['vnfs'].get('GW'):
|
||||
gw_config = arg_vins_facts['vnfs']['GW']['config']
|
||||
ret_dict['ext_ip_addr'] = gw_config['ext_net_ip']
|
||||
ret_dict['ext_net_id'] = gw_config['ext_net_id']
|
||||
else:
|
||||
ret_dict['ext_ip_addr'] = ""
|
||||
ret_dict['ext_net_id'] = -1
|
||||
if arg_amodule.params['vins_id']:
|
||||
# expect existing ViNS with the specified ID
|
||||
# This call to vins_find will abort the module if no ViNS with such ID is present
|
||||
self.vins_id, self.vins_facts = self.vins_find(arg_amodule.params['vins_id'],check_state=False)
|
||||
if self.vins_id == 0:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = "Specified ViNS ID {} not found.".format(arg_amodule.params['vins_id'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
self.vins_level = "ID"
|
||||
#raise Exception(self.vins_facts)
|
||||
validated_acc_id = self.vins_facts['accountId']
|
||||
validated_rg_id = self.vins_facts['rgId']
|
||||
|
||||
# arg_vins_facts['vnfs']['GW']['config']
|
||||
# ext_ip_addr -> ext_net_ip
|
||||
# ??? -> ext_net_id
|
||||
# tech_status -> techStatus
|
||||
elif arg_amodule.params['rg_id']:
|
||||
# expect ViNS @ RG level in the RG with specified ID
|
||||
self.vins_level = "RG"
|
||||
# This call to rg_find will abort the module if no RG with such ID is present
|
||||
validated_rg_id, rg_facts = self.rg_find(0, # account ID set to 0 as we search for RG by RG ID
|
||||
arg_amodule.params['rg_id'], arg_rg_name="")
|
||||
|
||||
# This call to vins_find may return vins_id=0 if no ViNS found
|
||||
self.vins_id, self.vins_facts = self.vins_find(vins_id=0, vins_name=arg_amodule.params['vins_name'],
|
||||
account_id=0,
|
||||
rg_id=arg_amodule.params['rg_id'],
|
||||
rg_facts=rg_facts,
|
||||
check_state=False)
|
||||
# TODO: add checks and setup ViNS presence flags accordingly
|
||||
pass
|
||||
elif arg_amodule.params['account_id'] or arg_amodule.params['account_name'] != "":
|
||||
# Specified account must be present and accessible by the user, otherwise abort the module
|
||||
validated_acc_id, acc_facts = self.account_find(arg_amodule.params['account_name'], arg_amodule.params['account_id'])
|
||||
if not validated_acc_id:
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = ("Current user does not have access to the requested account "
|
||||
"or non-existent account specified.")
|
||||
self.amodule.fail_json(**self.result)
|
||||
if arg_amodule.params['rg_name'] != "": # at this point we know that rg_id=0
|
||||
# expect ViNS @ RG level in the RG with specified name under specified account
|
||||
# RG with the specified name must be present under the account, otherwise abort the module
|
||||
validated_rg_id, rg_facts = self.rg_find(validated_acc_id, 0, arg_amodule.params['rg_name'])
|
||||
if (not validated_rg_id or
|
||||
rg_facts['status'] in ["DESTROYING", "DESTROYED", "DELETING", "DELETED", "DISABLING", "ENABLING"]):
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = "RG name '{}' not found or has invalid state.".format(arg_amodule.params['rg_name'])
|
||||
self.amodule.fail_json(**self.result)
|
||||
# This call to vins_find may return vins_id=0 if no ViNS with this name found under specified RG
|
||||
self.vins_id, self.vins_facts = self.vins_find(vins_id=0, vins_name=arg_amodule.params['vins_name'],
|
||||
account_id=0, # set to 0, as we are looking for ViNS under RG
|
||||
rg_id=validated_rg_id,
|
||||
rg_facts=rg_facts,
|
||||
check_state=False)
|
||||
self.vins_level = "RG"
|
||||
# TODO: add checks and setup ViNS presence flags accordingly
|
||||
else: # At this point we know for sure that rg_name="" and rg_id=0
|
||||
# So we expect ViNS @ account level
|
||||
# This call to vins_find may return vins_id=0 if no ViNS found
|
||||
self.vins_id, self.vins_facts = self.vins_find(vins_id=0, vins_name=arg_amodule.params['vins_name'],
|
||||
account_id=validated_acc_id,
|
||||
rg_id=0,
|
||||
rg_facts=rg_facts,
|
||||
check_state=False)
|
||||
self.vins_level = "ACC"
|
||||
# TODO: add checks and setup ViNS presence flags accordingly
|
||||
else:
|
||||
# this is "invalid arguments combination" sink
|
||||
# if we end up here, it means that module was invoked with vins_id=0 and rg_id=0
|
||||
self.result['failed'] = True
|
||||
self.result['msg'] = "Cannot find ViNS by name"
|
||||
if arg_amodule.params['account_id'] == 0 and arg_amodule.params['account_name'] == '':
|
||||
self.result['msg'] = "Cannot find ViNS by name when account name is empty and account ID is 0."
|
||||
if arg_amodule.params['rg_name'] == "":
|
||||
# rg_name without account specified
|
||||
self.result['msg'] = "Cannot find ViNS by name when RG name is empty and RG ID is 0."
|
||||
self.amodule.fail_json(**self.result)
|
||||
|
||||
return
|
||||
self.rg_id = validated_rg_id
|
||||
self.acc_id = validated_acc_id
|
||||
return
|
||||
def create(self):
|
||||
self.vins_id = self.vins_provision(self.amodule.params['vins_name'],
|
||||
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['description'])
|
||||
|
||||
if self.amodule.params['mgmtaddr'] or self.amodule.params['connect_to']:
|
||||
_, self.vins_facts = self.vins_find(self.vins_id)
|
||||
if self.amodule.params['connect_to']:
|
||||
self.vins_update_ifaces(self.vins_facts,self.amodule.params['connect_to'],)
|
||||
if self.amodule.params['mgmtaddr']:
|
||||
self.vins_update_mgmt(self.vins_facts,self.amodule.params['mgmtaddr'])
|
||||
|
||||
return
|
||||
def action(self,d_state='',restore=False):
|
||||
if restore == True:
|
||||
self.vins_restore(arg_vins_id=self.vins_id)
|
||||
self.vins_state(self.vins_facts, 'enabled')
|
||||
self.vins_facts['status'] = "ENABLED"
|
||||
self.vins_facts['VNFDev']['techStatus'] = "STARTED"
|
||||
|
||||
self.vins_update_extnet(self.vins_facts,
|
||||
self.amodule.params['ext_net_id'],
|
||||
self.amodule.params['ext_ip_addr'],
|
||||
)
|
||||
|
||||
if d_state == 'enabled' and self.vins_facts['status'] == "DISABLED":
|
||||
self.vins_state(self.vins_facts, d_state)
|
||||
self.vins_facts['status'] = "ENABLED"
|
||||
self.vins_facts['VNFDev']['techStatus'] = "STARTED"
|
||||
d_state = ''
|
||||
|
||||
return ret_dict
|
||||
if self.vins_facts['status'] == "ENABLED" and self.vins_facts['VNFDev']['techStatus'] == "STARTED":
|
||||
self.vins_update_ifaces(self.vins_facts,
|
||||
self.amodule.params['connect_to'],
|
||||
)
|
||||
if self.result['changed']:
|
||||
_, self.vins_facts = self.vins_find(self.vins_id)
|
||||
self.vins_update_mgmt(self.vins_facts,
|
||||
self.amodule.params['mgmtaddr'],
|
||||
)
|
||||
|
||||
if d_state != '':
|
||||
self.vins_state(self.vins_facts, d_state)
|
||||
return
|
||||
def delete(self):
|
||||
self.vins_delete(self.vins_id, permanently=True)
|
||||
self.vins_facts['status'] = 'DESTROYED'
|
||||
return
|
||||
def nop(self):
|
||||
"""No operation (NOP) handler for ViNS management by decort_vins module.
|
||||
This function is intended to be called from the main switch construct of the module
|
||||
when current state -> desired state change logic does not require any changes to
|
||||
the actual ViNS state.
|
||||
"""
|
||||
self.result['failed'] = False
|
||||
self.result['changed'] = False
|
||||
if self.vins_id:
|
||||
self.result['msg'] = ("No state change required for ViNS ID {} because of its "
|
||||
"current status '{}'.").format(self.vins_id, self.vins_facts['status'])
|
||||
else:
|
||||
self.result['msg'] = ("No state change to '{}' can be done for "
|
||||
"non-existent ViNS instance.").format(self.amodule.params['state'])
|
||||
return
|
||||
def error(self):
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
if self.vins_id:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for ViNS ID {} in the "
|
||||
"current status '{}'").format(self.vins_id,
|
||||
self.amodule.params['state'],
|
||||
self.vins_facts['status'])
|
||||
else:
|
||||
self.result['failed'] = True
|
||||
self.result['changed'] = False
|
||||
self.result['msg'] = ("Invalid target state '{}' requested for non-existent "
|
||||
"ViNS name '{}'").format(self.amodule.params['state'],
|
||||
self.amodule.params['vins_name'])
|
||||
return
|
||||
def package_facts(self, arg_check_mode=False):
|
||||
"""Package a dictionary of ViNS facts according to the decort_vins module specification.
|
||||
This dictionary will be returned to the upstream Ansible engine at the completion of
|
||||
the module run.
|
||||
|
||||
def decort_vins_parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_vins module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
@param arg_check_mode: boolean that tells if this Ansible module is run in check mode
|
||||
"""
|
||||
|
||||
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',
|
||||
ret_dict = dict(id=0,
|
||||
name="none",
|
||||
state="CHECK_MODE",
|
||||
)
|
||||
|
||||
if arg_check_mode:
|
||||
# in check mode return immediately with the default values
|
||||
return ret_dict
|
||||
|
||||
if self.vins_facts is None:
|
||||
# if void facts provided - change state value to ABSENT and return
|
||||
ret_dict['state'] = "ABSENT"
|
||||
return ret_dict
|
||||
|
||||
ret_dict['id'] = self.vins_facts['id']
|
||||
ret_dict['name'] = self.vins_facts['name']
|
||||
ret_dict['state'] = self.vins_facts['status']
|
||||
ret_dict['account_id'] = self.vins_facts['accountId']
|
||||
ret_dict['rg_id'] = self.vins_facts['rgId']
|
||||
ret_dict['int_net_addr'] = self.vins_facts['network']
|
||||
ret_dict['gid'] = self.vins_facts['gid']
|
||||
custom_interfaces = list(filter(lambda i: i['type']=="CUSTOM",self.vins_facts['VNFDev']['interfaces']))
|
||||
if custom_interfaces:
|
||||
ret_dict['custom_net_addr'] = []
|
||||
for runner in custom_interfaces:
|
||||
ret_dict['custom_net_addr'].append(runner['ipAddress'])
|
||||
mgmt_interfaces = list(filter(lambda i: i['listenSsh'] and i['name']!="ens9",self.vins_facts['VNFDev']['interfaces']))
|
||||
if mgmt_interfaces:
|
||||
ret_dict['ssh_ipaddr'] = []
|
||||
for runner in mgmt_interfaces:
|
||||
ret_dict['ssh_ipaddr'].append(runner['ipAddress'])
|
||||
ret_dict['ssh_password'] = self.vins_facts['VNFDev']['config']['mgmt']['password']
|
||||
ret_dict['ssh_port'] = 9022
|
||||
if self.vins_facts['vnfs'].get('GW'):
|
||||
gw_config = self.vins_facts['vnfs']['GW']['config']
|
||||
ret_dict['ext_ip_addr'] = gw_config['ext_net_ip']
|
||||
ret_dict['ext_net_id'] = gw_config['ext_net_id']
|
||||
else:
|
||||
ret_dict['ext_ip_addr'] = ""
|
||||
ret_dict['ext_net_id'] = -1
|
||||
|
||||
return ret_dict
|
||||
|
||||
@staticmethod
|
||||
def build_parameters():
|
||||
"""Build and return a dictionary of parameters expected by decort_vins module in a form accepted
|
||||
by AnsibleModule utility class."""
|
||||
|
||||
return dict(
|
||||
account_id=dict(type='int', required=False,default=0),
|
||||
account_name=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'])),
|
||||
app_secret=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
# datacenter=dict(type='str', required=False, default=''),
|
||||
ext_net_id=dict(type='int', required=False, default=-1),
|
||||
ext_ip_addr=dict(type='str', required=False, default=''),
|
||||
ipcidr=dict(type='str', required=False, default=''),
|
||||
mgmtaddr=dict(type='list',required=False, default=[]),
|
||||
custom_config=dict(type='bool',required=False, default=False),
|
||||
config_save=dict(type='bool',required=False, default=False),
|
||||
connect_to=dict(type='list', default=[], required=False),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_ID'])),
|
||||
app_secret=dict(type='str',
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_APP_SECRET']),
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
authenticator=dict(type='str',
|
||||
required=True,
|
||||
choices=['legacy', 'oauth2', 'jwt']),
|
||||
controller_url=dict(type='str', required=True),
|
||||
# datacenter=dict(type='str', required=False, default=''),
|
||||
ext_net_id=dict(type='int', required=False, default=-1),
|
||||
ext_ip_addr=dict(type='str', required=False, default=''),
|
||||
ipcidr=dict(type='str', required=False, default=''),
|
||||
jwt=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_JWT']),
|
||||
no_log=True),
|
||||
oauth2_url=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_OAUTH2_URL'])),
|
||||
password=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_PASSWORD']),
|
||||
no_log=True),
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'disabled', 'enabled', 'present']),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
rg_id=dict(type='int', required=False, default=0),
|
||||
rg_name=dict(type='str', required=False, default=''),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
vins_id=dict(type='int', required=False, default=0),
|
||||
vins_name=dict(type='str', required=True),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
)
|
||||
state=dict(type='str',
|
||||
default='present',
|
||||
choices=['absent', 'disabled', 'enabled', 'present']),
|
||||
user=dict(type='str',
|
||||
required=False,
|
||||
fallback=(env_fallback, ['DECORT_USER'])),
|
||||
rg_id=dict(type='int', required=False, default=0),
|
||||
rg_name=dict(type='str', required=False, default=''),
|
||||
verify_ssl=dict(type='bool', required=False, default=True),
|
||||
vins_id=dict(type='int', required=False, default=0),
|
||||
vins_name=dict(type='str', required=False,default=""),
|
||||
workflow_callback=dict(type='str', required=False),
|
||||
workflow_context=dict(type='str', required=False),
|
||||
)
|
||||
|
||||
|
||||
# Workflow digest:
|
||||
# 1) authenticate to DECORT controller & validate authentication by issuing API call - done when creating DECORTController
|
||||
@@ -350,7 +300,7 @@ def decort_vins_parameters():
|
||||
# 5) report result to Ansible
|
||||
|
||||
def main():
|
||||
module_parameters = decort_vins_parameters()
|
||||
module_parameters = decort_vins.build_parameters()
|
||||
|
||||
amodule = AnsibleModule(argument_spec=module_parameters,
|
||||
supports_check_mode=True,
|
||||
@@ -363,86 +313,12 @@ def main():
|
||||
['app_id', 'app_secret'],
|
||||
['user', 'password'],
|
||||
],
|
||||
required_one_of=[
|
||||
['vins_id', 'vins_name'],
|
||||
],
|
||||
)
|
||||
|
||||
decon = DecortController(amodule)
|
||||
|
||||
vins_id = 0
|
||||
vins_level = "" # "ID" if specified by ID, "RG" - at resource group, "ACC" - at account level
|
||||
vins_facts = None # will hold ViNS facts
|
||||
validated_rg_id = 0
|
||||
rg_facts = None # will hold RG facts
|
||||
validated_acc_id = 0
|
||||
acc_facts = None # will hold Account facts
|
||||
|
||||
if amodule.params['vins_id']:
|
||||
# expect existing ViNS with the specified ID
|
||||
# This call to vins_find will abort the module if no ViNS with such ID is present
|
||||
vins_id, vins_facts = decon.vins_find(amodule.params['vins_id'])
|
||||
if not vins_id:
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = "Specified ViNS ID {} not found.".format(amodule.params['vins_id'])
|
||||
decon.fail_json(**decon.result)
|
||||
vins_level="ID"
|
||||
validated_acc_id = vins_facts['accountId']
|
||||
validated_rg_id = vins_facts['rgId']
|
||||
elif amodule.params['rg_id']:
|
||||
# expect ViNS @ RG level in the RG with specified ID
|
||||
vins_level="RG"
|
||||
# This call to rg_find will abort the module if no RG with such ID is present
|
||||
validated_rg_id, rg_facts = decon.rg_find(0, # account ID set to 0 as we search for RG by RG ID
|
||||
amodule.params['rg_id'], arg_rg_name="")
|
||||
# This call to vins_find may return vins_id=0 if no ViNS found
|
||||
vins_id, vins_facts = decon.vins_find(vins_id=0, vins_name=amodule.params['vins_name'],
|
||||
account_id=0,
|
||||
rg_id=amodule.params['rg_id'],
|
||||
check_state=False)
|
||||
# TODO: add checks and setup ViNS presence flags accordingly
|
||||
pass
|
||||
elif amodule.params['account_id'] or amodule.params['account_name'] != "":
|
||||
# Specified account must be present and accessible by the user, otherwise abort the module
|
||||
validated_acc_id, acc_facts = decon.account_find(amodule.params['account_name'], amodule.params['account_id'])
|
||||
if not validated_acc_id:
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = ("Current user does not have access to the requested account "
|
||||
"or non-existent account specified.")
|
||||
decon.fail_json(**decon.result)
|
||||
if amodule.params['rg_name'] != "": # at this point we know that rg_id=0
|
||||
# expect ViNS @ RG level in the RG with specified name under specified account
|
||||
# RG with the specified name must be present under the account, otherwise abort the module
|
||||
validated_rg_id, rg_facts = decon.rg_find(validated_acc_id, 0, amodule.params['rg_name'])
|
||||
if (not validated_rg_id or
|
||||
rg_facts['status'] in ["DESTROYING", "DESTROYED", "DELETING", "DELETED", "DISABLING", "ENABLING"]):
|
||||
decon.result['failed'] = True
|
||||
decon.result['msg'] = "RG name '{}' not found or has invalid state.".format(amodule.params['rg_name'])
|
||||
decon.fail_json(**decon.result)
|
||||
# This call to vins_find may return vins_id=0 if no ViNS with this name found under specified RG
|
||||
vins_id, vins_facts = decon.vins_find(vins_id=0, vins_name=amodule.params['vins_name'],
|
||||
account_id=0, # set to 0, as we are looking for ViNS under RG
|
||||
rg_id=validated_rg_id,
|
||||
check_state=False)
|
||||
vins_level = "RG"
|
||||
# TODO: add checks and setup ViNS presence flags accordingly
|
||||
else: # At this point we know for sure that rg_name="" and rg_id=0
|
||||
# So we expect ViNS @ account level
|
||||
# This call to vins_find may return vins_id=0 if no ViNS found
|
||||
vins_id, vins_facts = decon.vins_find(vins_id=0, vins_name=amodule.params['vins_name'],
|
||||
account_id=validated_acc_id,
|
||||
rg_id=0,
|
||||
check_state=False)
|
||||
vins_level = "ACC"
|
||||
# TODO: add checks and setup ViNS presence flags accordingly
|
||||
else:
|
||||
# this is "invalid arguments combination" sink
|
||||
# if we end up here, it means that module was invoked with vins_id=0 and rg_id=0
|
||||
decon.result['failed'] = True
|
||||
if amodule.params['account_id'] == 0 and amodule.params['account_name'] == "":
|
||||
decon.result['msg'] = "Cannot find ViNS by name when account name is empty and account ID is 0."
|
||||
if amodule.params['rg_name'] == "":
|
||||
# rg_name without account specified
|
||||
decon.result['msg'] = "Cannot find ViNS by name when RG name is empty and RG ID is 0."
|
||||
decon.fail_json(**decon.result)
|
||||
|
||||
decon = decort_vins(amodule)
|
||||
#
|
||||
# Initial validation of module arguments is complete
|
||||
#
|
||||
@@ -453,124 +329,76 @@ def main():
|
||||
#
|
||||
# When managing existing ViNS we need to account for both "static" and "transient"
|
||||
# status. Full range of ViNS statii is as follows:
|
||||
#
|
||||
#
|
||||
# "MODELED", "CREATED", "ENABLED", "ENABLING", "DISABLED", "DISABLING", "DELETED", "DELETING", "DESTROYED", "DESTROYING"
|
||||
#
|
||||
|
||||
#
|
||||
# if cconfig_save is true, only config save without other updates
|
||||
vins_should_exist = False
|
||||
|
||||
if vins_id:
|
||||
|
||||
if decon.vins_id:
|
||||
vins_should_exist = True
|
||||
if vins_facts['status'] in ["MODELED", "DISABLING", "ENABLING", "DELETING", "DESTROYING"]:
|
||||
if decon.vins_facts['status'] in ["MODELED", "DISABLING", "ENABLING", "DELETING", "DESTROYING"]:
|
||||
# error: nothing can be done to existing ViNS in the listed statii regardless of
|
||||
# the requested state
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("No change can be done for existing ViNS ID {} because of its current "
|
||||
"status '{}'").format(vins_id, vins_facts['status'])
|
||||
elif vins_facts['status'] == "DISABLED":
|
||||
"status '{}'").format(decon.vins_id, decon.vins_facts['status'])
|
||||
elif decon.vins_facts['status'] == "DISABLED":
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.vins_delete(vins_id, permanently=True)
|
||||
vins_facts['status'] = 'DESTROYED'
|
||||
decon.delete()
|
||||
vins_should_exist = False
|
||||
elif amodule.params['state'] in ('present', 'disabled'):
|
||||
# update ViNS, leave in disabled state
|
||||
decon.vins_update(vins_facts,
|
||||
amodule.params['ext_net_id'], amodule.params['ext_ip_addr'])
|
||||
decon.action()
|
||||
elif amodule.params['state'] == 'enabled':
|
||||
# update ViNS and enable
|
||||
decon.vins_update(vins_facts,
|
||||
amodule.params['ext_net_id'], amodule.params['ext_ip_addr'])
|
||||
decon.vins_state(vins_facts, 'enabled')
|
||||
elif vins_facts['status'] in ["CREATED", "ENABLED"]:
|
||||
decon.action('enabled')
|
||||
elif decon.vins_facts['status'] in ["CREATED", "ENABLED"]:
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.vins_delete(vins_id, permanently=True)
|
||||
vins_facts['status'] = 'DESTROYED'
|
||||
decon.delete()
|
||||
vins_should_exist = False
|
||||
elif amodule.params['state'] in ('present', 'enabled'):
|
||||
# update ViNS
|
||||
decon.vins_update(vins_facts,
|
||||
amodule.params['ext_net_id'], amodule.params['ext_ip_addr'])
|
||||
decon.action()
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
# disable and update ViNS
|
||||
decon.vins_state(vins_facts, 'disabled')
|
||||
decon.vins_update(vins_facts,
|
||||
amodule.params['ext_net_id'], amodule.params['ext_ip_addr'])
|
||||
elif vins_facts['status'] == "DELETED":
|
||||
decon.action('disabled')
|
||||
elif decon.vins_facts['status'] == "DELETED":
|
||||
if amodule.params['state'] in ['present', 'enabled']:
|
||||
# restore and enable
|
||||
decon.vins_restore(arg_vins_id=vins_id)
|
||||
decon.vins_state(vins_facts, 'enabled')
|
||||
decon.action(restore=True)
|
||||
vins_should_exist = True
|
||||
elif amodule.params['state'] == 'absent':
|
||||
# destroy permanently
|
||||
decon.vins_delete(vins_id, permanently=True)
|
||||
vins_facts['status'] = 'DESTROYED'
|
||||
decon.delete()
|
||||
vins_should_exist = False
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
# error
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Invalid target state '{}' requested for ViNS ID {} in the "
|
||||
"current status '{}'").format(vins_id,
|
||||
amodule.params['state'],
|
||||
vins_facts['status'])
|
||||
decon.error()
|
||||
vins_should_exist = False
|
||||
elif vins_facts['status'] == "DESTROYED":
|
||||
elif decon.vins_facts['status'] == "DESTROYED":
|
||||
if amodule.params['state'] in ('present', 'enabled'):
|
||||
# need to re-provision ViNS; some attributes may be changed, some stay the same.
|
||||
# account and RG - stays the same
|
||||
# vins_name - stays the same
|
||||
# IPcidr - take from module arguments
|
||||
# ext IP address - take from module arguments
|
||||
# annotation - take from module arguments
|
||||
vins_id = decon.vins_provision(vins_facts['name'],
|
||||
validated_acc_id, validated_rg_id,
|
||||
amodule.params['ipcidr'],
|
||||
amodule.params['ext_net_id'], amodule.params['ext_ip_addr'],
|
||||
amodule.params['annotation'])
|
||||
# need to re-provision ViNS;
|
||||
decon.create()
|
||||
vins_should_exist = True
|
||||
elif amodule.params['state'] == 'absent':
|
||||
# nop
|
||||
decon.result['failed'] = False
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("No state change required for ViNS ID {} because of its "
|
||||
"current status '{}'").format(vins_id,
|
||||
vins_facts['status'])
|
||||
decon.nop()
|
||||
vins_should_exist = False
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
# error
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Invalid target state '{}' requested for ViNS ID {} in the "
|
||||
"current status '{}'").format(vins_id,
|
||||
amodule.params['state'],
|
||||
vins_facts['status'])
|
||||
decon.error()
|
||||
else:
|
||||
# Preexisting ViNS was not found.
|
||||
vins_should_exist = False # we will change it back to True if ViNS is created or restored
|
||||
# If requested state is 'absent' - nothing to do
|
||||
if amodule.params['state'] == 'absent':
|
||||
decon.result['failed'] = False
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Nothing to do as target state 'absent' was requested for "
|
||||
"non-existent ViNS name '{}'").format(amodule.params['vins_name'])
|
||||
decon.nop()
|
||||
elif amodule.params['state'] in ('present', 'enabled'):
|
||||
decon.check_amodule_argument('vins_name')
|
||||
# as we already have account ID and RG ID we can create ViNS and get vins_id on success
|
||||
vins_id = decon.vins_provision(amodule.params['vins_name'],
|
||||
validated_acc_id, validated_rg_id,
|
||||
amodule.params['ipcidr'],
|
||||
amodule.params['ext_net_id'], amodule.params['ext_ip_addr'],
|
||||
amodule.params['annotation'])
|
||||
vins_should_exist = True
|
||||
decon.create()
|
||||
vins_should_exist = True
|
||||
elif amodule.params['state'] == 'disabled':
|
||||
decon.result['failed'] = True
|
||||
decon.result['changed'] = False
|
||||
decon.result['msg'] = ("Invalid target state '{}' requested for non-existent "
|
||||
"ViNS name '{}'").format(amodule.params['state'],
|
||||
amodule.params['vins_name'])
|
||||
|
||||
decon.error()
|
||||
#
|
||||
# conditional switch end - complete module run
|
||||
#
|
||||
@@ -578,14 +406,9 @@ def main():
|
||||
amodule.fail_json(**decon.result)
|
||||
else:
|
||||
# prepare ViNS facts to be returned as part of decon.result and then call exit_json(...)
|
||||
if vins_should_exist:
|
||||
if decon.result['changed']:
|
||||
# If we arrive here, there is a good chance that the ViNS is present - get fresh ViNS
|
||||
# facts from # the cloud by ViNS ID.
|
||||
# Otherwise, ViNS facts from previous call (when the ViNS was still in existence) will
|
||||
# be returned.
|
||||
_, vins_facts = decon.vins_find(vins_id)
|
||||
decon.result['facts'] = decort_vins_package_facts(vins_facts, amodule.check_mode)
|
||||
if decon.result['changed']:
|
||||
_, decon.vins_facts = decon.vins_find(decon.vins_id)
|
||||
decon.result['facts'] = decon.package_facts(amodule.check_mode)
|
||||
amodule.exit_json(**decon.result)
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
20
wiki/5.2.6/Home.md
Normal file
20
wiki/5.2.6/Home.md
Normal file
@@ -0,0 +1,20 @@
|
||||
1. [Введение](./введение.md)
|
||||
- [Введение](./введение.md#введение)
|
||||
- [Системные требования](./введение.md#системные-требования)
|
||||
- [Подготовка к работе](./введение.md#подготовка-к-работе)
|
||||
2. [Обзор облачной платформы DECORT.](./Обзор-облачной-платформы-DECORT.md)
|
||||
- [Основные понятия](./Обзор-облачной-платформы-DECORT.md#основные-понятия)
|
||||
- [Способы авторизации](./Обзор-облачной-платформы-DECORT.md#способы-авторизации)
|
||||
3. Ansible модули DECORT:
|
||||
- [Модуль decort_kvmvm](./модуль-decort_kvmvm.md) - управление виртуальными серверами KVM.
|
||||
- [Модуль 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) - управление Basic сервисами.
|
||||
- [Модуль decort_group](./модуль-decort_group.md)- управление группами виртуальных серверов.
|
||||
- [Модуль decort_k8s](./модуль-decort_k8s.md)- управление кластерами Kubernetes.
|
||||
4. [Полезные советы](./полезные-советы.md)
|
||||
- [Как хранить авторизационную информацию отдельно от плейбука.](./полезные-советы.md#41-как-хранить-авторизационную-информацию-отдельно-от-плейбука)
|
||||
30
wiki/5.2.6/Обзор-облачной-платформы-DECORT.md
Normal file
30
wiki/5.2.6/Обзор-облачной-платформы-DECORT.md
Normal file
@@ -0,0 +1,30 @@
|
||||
## Основные понятия
|
||||
|
||||
Ниже перечислены основные понятия с указанием соответствующих им аргументов в Terraform провайдере DECORT.
|
||||
|
||||
1. Контроллер облачной платформы DECORT – управляющее приложение, которое обеспечивает авторизацию пользователей и оркестрацию облачных ресурсов.
|
||||
- Адрес контроллера задается в обязательном аргументе `controller_url` в Вашем плейбуке. Например, `controller_url= "https://ds1.digitalenergy.online"`
|
||||
2. Авторизационный провайдер – приложение, работающее по протоколу Oauth2, предназначенное для выпуска и валидации токенов доступа к контроллеру облачной платформы в соответствующих режимах авторизации. Все действия в платформе должны выполняться авторизованными пользователями, и авторизационное приложение позволяет получить токен доступа, действующий некоторое ограниченное время, наличие которого подтверждает успешную авторизацию.
|
||||
- Адрес авторизационного провайдера задается в аргументе `oauth2_url` в Вашем плейбуке. Например `oauth2_url= "https://sso.digitalenergy.online"`. При этом необходимо указать тип авторизации `authenticator: oauth2`
|
||||
3. Подписчик (account) – сущность, которая используется для группирования облачных ресурсов по принадлежности к определенному клиенту для целей учета потребления и биллинга.
|
||||
- Имя подписчика задается аргументом `account_name` в Вашем плейбуке. Альтернативой является задание численного идентификатора подписчика в аргументе `account_id`.
|
||||
4. Пользователь (user) – пользователь облачной инфраструктуры, представленный учетной записью. Чтобы получить возможность управлять облачными ресурсами (например, создавать виртуальные серверы или дискт) пользователь должен быть ассоциирован с одним или несколькими подписчиками и иметь соответствующие права, определяемые ролевой моделью, принятой в облачной платформе DECORT. Для доступа к платформе пользователь должен авторизоваться одним из способов, описанных ниже в разделе «Способы авторизации».
|
||||
5. Ресурсная группа (resource group) – способ группирования вычислительных ресурсов (например, виртуальных серверов по функциональному признаку или принадлежности к одному и тому же проекту). Ресурсную группу можно рассматривать как небольшой персональный дата-центр, в котором размещаются один или несколько серверов и виртуальных сетевых сегментов. Ресурсная группа идентифицируется по комбинации параметров `account` и `name`. Обратите внимание, что имя имя ресурсной группы уникально только в рамках одного и того же `account`.
|
||||
6. Вычислительный ресурс (compute) - универсальная абстракция пользовательского сервера в платформе DECORT. Благодаря использованию такой абстракции можно, например, создать одну виртуальную машину на базе KVM Intel x86, а другую - на базе KVM IBM Power, а потом управлять ими - изменять количество CPU/RAM, подключать/отключать диски и т.п. - одинаковым образом, не задумываясь об их архитектурных различиях.
|
||||
7. Ресурс хранения (disk) - универсальная абстракция дискового ресурса в платформе DECORT. Платформа поддерживает различные типы систем хранения данных, но при этом управление созданными на разных системах хранения дисками осуществляется посредством унифицированного набора действий, например, "подключить диск к compute", "увеличить размер диска", "сделать мгновенный снимок диска", "настроить параметры быстродействия диска".
|
||||
8. Виртуальный сервер – экземпляр compute, в основе технической реализации которого лежит виртуальная машина, работающая в облаке DECORT и доступна по сети. Виртуальный сервер характеризуется количеством выделенных ему CPU (аргумент `cpu`), объемом ОЗУ (`ram`), размером загрузочного диска (`boot_disk size`). При создании виртуального сервера на загрузочный диск устанавливается образ операционной системы, заданный в аргументе `image_id`. Помимо загрузочного диска к виртуальному серверу можно подключить несколько дисков для хранения прикладных данных, список которых задается аргументами `extra_disks`. Виртуальный сервер идентифицируется по комбинации аргументов `name` (имя сервера) и `rgid` (идентификатор ресурсной группы). Обратите внимание, что имя виртуального сервера `name` уникально только в рамках одной и той же ресурсной группы.
|
||||
9. Виртуальный сетевой сегмент (Virtual Network Segment или ViNS) - сетевой сегмент и обеспечивающая его функционирование виртуальная инфраструктура, которые пользователь может создавать для своих нужд на уровне ресурсной группы или подписчика (account). ViNS можно создать полностью изолированным от внешних сетей (см. ниже External Network) или с подключением во внешнюю сеть. Внутри ViNS работает DHCP-сервис, обеспечивающий управление IP адресами экземпляров compute, подключённых в этот ViNS.
|
||||
10. Внешняя сеть (External Network) - сетевой сегмент, через который платформа DECORT взаимодействует с внешними по отношению к ней сетевыми ресурсами. Например, в случае с публичным облаком на базе DECORT в качестве внешней сети выступает сеть Интернет. В отличие от ViNS платформа не управляет внешней сетью, а лишь пользуется её ресурсами. В платформе может быть настроено несколько внешних сетей с различными диапазонами IP адресов, и существует механизм управления доступом пользователей к внешним сетям.
|
||||
11. Сетевой доступ к экземпляру compute (виртуальному серверу) реализуется через его подключение к ViNS и/или прямое подключение во внешнюю сеть (External Network). Один и тот же экземпляр compute может одновременно иметь несколько подключений в разные ViNS и/или различные внешние сети.
|
||||
|
||||
## Способы авторизации
|
||||
|
||||
Облачная платформа DECORT поддерживает два базовых типа авторизации:
|
||||
|
||||
1. С использованием авторизационного провайдера, работающего по протоколу Oauth2. Данный способ является предпочтительным, так как обеспечивает бОльшую гибкость и безопасность. Для авторизации в этом режиме в Вашем плейбуке необходимо указать параметры `oauth2_url` и `controller_url`, а также предоставить одно из нижеперечисленного:
|
||||
- Комбинация Application ID & Application secret, соответствующих пользователю, от имени которого будет осуществляться управление облачными ресурсами в текущей сессии. В процессе проверки предоставленных Application ID & Application secret модуль получает от авторизационного провайдера токен (JSON Web Token, JWT), который затем используется для доступа к указанному контроллеру DECORT. Для авторизации по данному варианту, в Вашем плейбуке следует установить аргумент `authenticator=oauth2` и задать аргументы `app_id` и `app_secret` (или определить соответствующие переменные окружения `DECORT_APP_ID` и `DECORT_APP_SECRET`).
|
||||
- JSON Web Token – заранее полученный от авторизационного провайдера токен доступа, ассоциированный с определенным пользователем, от имени которого будет осуществляться управление облачными ресурсами в текущей сессии. Для авторизации по данному варианту, при инициализации Terraform провайдера DECORT следует установить аргумент `authenticator=jwt` и задать аргумент `jwt` (или определить переменную окружения `DECORT_JWT`).
|
||||
2. С использованием комбинации имя пользователя : пароль. Данный режим не использует внешних авторизационных провайдеров и подразумевает, что пользователь с такой комбинацией зарегистрирован непосредственно на указанном в параметре `controller_url` контроллере облачной платформы DECORT.
|
||||
- Чтобы провайдер авторизовался по данному варианту, при его инициализации следует установить аргумент `authenticator=legacy` и задать аргументы `user` и `password` (или определить соответствующие переменные окружения `DECORT_USER` и `DECORT_PASSWORD`).
|
||||
|
||||
После успешной авторизации пользователь (или приложение-клиент) получает доступ к ресурсам, находящимся под управлением соответствующего DECORT контроллера. Доступ предоставляется в рамках подписчиков (`account`), с которыми ассоциирован данный пользователь (`user`), и в соответствии с присвоенными ему ролями.
|
||||
90
wiki/5.2.6/введение.md
Normal file
90
wiki/5.2.6/введение.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# Модули Ansible для управления облачными ресурсами в платформе DECORT
|
||||
## Введение
|
||||
|
||||
Настоящая документация содержит руководство пользователя по библиотеке модулей decort для Ansible. С помощью этих модулей Вы сможете управлять созданием и конфигурированием облачных ресурсов в платформе DECORT (Digital Energy Cloud Orchestration Technology).
|
||||
|
||||
У каждого модуля есть свой раздел, в котором Вы можете найти подробную информацию о параметрах, которые использует и возращает данный модуль, а также примеры использования данного модуля.
|
||||
|
||||
В состав библиотеки модулей DECORT для Ansible на текущий момент входят:
|
||||
|
||||
- decort_kvmvm - модуль для управления жизненным циклом виртуальных серверов (экземпляров compute). Платформа DECORT поддерживает виртуальные серверы на базе технологии KVM и аппаратных архитектур Intel x86 и IBM PowerPC.
|
||||
Позволяет:
|
||||
1. Создавать новые виртуальные сервера указанной аппаратной архитектуры. Платформа поддерживает виртуальные сервера архитектуры Intel x86 и IBM PowerPC.
|
||||
2. Изменять конфигурацию существующего виртуального сервера:
|
||||
- Изменять количества выделенных CPU и виртуальной ОЗУ. Следует иметь ввиду, что изменение этих параметров в меньшую сторону может потребовать перезагрузки гостевой ОС.
|
||||
- Увеличивать размера загрузочного диска
|
||||
- Подключать / отключать дополнительные дисковые ресурсы.
|
||||
- Создавать / удалять сетевые подключения.
|
||||
3. Изменять состояние существующего виртуального сервера:
|
||||
- Выключать / включать.
|
||||
- Перезагружать, приостанаваливать / возобновлять работу гостевой ОС.
|
||||
4. Удалять существующий виртуальный сервер.
|
||||
5. Получать информацию о существующем виртуальном сервере без изменения его конфигурации.
|
||||
- decort_disk - модуль для управления жизненным циклом дисковых ресурсов, которые можно подключать к экземплярам compute.
|
||||
Позволяет:
|
||||
1) создавать / удалять диск;
|
||||
2) изменять размер диска.
|
||||
- decort_rg - модуль для управления жизненным циклом ресурсных групп (Resource Groups, RG).
|
||||
Позволяет:
|
||||
1) Создавать\удалять ресурсные группы.
|
||||
2) Запрашивать информацию об уже существующих ресурсных группах.
|
||||
3) Редактировать ресурсные группы.
|
||||
4) Настраивать квоты в ресурсных группах.
|
||||
5) Восстанавливать ресурсные группы.
|
||||
- decort_vins - модуль для управления жизненным циклом виртуальных сетевых сегментов (Virtual Network Segment, ViNS). Экземпляры compute (напр., виртуальные серверы) могут быть подключены к нескольким виртуальным сетевым сегментам.
|
||||
Позволяет:
|
||||
1) Создавать, удалять виртуальные сетевые сегменты.
|
||||
2) Изменять виртуальные сетевые сегменты.
|
||||
3) Запрашивать информацию о виртуальных сетевых сегментах.
|
||||
4) Восстанавливать удалённые виртуальные сетевые сегменты.
|
||||
|
||||
- decort_pfw - модуль для настройки правил трансляции сетевых портов виртуальных серверов.
|
||||
- decort_osimage - модуль для взаимодействия с образами.
|
||||
Позволяет:
|
||||
1) Создавать новый образ операционной системы для виртуальных машин.
|
||||
2) Создавать виртуальный образ для образа операционной системы.
|
||||
3) Изменять имя образа (в случае изменения имени виртуального образа, имя и id виртуального образа указываются как image_name и image_id).
|
||||
4) Привязывать другой образ операционной системы к виртуальному образу.
|
||||
5) Удалять существующий образ, привязанный к аккаунту.
|
||||
6) Получать информацию об образе.
|
||||
- decort_jwt - модуль для получения авторизационного токена (JWT - JSON Web Token), который можно использовать при массовом создании экземпляров compute для ускорения работы playbook-а. Подробности см. в соответствующем разделе.
|
||||
- decort_bservice - модуль для взаимодействия с Basic сервисами (Basic service).
|
||||
Позволяет:
|
||||
1) Создавать Basic Service.
|
||||
2) Удалять Basic Service.
|
||||
3) Включать/выключать Basic Service.
|
||||
4) Запрашивать информацию о Basic Service.
|
||||
- decort_group - модуль для взаимодействия с группами виртуальных серверов(compute).
|
||||
Позволяет:
|
||||
1) Получить информацию о группе виртуальных серверов.
|
||||
2) Запустить/остановить группу виртуальных серверов.
|
||||
3) Изменить параметры группы виртуальных серверов (cpu, ram, disk, и т.д).
|
||||
4) Изменить количество виртуальных серверов в группе.
|
||||
5) Изменить параметры сети (ext_net, VINS).
|
||||
6) Создать группу виртуальных серверов и подключить её к Basic сервису.
|
||||
7) Удалить группу виртуальных серверов.
|
||||
- decort_k8s - модуль для взаимодействия с кластерами Kubernetes.
|
||||
Позволяет:
|
||||
1) Создавать/удалять кластера Kubernetes.
|
||||
2) Enable/Disable кластера Kubernetes.
|
||||
3) Запускать/Останавливать кластера Kubernetes
|
||||
4) Модифицировать кластера Kubernetes
|
||||
5) Получать информацию об уже существующем кластере Kubernetes.
|
||||
|
||||
## Системные требования
|
||||
Убедитесь, что Ваша система соответствует требованиям для работы модуля DECORT.
|
||||
Системные требования для работы модуля:
|
||||
- Ansible 2.7 or higher
|
||||
- Python 3.7 or higher
|
||||
- PyJWT 2.0.0 Python module or higher
|
||||
- requests Python module
|
||||
- netaddr Python module
|
||||
- DECORT cloud platform version 3.5.0 or higher
|
||||
|
||||
## Подготовка к работе
|
||||
|
||||
Для начала работы необходимо разместить директории library и module_utils в Вашей рабочей директории, откуда будут запускаться плейбуки, либо указать в ansible.cfg путь до них.
|
||||
|
||||
|
||||
|
||||
|
||||
103
wiki/5.2.6/модуль-decort_bservice.md
Normal file
103
wiki/5.2.6/модуль-decort_bservice.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# 03.08 Модуль 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_disk предназначен для управления basic сервисами, в которых находятся группы виртуальных серверов.
|
||||
Данный модуль позволяет:
|
||||
- Создавать Basic Service.
|
||||
- Удалять Basic Service.
|
||||
- Включать/выключать Basic Service.
|
||||
- Запрашивать информацию о Basic Service.
|
||||
|
||||
|
||||
## Параметры модуля decort_bservice
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_bservice. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на Вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_bservice`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор учётной записи (account), которой принадлежит данный диск. При идентификации диска по имени (см. параметр `name`) должно быть задан либо идентификатор, либо имя учётной записи (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|account_name | (string) | Имя учётной записи (account), которой принадлежит данный диск. При идентификации диска по имени (см. параметр name) должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
|
||||
| annotation | (string) | Текстовое описание диска. Данный аргумент является опциональным и учитывается только при создании диска, а при всех прочих операциях игнорируется.|
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.|
|
||||
|app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
|
||||
| authenticator | Значения:<br/>`legacy`<br/>`oauth2`<br/>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы 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| Состояние Basic сервиса.|
|
||||
| started | (bool) | Параметр, определяющий состояние добавленных виртуальных серверов в Basic Service. Запускать их, или нет. По умолчанию: False. |
|
||||
| name | (string) | Имя, с которым будет создан Basic сервис. Также используется для поиска ID Basic сервиса. |
|
||||
| sshuser | (string) | Имя пользователя, который будет создан на всех виртуальных серверах в группе basic сервиса. Используется в паре с sshkey. |
|
||||
| sshkey | (string) | SSH ключ, который будет загружен на все виртуальные сервера в группе basic сервиса. Используется в паре с sshuser. |
|
||||
| id | (int) | Уникальный целочисленный идентификатор Basic сервиса, используется для поиска, взаимодействия и удаления Basic сервиса. |
|
||||
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы, в которой будет работать модуль. |
|
||||
| rg_name | (string) | Имя ресурсной группы, в которой будет работать модуль. |
|
||||
| description | (string) | Описание. По умолчанию: `Created by decort ansible module`|
|
||||
| verify_ssl | (bool)<br/>`True` <- default<br/>`False` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
| workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения.<br/>Данный параметр является опциональным.<br/>Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
| workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL.<br>Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов `workflow_callback` данные со своим внутренним состоянием и отслеживать инициированные им задачи.<br/>Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`.<br/>Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
|
||||
## Возвращаемые значения модуля decort_bservice
|
||||
|
||||
Модуль decort_bservice возвращает информацию о диске в виде словаря facts со следующими ключами:
|
||||
|
||||
|
||||
|Ключ | Тип данных | Описание|
|
||||
| ------ | ------ | ------ |
|
||||
|id | int | Уникальный целочисленный идентификатор данного Basic сервиса.|
|
||||
|name | string | Имя Basic сервиса.|
|
||||
| techStatus | string | Технический статус Basic сервиса. |
|
||||
|state | string | Текущий статус Basic сервиса. Корректные состояния:MODELED, DISABLING, ENABLING, DELETING, DELETED, "DESTROYING, DESTROYED, RESTORYNG, RECONFIGURING|
|
||||
| rg_id | int | Уникальный целочисленный идентификатор ресурсной группы, в котором находится Basic сервис.|
|
||||
| account_id | int | Уникальный целочисленный идентификатор пользователя, к которому привязан данный Basic сервис.|
|
||||
| groupsName | string | Имена групп виртуальных серверов, которые находятся в данном Basic сервисе.|
|
||||
| groupsIds | string | Уникальные целочисленные идентификаторы групп виртуальных серверов, которые находятся в данном Basic сервисе. |
|
||||
|
||||
|
||||
## Пример использования модуля decort_bservice
|
||||
|
||||
Данный пример создаёт Basic сервис с названием databases.
|
||||
|
||||
```
|
||||
- name: Manage bservice at RG
|
||||
decort_bservice:
|
||||
account_id: 98
|
||||
verify_ssl: false
|
||||
authenticator: jwt
|
||||
jwt: "{{ my_jwt.jwt }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
rg_id: 1629
|
||||
state: present
|
||||
name: databases
|
||||
started: True
|
||||
register: db_bservice
|
||||
```
|
||||
|
||||
Данный пример удаляет Basic сервис с названием databases.
|
||||
```
|
||||
- name: Manage bservice at RG
|
||||
decort_bservice:
|
||||
account_id: 98
|
||||
verify_ssl: false
|
||||
authenticator: jwt
|
||||
jwt: "{{ my_jwt.jwt }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
rg_id: 1629
|
||||
state: absent
|
||||
name: databases
|
||||
started: False
|
||||
register: db_bservice
|
||||
```
|
||||
167
wiki/5.2.6/модуль-decort_disk.md
Normal file
167
wiki/5.2.6/модуль-decort_disk.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# 03.03 Модуль decort_disk
|
||||
## Обзор модуля decort_disk
|
||||
|
||||
Модуль decort_disk предназначен для управления дисковыми ресурсами в платформе DECORT:
|
||||
|
||||
- создание / удаление диска;
|
||||
- изменение размера диска.
|
||||
- переименование диска.
|
||||
- ограничение ввода / вывода диска.
|
||||
- восстановление удаленного диска из корзины.
|
||||
|
||||
Обратите внимание:
|
||||
|
||||
- загрузочный диск для виртуального сервера создаётся и подключается автоматически в процессе создания этого сервера. - Модуль decort_disk служит для управления дополнительными дисками (т.н. data-дисками);
|
||||
- подключение дополнительных дисков, созданных посредством decort_disk, к виртуальным серверам выполняется с помощью модулей управления compute-ресурсами (например, подробнее см. модуль decort_kvmvm, параметр data_disks).
|
||||
|
||||
## Параметры модуля decort_disk
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_disk. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_disk`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор учётной записи (account), которой принадлежит данный диск. При идентификации диска по имени (см. параметр `name`) должно быть задан либо идентификатор, либо имя учётной записи (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|account_name | (string) | Имя учётной записи (account), которой принадлежит данный диск. При идентификации диска по имени (см. параметр name) должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
|
||||
| annotation | (string) | Текстовое описание диска. Данный аргумент является опциональным и учитывается только при создании диска, а при всех прочих операциях игнорируется.|
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.|
|
||||
|app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
|
||||
| authenticator | Значения:<br/>`legacy`<br/>`oauth2`<br/>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. |
|
||||
|controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный виртуальный сервер. Данный параметр является обязательным.|
|
||||
| description | (string) | Описание диска. Используется при создании диска, по умолчанию установлено: "Disk created with Ansible Decort_disk module." |
|
||||
|id | (int) | Уникальный целочисленный идентификатор диска. Соответствующий диск должен существовать (таким образом, с помощью id нельзя создать новый диск, а только управлять уже имеющимися). Если задан данный параметр, то параметры `name`, `account_name` и `account_id` игнорируются.|
|
||||
| iops | (int) | Ограничение ввода/вывода диска. Используется при создании диска. |
|
||||
| force_detach | (bool)<br/>`True`<br/>`False` <- default | Задаёт поведение платформы при попытке удалить диск, подключённый к экземпляру _compute_.<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) | Параметр, использующийся при удалении диска, при значении True - диск удалится навсегда, а при False - попадёт в корзину. |
|
||||
|place_with | (int) | Идентификатор образа ОС, из которого следует взять параметр `sep_id`, чтобы разместить данный диск на той же системе хранения данных, что и указанный образ ОС. Данный параметр является опциональным и используется только на стадии создания диска. Если задан `place_with`, то `sep_id` игнорируется.|
|
||||
|pool | (string) | Название пула на системе хранения данных, в рамках которой следует создать данный диск. Этот параметр используется только на стадии создания диска и игнорируется при операциях над уже существующими дисками. Параметр является опциональным, значение по умолчанию - пустая строка (в этом случае платформа использует пул, который сконфигурирован на целевой системе хранения как пул по умолчанию). |
|
||||
| reason | (string) | Причина, по которой было выполнено какое-либо действие, в данном модуле используется только при удалении диска. |
|
||||
|sep_id | (int) | Идентификатор провайдера системы хранения данных (Storage End-point Provider). Данный параметр определяет систему хранения данных, на ресурсах которой создаётся диск. Используется только при создании диска и игнорируется при прочих операциях. Альтернативой данному параметру является `place_with`, позволяющий разместить диск на той же системе хранения, что и указанный загрузочный образ, на базе которого создаётся экземпляр compute.|
|
||||
|size | (int) | Размер диска в ГБ. Этот параметр является обязательным при создании диска. Если он задан для уже существующих дисков, а текущий размер диска меньше заданного, то будет предпринята попытка увеличить размер диска. При прочих операциях данный параметр игнорируется.|
|
||||
| state | Значения:<br/>`present` <- default<br/>`absent`<br/> | Целевое состояние диска. |
|
||||
| type | (string) | Тип создаваемого диска. Возможные значения: B-Boot, D-Data, T-Temp. По умолчанию установлено значение D.|
|
||||
| verify_ssl | (bool)<br/>`True` <- default<br/>`False` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
| workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения.<br/>Данный параметр является опциональным.<br/>Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
| workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL.<br>Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов `workflow_callback` данные со своим внутренним состоянием и отслеживать инициированные им задачи.<br/>Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`.<br/>Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
|
||||
## Возвращаемые значения модуля decort_disk
|
||||
|
||||
Модуль decort_disk возвращает информацию о диске в виде словаря facts со следующими ключами:
|
||||
|
||||
|
||||
|Ключ | Тип данных | Описание|
|
||||
| ------ | ------ | ------ |
|
||||
|account_id | int | Уникальный целочисленный идентификатор учётной записи (account), которой принадлежит диск.|
|
||||
|attached_to | int | Идентификатор экземпляра Compute (напр., виртуального сервера), к которому в настоящий момент подключён диск. Если диск не подключён, то attached_to=0|
|
||||
|gid | int | Идентификатор физического кластера (Grid ID), на ресурсах которого создан диск.|
|
||||
|id | int | Уникальный целочисленный идентификатор данного диска.|
|
||||
| iotune | dict | Текущие ограничение ввода / вывода диска. |
|
||||
|name | string | Имя диска. Обратите внимание, что имя диска не является уникальным с точки зрения системы хранения данных, на которой этот диск расположен.|
|
||||
|pool | string | Имя пула на системе хранения данных, в котором размещаются ресурсы диска.|
|
||||
|sep_id | int | Идентификатор системы хранения (Storage Endpoint Provider), на которой размещаются ресурсы данного диска.|
|
||||
|size | int | Размер диска в ГБ.|
|
||||
|state | string | Текущий статус диска. Корректные состояния: CREATED, ASSIGNED, DELETED, DESTROYED, PURGED.|
|
||||
|
||||
|
||||
## Пример использования модуля decort_disk
|
||||
|
||||
В данном примере создаётся диск размером 50ГБ (size: 50), с ограничением ввода / вывода в 2000 iops, на ресурсах системы хранения, доступной через Storage Endpoint provider под номером 1 (sep_id: 1) в пуле "data01".
|
||||
|
||||
```
|
||||
- name: manage data 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
|
||||
state: present
|
||||
register: my_data_disk01
|
||||
delegate_to: localhost
|
||||
```
|
||||
В данном примере ограничивается уже существующий диск с именем "DataDisk01", ограничивается как чтение/запись в iops, так и в байтах, также задаётся их максимальное чтение / запись(read/write_*_sec_max).
|
||||
|
||||
```
|
||||
- name: manage data 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: 100
|
||||
read_bytes_sec_max: 100
|
||||
read_iops_sec: 100
|
||||
read_iops_sec_max: 100
|
||||
size_iops_sec: 100
|
||||
write_bytes_sec: 100
|
||||
write_bytes_sec_max: 100
|
||||
write_iops_sec: 100
|
||||
write_iops_sec_max: 100
|
||||
total_bytes_sec: 0
|
||||
total_iops_sec: 0
|
||||
total_bytes_sec_max: 0
|
||||
total_iops_sec_max: 0
|
||||
state: present
|
||||
register: my_data_disk01
|
||||
delegate_to: localhost
|
||||
```
|
||||
|
||||
В данном примере выполняется восстановление удаленного диска с id 111 из корзины.
|
||||
|
||||
```
|
||||
- name: manage data 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
|
||||
state: present
|
||||
register: my_data_disk01
|
||||
delegate_to: localhost
|
||||
```
|
||||
|
||||
В данном примере выполняется переименование диска с id 111 на новое имя "NewExampleDisk".
|
||||
|
||||
```
|
||||
- name: manage data 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"
|
||||
state: present
|
||||
register: my_data_disk01
|
||||
delegate_to: localhost
|
||||
```
|
||||
|
||||
Здесь результат работы модуля decort_disk записывается в переменную my_data_disk01. Для получения идентификатора диска, например, при подключении его к виртуальному серверу, следует воспользоваться показанной ниже конструкцией:
|
||||
|
||||
```
|
||||
- name: manage virtual server
|
||||
decort_kvmvm:
|
||||
<< для краткости фрагмент опущен >>
|
||||
data_disks:
|
||||
- "{{ my_data_disk01.facts.id }}"
|
||||
<< для краткости фрагмент опущен >>
|
||||
```
|
||||
103
wiki/5.2.6/модуль-decort_group.md
Normal file
103
wiki/5.2.6/модуль-decort_group.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# 03.09 Модуль decort_group
|
||||
## Обзор модуля decort_group
|
||||
Модуль decort_group позволяет взаимодействовать с группами виртуальных серверов, которые находятся в Basic сервисе. `Взаимодействие с Basic сервисами происходит в модуле decort_bservice.`
|
||||
|
||||
Модуль decort_group позволяет:
|
||||
- Получить информацию о группе виртуальных серверов.
|
||||
- Запустить/остановить группу виртуальных серверов.
|
||||
- Изменить параметры группы виртуальных серверов (cpu, ram, disk, role, name).
|
||||
- Изменить количество виртуальных серверов в группе.
|
||||
- Изменить параметры сети (ext_net, VINS).
|
||||
- Создать группу виртуальных серверов и подключить её к Basic сервису.
|
||||
- Удалить группу виртуальных серверов.
|
||||
|
||||
## Параметры модуля decort_group
|
||||
Ниже приведен полный список параметров для модуля decort_group.
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор учётной записи (account), которой принадлежит данный диск. При идентификации диска по имени (см. параметр `name`) должно быть задан либо идентификатор, либо имя учётной записи (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|account_name | (string) | Имя учётной записи (account), которой принадлежит данный диск. При идентификации диска по имени (см. параметр 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/>`legacy`<br/>`oauth2`<br/>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. |
|
||||
|controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный виртуальный сервер. Данный параметр является обязательным.|
|
||||
|jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt` Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.|
|
||||
|oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`.|
|
||||
|id | (int) | Уникальный целочисленный идентификатор группы виртуальных серверов.|
|
||||
| image_id | (int) | Уникальный целочисленный идентификатор образа операционной системы. Используется для создания виртуальных серверов в группе. |
|
||||
| image_name | (string) | Имя образа операционной системы. Используется для создания виртуальных серверов в группе.|
|
||||
| driver | (string) | Тип виртуального сервера. Прим. `KVM_X86` |
|
||||
| boot_disk | (int) | Обьём виртуального диска на виртуальных серверах. |
|
||||
| bservice_id | (int) | Уникальный целочисленный идентификатор Basic серфиса, в который необходимо добавить группу виртуальных серверов. |
|
||||
| count | (int) | Количество виртуальных серверов в группе. |
|
||||
| timeoutStart | (int) | Задержка в секундах до отображения группы виртуальных серверов. |
|
||||
| role | (string) | Роль группы виртуальных серверов. |
|
||||
| cpu | (int) | Количество ядер процессора на каждом виртуальном сервере в группе. |
|
||||
| ram | (int) | Объём оперативной памяти на каждом виртуальном сервере в группе. |
|
||||
| networks | (list) | Список сетей, которые необходимо подключить к каждому виртуальному серверу в группе |
|
||||
| description | (string) | Описание группы виртуальных серверов. |
|
||||
|verify_ssl | (bool) | True <- default False Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах.|
|
||||
| workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения. Данный параметр является опциональным. Функциональность callbacks в текущей версии модуля не реализована. |
|
||||
|workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL. Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов `workflow_callback` данные со своим внутренним состоянием и отслеживать инициированные им задачи. Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`.|
|
||||
|
||||
## Возвращаемые значения модуля decort_group
|
||||
|
||||
Модуль decort_group возвращает информацию о диске в виде словаря facts со следующими ключами:
|
||||
|
||||
|
||||
|Ключ | Тип данных | Описание|
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | int | Уникальный целочисленный идентификатор аккаунта, к которому привязана данная группа виртуальных серверов. |
|
||||
| rg_id | int | Уникальный целочисленный идентификатор ресурсной группы, в которой находится данная группа виртуальных серверов. |
|
||||
| id | int | Уникальный целочисленный идентификатор данной группы виртуальных серверов.|
|
||||
| name | string | Имя данной группы виртуальных серверов.|
|
||||
| techStatus | string | Технический статус данной группы виртуальных серверов. |
|
||||
| state | string | Текущее состояние группы виртуальных серверов. Корректные состояния: absent, started, stopped, present, check.|
|
||||
| Computes | string | Уникальные целочисленные идентификаторы виртуальных серверов, входящих в группу. |
|
||||
|
||||
## Пример использования модуля decort_group
|
||||
|
||||
Данный пример создаёт группу виртуальных серверов с названием test_group.
|
||||
```
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_group:
|
||||
authenticator: oauth2
|
||||
verify_ssl: False
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
state: present
|
||||
bservice_id: 1823
|
||||
count: 2
|
||||
name: "test_group"
|
||||
cpu: 2
|
||||
ram: 2
|
||||
boot_disk: 10
|
||||
image_id: 518
|
||||
driver: "KVM_X86"
|
||||
timeoutStart: 5
|
||||
networks:
|
||||
- type: VINS
|
||||
id: 1987
|
||||
delegate_to: localhost
|
||||
register: group_test
|
||||
```
|
||||
|
||||
Данный пример удаляет группу виртуальных серверов с названием test_group.
|
||||
|
||||
```
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: create
|
||||
decort_group:
|
||||
authenticator: oauth2
|
||||
verify_ssl: False
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
state: absent
|
||||
bservice_id: 1823
|
||||
name: "test_group"
|
||||
delegate_to: localhost
|
||||
register: group_test
|
||||
```
|
||||
56
wiki/5.2.6/модуль-decort_jwt.md
Normal file
56
wiki/5.2.6/модуль-decort_jwt.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# 03.07 Вспомогательный модуль для получения авторизационного 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) | Срок действия JWT в секундах. Данный параметр является опциональным, значение по умолчанию - 3600 сек.|
|
||||
| verify_ssl | (bool)<br/>`True` <- default<br/>`False` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес авторизационного сервера, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
|workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения. Данный параметр является опциональным. Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
|workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL. Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов workflow_callback данные со своим внутренним состоянием и отслеживать инициированные им задачи. Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`. Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
## Возвращаемые значения модуля decort_jwt
|
||||
|
||||
При успешном выполнении модуль decort_jwt возвращает словарь, в котором по ключу jwt находится значение JWT-токена (тип string).
|
||||
|
||||
## Пример использования модуля decort_jwt
|
||||
|
||||
В данном примере сначала получается JWT со сроком действия 1200 сек., а затем этот JWT используется для создания виртуального сервера в режиме авторизации jwt (подробнее о данном режиме см. в разделе «Примеры различных режимов авторизации»).
|
||||
```
|
||||
- hosts: ansible_master
|
||||
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
|
||||
delegate_to: localhost
|
||||
register: my_token
|
||||
```
|
||||
```
|
||||
- name: manage KVM VM in JWT authorization mode
|
||||
decort_kvmvm:
|
||||
authenticator: jwt
|
||||
jwt: "{{ my_token.jwt }}"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: NewVM01
|
||||
state: present
|
||||
cpu: 2
|
||||
ram: 4096
|
||||
<<<дальнейшие детали опущены>>>
|
||||
```
|
||||
Обратите внимание, как используется JWT при создании нового виртуального сервера (в предположении, что результат выполнения task для модуля decort_jwt был сохранен в переменной my_token):
|
||||
```
|
||||
jwt: "{{ my_token.jwt }}"
|
||||
```
|
||||
102
wiki/5.2.6/модуль-decort_k8s.md
Normal file
102
wiki/5.2.6/модуль-decort_k8s.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# 03.10 Модуль decort_k8s
|
||||
## Обзор модуля decort_k8s
|
||||
|
||||
Модуль decort_k8s предназначен для выполнения следующих действий над кластерами Kubernetes, созданными в облачной платформе DECORT:
|
||||
- Создание/удаление кластера Kubernetes.
|
||||
- Enable/Disable кластера Kubernetes.
|
||||
- Запуск/Остановка кластера Kubernetes
|
||||
- Модификация кластера Kubernetes
|
||||
- Получение идентификатора образа Kubernetes по имени образа.
|
||||
|
||||
|
||||
## Параметры модуля decort_k8s
|
||||
Ниже приведен полный список параметров для модуля decort_k8s:
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения DECORT_APP_ID. |
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения DECORT_APP_SECRET. |
|
||||
| authenticator | Значения:<br/>`legacy`<br/>`oauth2`<br/>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. |
|
||||
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный виртуальный сервер. Данный параметр является обязательным. |
|
||||
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме authenticator: jwt Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.|
|
||||
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
|
||||
| verify_ssl | (bool) | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
| workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения. Данный параметр является опциональным. Функциональность callbacks в текущей версии модуля не реализована. |
|
||||
| workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL. Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов `workflow_callback` данные со своим внутренним состоянием и отслеживать инициированные им задачи. Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`. Функциональность callbacks в текущей версии модуля не реализована. |
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, к которому привязан кластер. |
|
||||
| account_name | (string) | Имя аккаунта, к которому привязан кластер. |
|
||||
| annotation | (string) | Аннотации для рабочих групп в кластере Kubernetes. |
|
||||
| quotas | (dict) | Библиотека, содержащая квоты. |
|
||||
| state | (string) | Состояние кластера. Поддерживаемые состояния: absent, disabled, enabled, present,check. |
|
||||
| permanent | (bool) | Параметр, отвечающий за полное удаление кластера. При значениие `True` кластер будет полностью удалён, при значении `False` кластер будет перемещён в корзину. |
|
||||
| started | (bool) | Параметр, отвечающий за запуск кластера после создания. При значении `True`, после создания кластер будет автоматически запущен. |
|
||||
| name | (string) | Имя кластера Kubernetes. |
|
||||
| id | (int) | Уникальный целочисленный идентификатор кластера Kubernetes, позволяющий удалять, изменять и получать сведения о кластере Kubernetes. |
|
||||
| getConfig | (bool) | Параметр, передающий конфигурационный файл кластера Kubernetes, при значении `True`. |
|
||||
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы, в которой находится кластер Kubernetes. |
|
||||
| rg_name | (int) | Имя ресурсной группы, в которой находится кластер Kubernetes. |
|
||||
| k8ci_id | (int) | Уникальный целочисленный идентификатор образа кластера Kubernetes. |
|
||||
| wg_name | (string) | Имя рабочей группы. В кластере может быть несколько рабочих групп. |
|
||||
| master_count | (int) | Количество master узлов в рабочей группе. По умолчанию: `1`|
|
||||
| master_cpu | (int) | Количество ядер процессора на каждом master узле. По умолчанию: `2` |
|
||||
| master_ram_mb | (int) | Объём оперативной памяти на каждом master узле. По умолчанию: `2048` |
|
||||
| master_disk_gb | (int) | Объём жесткого диска на каждом master узле. По умолчанию: `10` |
|
||||
| worker_count | (int) | Количество worker узлов в рабочей группе. По умолчанию: `1`|
|
||||
| worker_cpu | (int) | Количество ядер процессора на каждом worker узле. По умолчанию: `1` |
|
||||
| worker_ram_mb | (int) | Объём оперативной памяти на каждом worker узле. По умолчанию: `1024` |
|
||||
| worker_disk_gb | (int) | Объём жесткого диска на каждом worker узле. По умолчанию: `10` |
|
||||
| workers | (dict) | Библиотека, в которой необходимо указывать рабочие группы и их параметры. См. пример 13.4 |
|
||||
| extnet_id | (int) | Уникальный целочисленный идентификатор внешней сети, к которой будет подключен кластер при создании. По умолчанию: `0` |
|
||||
| description | (string) | Описание кластера. По умолчанию: `Created by decort ansible module` |
|
||||
| with_lb | (bool) | Отвечает за создание Load Balancer при создании кластера. По умолчанию: `True` |
|
||||
|
||||
|
||||
|
||||
## Возвращаемые значения модуля decort_k8s
|
||||
|
||||
Модуль decort_k8s возвращает информацию о кластере в виде словаря facts со следующими ключами:
|
||||
|
||||
|
||||
| Ключ | Тип данных | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| id | int | Уникальный целочисленный идентификатор данного кластера. |
|
||||
| name | string | Имя данного кластера. |
|
||||
| techStatus | string | Технический статус кластера. Возможные технические статусы кластера: STARTED, DELETED, STOPPED, CREATED, , DISABLED, ENABLED, RESTORED, MODELED.|
|
||||
| state | string | Текущий статус кластера. Поддерживаемые состояния: absent, disabled, enabled, present,check. |
|
||||
| rg_id | int | Уникальный целочисленный идентификатор ресурсной группы, в которой находится данный кластер. |
|
||||
| account_id | int | Уникальный целочисленный идентификатор аккаунта, к которому привязан данный кластер. |
|
||||
|
||||
|
||||
## Пример использования модуля decort_k8s
|
||||
|
||||
|
||||
Пример создания кластера Kubernetes с названием cluster-test.
|
||||
```
|
||||
- name: create a cluster named cluster-test
|
||||
decort_k8s:
|
||||
state: present
|
||||
started: True
|
||||
getConfig: True
|
||||
authenticator: jwt
|
||||
jwt: "{{ token.jwt }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
name: "cluster-test"
|
||||
rg_id: 125
|
||||
k8ci_id: 18
|
||||
workers:
|
||||
- name: wg1
|
||||
ram: 1024
|
||||
cpu: 10
|
||||
disk: 10
|
||||
num: 1
|
||||
- name: wg2
|
||||
ram: 1024
|
||||
cpu: 10
|
||||
disk: 10
|
||||
num: 2
|
||||
verify_ssl: false
|
||||
delegate_to: localhost
|
||||
register: kube
|
||||
|
||||
```
|
||||
112
wiki/5.2.6/модуль-decort_kvmvm.md
Normal file
112
wiki/5.2.6/модуль-decort_kvmvm.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# 03.01 Модуль decort_kvmvm
|
||||
## Обзор модуля decort_kvmvm
|
||||
|
||||
Модуль decort_kvmvm предназначен для предназначен для выполнения следующих действий над виртуальными серверами, созданными на базе технологии виртуализации KVM, в облачной платформе DECORT:
|
||||
|
||||
1. Создание нового виртуального сервера указанной аппаратной архитектуры. Платформа поддерживает виртуальные сервера архитектуры Intel x86 и IBM PowerPC.
|
||||
2. Изменение конфигурации существующего виртуального сервера:
|
||||
- Изменение количества выделенных CPU и виртуальной ОЗУ. Следует иметь ввиду, что изменение этих параметров в меньшую сторону может потребовать перезагрузки гостевой ОС.
|
||||
- Увеличение размера загрузочного диска
|
||||
- Подключение / отключение дополнительных дисковых ресурсов.
|
||||
- Создание / удаление сетевых подлкючений.
|
||||
3. Изменение состояния существующего виртуального сервера:
|
||||
- Выключение / включение.
|
||||
- Перезагрузка, приостановка / возобновление работы гостевой ОС.
|
||||
4. Удаление существующего виртуального сервера.
|
||||
5. Получение информации о существующем виртуальном сервере без изменения его конфигурации.
|
||||
|
||||
## Параметры модуля decort_kvmvm
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_kvmvm. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_kvmvm`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | int | Уникальный цифровой идентификатор подписчика, владеющего данным виртуальным сервером.Этот параметр является опциональным и используется в сценариях, когда уже существующая ресурсная группа задается комбинацией `account_id` и `rg_name`. Если задан `account_id`, то `account_name` игнорируется.|
|
||||
| account_name | (string) | Имя подписчика, которому будет принадлежать новый виртуальный сервер (или уже принадлежит существующий). Параметр должен задаваться в точном соответствии с тем, как назван нужный подписчик в облачной инфраструктуре (с соблюдением заглавных и строчных символов, а также пробелов). Этот параметр является опциональным и используется в сценариях, когда уже существующая ресурсная группа задается комбинацией account_name и rg_name. Если задан `account_id`, то `account_name` игнорируется.|
|
||||
| annotation | (string) | Опциональное описание виртуального сервера. Этот параметр используется только в момент создания нового виртуального сервера и игнорируется при любых действиях над существующими серверами.|
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль `decort_kvmvm` будет использовать значение переменной окружения `DECORT_APP_ID`.|
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DCORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль `decort_kvmvm` будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
|
||||
| arch | Значения:<br/>`KVM_X86` <- default <br/>`KVM_PPC`<br/> | Аппаратная архитектура виртуального сервера. Данный параметр является обязательным при создании нового вирутального сервера и игнорируется для уже существующего сервера.<br/>Платформа DECORT поддерживает виртуальные серверы KVM аппаратных архитектур Intel x86 и IBM PowerPC. |
|
||||
| authenticator | Значения:<br/>`legacy`<br/>`oauth2`<br/>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. |
|
||||
|boot_disk | (int) | Размер загрузочного диска виртуального сервера в ГБ. Загрузочный диск всегда создаётся на той же системе хранения и в том же пуле, где размещён образ ОС (см. параметры `image_name` или `image_id`), на базе которого создаётся данный виртуальный сервер. Если данный параметр не указан на момент создания виртуального сервера, то размер загрузочного диска будет установлен равным размеру образа ОС.|
|
||||
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный виртуальный сервер. Данный параметр является обязательным.|
|
||||
| cpu | (int) | Количество виртуальных CPU, выделенных виртуальному серверу. Параметр является обязательным при создании нового сервера, во всех других случаях он опциональный. Если указать его для уже существующего сервера, то будет выполнена попытка изменить количество CPU. Следует иметь ввиду, что уменьшение количества CPU у работающего сервера, как правило, потребует его перезагрузки.|
|
||||
| data_disks | (list) | Список идентификаторов дисков, которые следует подключить к данному виртуальному серверу как дополнительные (помимо загрузочного диска, который создаётся автоматически вместе с виртуальным сервером).|
|
||||
| id | (int) | Уникальный цифровой идентификатор виртуального сервера внутри платформы. Этот параметр используется как один из методов идентификации существующего сервера (альтернатива – по комбинации name, `rg_name` и `account_name`) и игнорируется при создании нового сервера, так как для нового сервера облачная платформа назначает этот идентификатор автоматически. Если при вызове модуля `decort_kvmvm` существующий виртуальный сервер идентифицируется по своему id, то параметры `account_id`, `account_name`, `rg_id` и `rg_name` игнорируются.|
|
||||
| image_id | (int) | Уникальный цифровой идентификатор образа ОС, на базе которого следует создать виртуальный сервер. При создании нового виртуального сервера требуется задать этот параметр или параметр image_name. При любых других операциях данные параметры игнорируются. Если заданы оба этих параметра (`image_id` и `image_name`), то `image_name` игнорируется. Для получения `image_id` по `image_name` можно использовать модуль `decort_osimage`.|
|
||||
| image_name | (string) | Название образа ОС, на базе которого следует создать виртуальный сервер. При создании нового виртуального сервера требуется задать этот параметр или параметр `image_id`. При любых других операциях данные параметры игнорируются. Параметр `image_name` должен задаваться в точном соответствии с тем, как назван нужный образ ОС в облачной инфраструктуре (с соблюдением заглавных и строчных символов, а также пробелов).|
|
||||
| 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.|
|
||||
| networks | (list of dicts) | Опциональный список словарей, задающих сетевые подключения для данного виртуального сервера. Структура словаря:- (string) type - тип сетевого подключения, одно из VINS или EXTNET; - (int) id - идентификатор сетевого сегмента данного подключения; для type: VINS это VINS ID, для type: EXTNET это ID внешнего сетевого сегмента; - (string) ip_addr - опциональный IP адрес, который надлежит присвоить данному подключению; если данный параметр не указан, то платформа назначит свободный IP адрес из нужного диапазона автоматически. Если этот параметр не задан, то будет создан сервер без сетевых подключений, а если модуль вызван для уже существуюшего сервера, то все его сетевые подключения будут удалены.|
|
||||
|oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль `decort_kvmvm` будет использовать значение переменной окружения `DECORT_OAUTH2_URL`.|
|
||||
| password | (string) | Пароль для подключения к контроллеру облачной инфраструктуры DECORT в режиме `authenticator: legacy`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать в playbook. Если параметр не задан в playbook, то модуль `decort_kvmvm` будет использовать значение переменной окружения `DECORT_PASSWORD`.|
|
||||
| ram | (int) | Объем оперативной памяти (RAM) в MB, выделенной данному виртуальному серверу. Параметр является обязательным при создании нового сервера. Если указать его для уже существующего сервера, то будет выполнена попытка изменить объем выделенной серверу памяти. Следует иметь ввиду, что уменьшение объема памяти работающего сервера в большинстве случаев потребует его перезагрузки.|
|
||||
| rg_id | (int) | Уникальный цифровой идентификатор уже существующей ресурсной группы (RG), в которой будет создан новый или находится уже существующий виртуальный сервер. Данный параметр является одним из методов идентификации существующей RG (альтернативой является задание комбинации `account_name` и `rg_name`).|
|
||||
| rg_name | (string) | Имя уже существующей ресурсной группы (RG), в которой будет создан новый или находится уже существующий виртуальный сервер. Данный параметр является одним из методов идентификации существующей RG, когда задается пара `account_name` и `rg_name` (альтернативой является задание `rg_id`, который можно получить с помощью модуля `decort_rg`). Параметр должен задаваться в точном соответствии с тем, как нужная ресурсная группа названа в облачной инфраструктуре (с соблюдением заглавных и строчных символов, а также пробелов). Если заданы и `rg_id`, и `rg_name`, то параметр `rg_name` игнорируется.|
|
||||
| ssh_key | (string) | Открытая часть SSH ключа, который необходимо авторизовать на создаваемом виртуальном сервере для пользователя, заданного параметром `ssh_key_user`. Данный параметр применим только для Linux серверов, является опциональным, используется только при создании нового сервера и игнорируется при других операциях.|
|
||||
| ssh_key_user | (string) | Имя пользователя на уровне гостевой ОС (только для Linux серверов) для которого авторизуется SSH ключ, заданный параметром `ssh_key`. Данный параметр является обязательным, если задан `ssh_key`, используется только при создании нового сервера и игнорируется при других операциях.|
|
||||
| state | Значения:<br/>`present` <- default<br/>`absent`<br/>`poweredon`<br/>`poweredoff`<br/>`halted`<br/>`paused`<br/>`check` | Целевое состояние виртуального сервера на выходе из модуля _decort_kvmvm_.<br/> Значение 'halted' - синоним к 'poweredoff'.<br/>Значение 'check' вызывает модуль в _read-only_ режиме и считывает характеристики существующего виртуального сервера. |
|
||||
| tags | (string) | Строка, содержащая набор текстовых меток, которые надлежит присвоить данному виртуальному серверу. Данные текстовые метки представляют собой произвольный текст, который можно использовать для группировки и индексирования виртуальных серверов во внешних приложениях. Параметр является опциональным.|
|
||||
| user | (string) | Имя пользователя, непосредственно зарегистрированного на контроллере облачной инфраструктуры DECORT, которое используется для подключения к контроллеру в режиме `authenticator: legacy`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль `decort_kvmvm` будет использовать значение переменной окружения `DECORT_USER`.|
|
||||
| verify_ssl | (bool)<br/>`True` <- default<br/>`False` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
| workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения. Данный параметр является опциональным. Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
| workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL. Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов `workflow_callback` данные со своим внутренним состоянием и отслеживать инициированные им задачи. Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`. Функциональность callbacks в текущей версии модуля `decort_kvmvm` не реализована.|
|
||||
|
||||
|
||||
## Возвращаемые значения модуля decort_kvmvm
|
||||
|
||||
Модуль decort_kvmvm возвращает информацию о виртуальном сервере в виде словаря facts со следующими ключами:
|
||||
|
||||
|
||||
| Ключ | Тип данных | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | int |Цифровой идентификатор подписчика, владеющего данным виртуальным сервером.|
|
||||
| account_name | string | Имя подписчика, владеющего данным виртуальным сервером.|
|
||||
| arch | string | Аппаратная архитектура данного виртуального сервера. Допустимые значения: KVM_X86 для Intel x86 и KVM_PPC для IBM PowerPC.|
|
||||
| cpu | int | Количество виртуальных CPU, выделенных данному виртуальному серверу.|
|
||||
| data_disks | list of ints | Список идентификаторов data-дисков, в настоящий момент подключенных к данному серверу.|
|
||||
| disk_size | int | Размер загрузочного диска в ГБ.|
|
||||
| id | int | Уникальный цифровой идентификатор данного виртуального сервера (экземпляра compute) в платформе DECORT.|
|
||||
| name | string | Имя виртуального сервера. Имя уникально только в рамках одной и той же ресурсной группы.|
|
||||
| password | string | Пароль системного пользователя по умолчанию.|
|
||||
| private_ips | list of strings | Список IP адресов на сетевых интерфейсах сервера, которые подключены к виртуальным сетевым сегментам (Virtual Network Segments, ViNS).|
|
||||
| public_ips | list of strings | Список IP адресов на сетевых интерфейсах сервера, которые подключены непосредственно к внешним сетевым сегментам (external network segments).|
|
||||
| ram | int | Объём ОЗУ в МБ, выделенный виртуальному серверу.|
|
||||
| rg_id | int | Уникальный цифровой идентификатор ресурсной группы (RG), к которой принадлежит данный сервер.|
|
||||
| state | string | Состояние виртуального сервера.|
|
||||
| username | string |Имя системного пользователя по умолчанию.|
|
||||
|
||||
## Пример использования модуля decort_kvmvm
|
||||
|
||||
В данном примере создается виртуальный сервер KVM VM по имени MyFirstVM с аппаратной архитектурой Intel x86.
|
||||
```
|
||||
- name: create new x86 KVM VM according to the specs
|
||||
decort_kvmvm:
|
||||
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: MyFirstVM
|
||||
arch: KVM_X86
|
||||
state: present
|
||||
cpu: 2
|
||||
ram: 4096
|
||||
boot_disk: 10
|
||||
image_id: "{{ my_img.facts.id }}"
|
||||
networks:
|
||||
- type: VINS
|
||||
id: "{{ my_vins.facts.id }}"
|
||||
rg_id: "{{ my_rg.facts.id }}"
|
||||
annotation: "My 1st VM created and managed with DECORT KVMVM module"
|
||||
delegate_to: localhost
|
||||
register: new_vm
|
||||
```
|
||||
|
||||
Виртуальный сервер создаётся на базе некоторого системного образа (дискового ресурса, содержащего операционную систему). В данном примере системный образ задаётся по его идентификатору (image_id: "{{ my_img.facts.id }}"). Для получения такого идентификатора можно использовать модуль decort_osimage.
|
||||
|
||||
Виртуальный сервер всегда создаётся в принадлежности к некоторой ресурсной группе. В данном примере соответствующая ресурсная группа задаётся по её идентификатору (rg_id: "{{ my_rg.facts.id }}"). Для управления ресурсными группами предназначен модуль decort_rg. С помощью этого модуля можно также получит идентификатор ресурсной группы, чтобы использовать его при создании виртуального сервера.
|
||||
|
||||
Для управления сетевыми подключениями виртуального сервера в модуле decort_kvmvm используется параметр networks, представляющий собой список с описанием требующихся подключений. В данном примере задано одно подключение в виртуальному сетевому сегменту (type: VINS) с указанным идентификатором (id: "{{ my_vins.facts.id }}"). Для управления виртуальными сетевыми сегментами и получения их идентификаторов служит модуль decort_vins.
|
||||
135
wiki/5.2.6/модуль-decort_osimage.md
Normal file
135
wiki/5.2.6/модуль-decort_osimage.md
Normal file
@@ -0,0 +1,135 @@
|
||||
# 03.02 Модуль decort_osimage
|
||||
## Обзор модуля decort_osimage
|
||||
|
||||
Модуль decort_osimage предназначен для выполнения следующих действий над образами, созданными в облачной платформе DECORT:
|
||||
|
||||
1. Создание нового образа операционной системы для виртуальных машин.
|
||||
2. Создание виртуального образа для образа операционной системы.
|
||||
3. Изменение имени образа (в случае изменения имени виртуального образа, имя и id виртуального образа указываются как image_name и image_id.
|
||||
4. Привязка другого образа операционной системы к виртуальному образу.
|
||||
5. Удаление существующего образа, привязанного к аккаунту.
|
||||
6. Получение информации об образе.
|
||||
|
||||
Также данный модуль может быть полезен при массовом создании экземпляров compute (напр., виртуальных серверов) на базе одного и того же образа, так как позволяет оптимизировать количество API вызовов, инициируемых в адрес контроллера облачной платформы.
|
||||
|
||||
## Параметры модуля decort_osimage
|
||||
Ниже приведен полный список параметров для модуля decort_osimage. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения DECORT_APP_ID. |
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения DECORT_APP_SECRET. |
|
||||
| authenticator | Значения:<br/>`legacy`<br/>`oauth2`<br/>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. |
|
||||
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный виртуальный сервер. Данный параметр является обязательным. |
|
||||
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме authenticator: jwt Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`.|
|
||||
| oauth2_url | (string) | URL авторизационного сервера, работающего по протоколу Oauth2, который должен использоваться в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_OAUTH2_URL`. |
|
||||
| verify_ssl | (bool) | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты. Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
| workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения. Данный параметр является опциональным. Функциональность callbacks в текущей версии модуля не реализована. |
|
||||
| workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL. Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов `workflow_callback` данные со своим внутренним состоянием и отслеживать инициированные им задачи. Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`. Функциональность callbacks в текущей версии модуля не реализована. |
|
||||
| account_Id | (string) | Уникальный целочисленный идентификатор аккаунта. Используется для поиска образов, а тажке для их создания. |
|
||||
| account_name | (string) | Имя аккаунта. Используется для получения уникального целочисленного идентификатора аккаунта. |
|
||||
| virt_id | (integer) | Уникальный целочисленный идентификатор виртуального образа. Может использоваться для получения информации о виртуальном образе, а также для привязки к нему другого образа операционной системы.|
|
||||
| virt_name | (string) | Имя виртуального образа. Используется для получения `virt_id`, а в последвии информации о виртуальном образе, а также для создания виртуального образа и привязки к нему другого образа операционной системы.|
|
||||
| state | (string) | Состояние образов. При значении present идет создание образов операционной системы, к которым привязан указанный в `account_Id` или `account_name` аккаунт. При значении absent идет их удаление. |
|
||||
| drivers | (string) | Список типов compute (напр., виртуальных серверов), подходящих для образа операционной системы. Прим. `KVM_X86`. Используется при создании образа операционной системы.|
|
||||
| architecture | (string) | Бинарная архитектура образа. Прим. `X86_64` или `PPC64_LE`. Используется при создании образа операционной системы.|
|
||||
| imagetype | (string) | Тип образа. `linux`, `windows` или `other`. По умолчанию установлено `linux`. Используется при создании образа операционной системы.|
|
||||
| boottype | (string) | Тип загрузки образа. `bios` или `uefi`. По умолчанию установлено `uefi`. Используется при создании образа операционной системы.|
|
||||
| url | (string) | Унифицированный указатель ресурса (URL), указывающий на образ iso операционной системы. Используется при создании образа операционной системы.|
|
||||
| sepId | (integer) | Уникальный целочисленный идентификатор конечной точки провайдера хранения. Указывается в паре с `poolName`. Используется при создании образа операционной системы.|
|
||||
| poolName | (string) | Пул, в котором будет создан образ. Указывается в паре с `sepId`. Используется при создании образа операционной системы.|
|
||||
| hotresize | (bool) | Поддерживает ли образ "горячее" изменение размера. По умолчанию установлено `false`. Используется при создании образа операционной системы.|
|
||||
| image_username | (string) | Опциональное имя пользователя для образа. Используется при создании образа операционной системы. |
|
||||
| image_password | (string) | Опциональный пароль для образа. Используется при создании образа операционной системы. Используется при создании образа операционной системы.|
|
||||
| usernameDL | (string) | Имя пользователя для загрузки бинарного носителя. Используется в паре с `passwordDL`. Используется при создании образа операционной системы. |
|
||||
| passwordDL | (string)| Пароль для загрузки бинарного носителя. Используется в паре с `usernameDL`. Используется при создании образа операционной системы. |
|
||||
| permanently | (bool) | Навсегда ли удалить образ. Используется при удалении убраза. По умолчанию установлено false.|
|
||||
|
||||
|
||||
## Возвращаемые значения модуля decort_osimage
|
||||
|
||||
Модуль decort_osimage возвращает информацию о XXX в виде словаря facts со следующими ключами:
|
||||
|
||||
|
||||
| Ключ | Тип данных | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| arch | string | Аппаратная архитектура, с которой совместим данный образ. Возможные значения: X86_64 (Intel x86), PPC64_LE (IBM PowerPC). |
|
||||
| id | int | Уникальный целочисленный идентификатор данного образа. |
|
||||
| linkto | int | Уникальный целочисленный идентификатор образа операционной системы, который привязан к данному виртуальному. |
|
||||
| name | string | Имя образа. Обратите внимание, что имя образа может содержать пробелы. |
|
||||
| pool | string | Пул на системе хранения данных, в котором находится данный образ.|
|
||||
| sep_id |int | Идентификатор системы хранения (Storage Endpoint Provider), на которой хранится данный образ. |
|
||||
| size |int | Размер образа в ГБ. Загрузочный диск экземпляра compute, создаваемого на базе данного образа, должен иметь как минимум такой же размер. |
|
||||
| state | string | Текущий статус образа. Возможные значения: CREATED, DISABLED, DESTROYED. Экземпляры compute можно создавать только на базе образов, которые находятся в статусе CREATED.|
|
||||
| type | string | Тип операционной системы внутри данного образа. Возможные значения: Linux, Windows.|
|
||||
|
||||
|
||||
|
||||
## Пример использования модуля decort_osimage
|
||||
|
||||
|
||||
Пример создания образа операционной системы Alpine Linux.
|
||||
```
|
||||
- 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
|
||||
```
|
||||
Обратите внимание, что в данным примере можно использовать как image_name, так и image_id. Также можно использовать либо virt_name, либо virt_id.
|
||||
|
||||
Пример переименования образа.
|
||||
|
||||
```
|
||||
- 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
|
||||
```
|
||||
|
||||
73
wiki/5.2.6/модуль-decort_pfw.md
Normal file
73
wiki/5.2.6/модуль-decort_pfw.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# 03.04 Модуль decort_pfw
|
||||
## Обзор модуля decort_pfw
|
||||
|
||||
Модуль decort_pfw предназначен для управления правилами трансляции сетевых портов для указанного экземпляра Compute (например, для виртуального сервера, созданного с помощью decort_kvmvm).
|
||||
|
||||
##Параметры модуля 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 | Значения:<br/>`legacy`<br/>`oauth2`<br/>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. |
|
||||
|compute_id | (int) | Идентификатор экземпляра Compute (напр., виртуального сервера), для которого требуется настроит правила.|
|
||||
|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 of dicts) | Список словарей, задающих правила трансляции сетевых портов. Правила могут задавать как трансляцию "один к одному", так и "диапазон в диапазон". Структура словаря: (int) public_port_start - номер внешнего порта (на публичном интерфейсе ViNS, заданного параметром vins_id) для начала диапазона. (int) public_port_end - номер внешнего порта для конца диапазона. Если требуется правило "один к одному", то public_port_end можно не указывать или указать равным public_port_start. (int) local_port - номер порта на интерфейсе экземпляра Compute, заданного параметром compute_id. Если задаётся правило "диапазон в диапазон", то local_port становится началом диапазона для трансляции. В случае правила "один к одному" public_port_start просто транслируется в local_port (string) proto - протокол, tcp или udp.|
|
||||
| state | Значения:<br/>`present` <- default<br/>`absent`<br/>`check`<br/> | Целевое состояние правил.<br/>Если `state=absent`, то будут удалены все правила для указанного `compute_id` независимо от содержания параметра `rules`. В противном случае набор правил на выходе из модуля будет соответствовать тому, который содержится в параметре `rules`.<br/>Если задан `state=check`, то модуль запускается в режиме read-only и возвращает текущие настройки правил трансляции сетевых портов для указанных `compute_id` и `vins_id`. |
|
||||
| verify_ssl | (bool)<br/>`True` <- default<br/>`False` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br/>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
|vins_id | (int) | Идентификатор виртуального сетевого сегмента (Virtual Network Segment, ViNS), в рамках которого настраиваются правила трансляции сетевых портов. Экземпляр Compute, заданный в параметре `compute_id`, должен быть уже подключён к данному ViNS.|
|
||||
| workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения. Данный параметр является опциональным. Функциональность callbacks в текущей версии модуля не реализована. |
|
||||
|workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL. Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов `workflow_callback` данные со своим внутренним состоянием и отслеживать инициированные им задачи. Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`. Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
|
||||
## Возвращаемые значения модуля decort_pfw
|
||||
|
||||
Модуль decort_pfw возвращает информацию о правилах трансляции сетевых портов и сопутсвтующую информацию в виде словаря facts со следующими ключами:
|
||||
|
||||
|
||||
|Ключ | Тип данных | Описание|
|
||||
| ------ | ------ | ------ |
|
||||
|compute_id | int | Идентификатор compute, для которого настроены перечисленные правила трансляции.|
|
||||
|public_ip | string |IP адрес на внешнем сетевом интерфейсе ViNS. Перечисленные ниже правила трансляции настраиваются на этом интерфейсе.|
|
||||
|rules | list of dict | Список словарей, описывающих правила трансляции сетевых портов. Структура словаря: (int) id - идентификатор правила. (int) publicPortStart - номер внешнего порта (на публичном интерфейсе ViNS, см. public_ip) для начала диапазона. (int) publicPortEnd - номер внешнего порта для конца диапазона. Если требуется правило "один к одному", то publicPortEnd можно не указывать или указать равным publicPortStart. (int) localPort - номер порта на интерфейсе экземпляра Compute, заданного параметром compute_id. Если задаётся правило "диапазон в диапазон", то localPort указывает начало диапазона для трансляции. В случае правила "один к одному" publicPortStart просто транслируется в localPort. (string) protocol - протокол, tcp или udp.|
|
||||
|state | string | Статус правил. Для корректно отработавшего модуля это поле должно иметь значение "PRESENT".|
|
||||
|vins_id | int | Идентификатор виртуального сетевого сегмента (ViNS), в котором настроены перечисленные выше правила трансляции.|
|
||||
|
||||
## Пример использования модуля decort_pfw
|
||||
|
||||
В данном примере для ранее созданного экземпляра KVM VM compute (идентифицируется по compute_id), подключённого к указанному виртуальному сетевому сегменту (идентифицируется по vins_id) настраиваются два правила трансляции сетевых портов:
|
||||
|
||||
- Правило "один к одному": внешний порт 30022 -> внутренний порт 22, протокол tcp.
|
||||
- Правило "диапазон в диапазон": внешние порты с 30080 по 30085 включительно -> внутренние порты начиная с 30080, протокол tcp.
|
||||
|
||||
```
|
||||
- name: manage port forwarding rules
|
||||
decort_pfw:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
compute_id: "{{ my_kvmvm.facts.id }}"
|
||||
vins_id: "{{ my_vins01.facts.id }}"
|
||||
rules:
|
||||
- public_port_start: 30022
|
||||
local_port: 22
|
||||
proto: tcp
|
||||
- public_port_start: 30080
|
||||
public_port_end: 30085
|
||||
local_port: 30080
|
||||
proto: tcp
|
||||
state: present
|
||||
register: my_pfw
|
||||
delegate_to: localhost
|
||||
```
|
||||
|
||||
В данном примере результат выполнения модуля decort_pfw записывается в переменную my_pfw. Для доступа к списку правил используйте следующую конструкцию:
|
||||
|
||||
`"{{ my_pfw.facts.rules }}"`
|
||||
223
wiki/5.2.6/модуль-decort_rg.md
Normal file
223
wiki/5.2.6/модуль-decort_rg.md
Normal file
@@ -0,0 +1,223 @@
|
||||
# 03.05 Модуль 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), в рамках которой создаётся или уже существует данная ресурсная группа. Должен быть задан либо идентификатор, либо имя учётной записи (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то account_name игнорируется. |
|
||||
| account_name | (string) | Имя учётной записи (account), в рамках которой создаётся или уже существует данная ресурсная группа. Должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
|
||||
| access | (dict) | Параметр, позволяющий выдать,забрать, изменить права у пользователя в ресурсной группе. |
|
||||
| annotation | (string) | Текстовое описание ресурсной группы. Данный аргумент является опциональным и учитывается только при создании ресурсной группы, а при всех прочих операциях игнорируется. |
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения DECORT_APP_SECRET. |
|
||||
| authenticator | Значения:<br>`legacy`<br>`oauth2`<br>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. |
|
||||
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный виртуальный сервер. Данный параметр является обязательным. |
|
||||
| def_netType | (string) <br>Значения:<br>`PRIVATE` <- default<br>`PUBLIC`<br>`NONE` | Тип сети по умолчанию в ресурсной группе. Используется при создании ресурсной группы, а также, чтобы изменить ресурсную группу по умолчанию. Не обязателен. |
|
||||
| def_netId | (int) | Уникальный целочисленный идентификатор сети (ViNS), используется для изменения сети по умолчанию в ресурсной группе. |
|
||||
| extNetIp | (string) | IP-адрес внешней сети, к которой ресурсная группа будет подключена при создании. |
|
||||
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
|
||||
| ipcidr | (string) | IP-адрес приватной сети. Используется при создании ресурсной группы, чтобы задать ip адрес ViNS, который создастся вместе с ресурсной группой. Задаётся при параметре `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`. |
|
||||
| rename | (string) | Новое имя ресурсной группы. Используется при переименовании ресурсной группы. |
|
||||
| quotas | (dict) | Зарезервировано для будущих расширений, предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
|
||||
| resType | (list) | Типы ресурсов, которые можно создать в ресурсной группе. |
|
||||
| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным. |
|
||||
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. |
|
||||
| state | Значения:<br>`present` <- default<br>`absent`<br>`enabled`<br>`disabled` | Целевое состояние ресурсной группы. |
|
||||
| permanently | (bool)<br>`False` <- default<br>`True` | Параметр, использующийся при удалении ресурсной группы, при значении True - ресурсная группа удалится навсегда, а при False - попадёт в корзину. |
|
||||
| verify_ssl | (bool)<br>`True` <- default<br>`False` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
| workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль будет оперативно передавать информацию о своем статусе и текущей фазе исполнения.<br>Данный параметр является опциональным.<br>Функциональность callbacks в текущей версии модуля не реализована. |
|
||||
| workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL.<br>Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов `workflow_callback` данные со своим внутренним состоянием и отслеживать инициированные им задачи.<br>Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`.<br>Функциональность callbacks в текущей версии модуля не реализована. |
|
||||
|
||||
## Возвращаемые значения модуля decort_rg
|
||||
|
||||
Модуль decort_rg возвращает информацию о XXX в виде словаря facts со следующими ключами:
|
||||
| Ключ | Тип данных | Описание |
|
||||
|------|------------|----------|
|
||||
| account_id | int | Уникальный целочисленный идентификатор учётной записи (account), которому принадлежит данная ресурсная группа. |
|
||||
| gid | int | Идентификатор физического кластера (Grid ID), на базе которого развёрнута ресурсная группа. |
|
||||
| id | int | Уникальный целочисленный идентификатор ресурсной группы. |
|
||||
| name | string | Имя ресурсной группы. Обратите внимание, что это имя уникально только в рамках учётной записи, которой принадлежит данная ресурсная группа. |
|
||||
| state | string | Текущее состояние ресурсной группы. Корректные состояния: CREATED, DISABLED, DELETED, DESTROYED |
|
||||
| quota | dict | Текущие квоты ресурсной группы. |
|
||||
| resTypes | list | Список типов ресурсов, разрешенных к созданию в данной ресурсной группе. |
|
||||
| defNetId | int | Уникальный целочисленный идентификатор сети по умолчанию в данной ресурсной группе. |
|
||||
| defNetType | string | Тип сети по умолчанию в данной ресурсной группе. Корректные типы сети по умолчанию: NONE, PRIVATE, PUBLIC. |
|
||||
|
||||
## Пример использования модуля 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"
|
||||
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"
|
||||
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"
|
||||
quotas:
|
||||
cpu: 16
|
||||
ram: 16384
|
||||
disk: 100
|
||||
ext_ips: 20
|
||||
net_transfer: 1000
|
||||
resType:
|
||||
- vins
|
||||
- compute
|
||||
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"
|
||||
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"
|
||||
resType:
|
||||
- vins
|
||||
- compute
|
||||
- k8s
|
||||
- openshift
|
||||
- lb
|
||||
- flipgroup
|
||||
state: present
|
||||
register: my_rg
|
||||
delegate_to: localhost
|
||||
```
|
||||
|
||||
В данном примере результат работы модуля decort_rg записывается в переменную my_rg.
|
||||
|
||||
Модули DECORT, которым для работы требуется ресурсная группа, в качестве одного из параметров, как правило, принимают идентификатор `rg_id`. Так, например, используя модуль `decort_kvmvm` для создания виртуального сервера необходимо указать ресурсную группу, к которой будет принадлежать этот виртуальный сервер. Сделать это можно следующим образом:
|
||||
|
||||
```
|
||||
<прочие детали опущены>
|
||||
rg_id: "{{ my_rg.facts.id }}"
|
||||
```
|
||||
120
wiki/5.2.6/модуль-decort_vins.md
Normal file
120
wiki/5.2.6/модуль-decort_vins.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# 03.06 Модуль decort_vins
|
||||
## Обзор модуля decort_vins
|
||||
|
||||
Модуль decort_vins предназначен для создания, изменения, получения текущих характеристик и удаления виртуального сетевого сегмента (Virtual Network Segment, ViNS).
|
||||
Позволяет:
|
||||
- Создавать, удалять виртуальные сетевые сегменты.
|
||||
- Изменять виртуальные сетевые сегменты.
|
||||
- Запрашивать информацию о виртуальных сетевых сегментах.
|
||||
- Восстанавливать удалённые виртуальные сетевые сегменты.
|
||||
- Соединять виртуальные сетевые сегменты.
|
||||
|
||||
## Параметры модуля decort_vins
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_vins. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_vins`
|
||||
|
||||
|
||||
|Параметр | Тип, допустимые значения | Описание|
|
||||
| ------ | ------ | ------ |
|
||||
|account_id | (int) | Уникальный целочисленный идентификатор учётной записи (account), которой принадлежит данный ViNS. При идентификации виртуального сетевого сегмента по имени (см. параметр `vins_name`) должно быть задан либо идентификатор, либо имя учётной записи (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|account_name | (string) | Имя учётной записи (account), которой принадлежит данный ViNS. При идентификации виртуального сетевого сегмента по имени (см. параметр `vins_name`) должно быть задано либо имя, либо идентификатор учётной записи (см. параметр account_id). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|annotation | (string)| Текстовое описание виртуального сетевого сегмента. Данный аргумент является опциональным и учитывается только при создании ViNS, а при всех прочих операциях игнорируется.|
|
||||
|app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.|
|
||||
|app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
|
||||
| authenticator | Значения:<br/>`legacy`<br/>`oauth2`<br/>`jwt` <- default | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. |
|
||||
|controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данный виртуальный сервер. Данный параметр является обязательным. ext_net_id (int) Данный аргумент контролирует подключение виртуального сетевого сегмента во внешнюю сеть: * -1 (default) - ViNS не подключён ко внешней сети; * 0 - ViNS подключён ко внешней сети, которую платформа выбирает по умолчанию; * >0 - ViNS подключён ко внешней сети с заданным идентификатором;|
|
||||
|ext_ip_addr | (string) | Данный аргумент позволяет выбрать IP адрес для подключения виртуального сетевого сегмента ко внешней сети (когда значение аргумента ext_net_id больше либо равно 0) и учитывается только при новых подключених - в рамках модуля `decort_vins` вы не можете изменить внешний IP адрес не меняя идентификатор внешней сети. Параметр является опциональным: если он не задан, то в случае ViNS, подключённого во внешнюю сеть, платформа назначит IP адрес автоматически.| При ручном задании данного параметра следует иметь ввиду, что если будет задан неверный или уже занятый 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) | Идентификатор ресурсной группы, в которой должен быть создан или уже существует ViNS. Если одновременно заданы `rg_id` и `rg_name`, то `rg_name` игнорируется.|
|
||||
|rg_name | (string) | Имя ресурсной группы, в которой должен быть создан или уже существует ViNS. Если одновременно заданы `rg_name` и `rg_id`, то `rg_name` игнорируется.|
|
||||
| state | Значения:<br/>`present` <- default<br/>`absent`<br/>`enabled`<br/>`disabled`<br/> | Целевое состояние ViNS. |
|
||||
| verify_ssl | (bool)<br/>`True` <- default<br/>`False` | Позволяет отключить проверку 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`. Обратите внимание, что это имя уникально только в рамках ресурсной группы или учетной записи, на уровне которой существует данный сетевой сегмент.|
|
||||
| ext_net_id | (int) | Уникальный целочисленный идентификатор внешней сети. |
|
||||
| mgmtaddr | (str) | Адрес менеджмента интерфейса. В данный параметр указывается ip адрес менеджмента интерфейса, который предоставляет доступ по SSH. |
|
||||
| custom_config | (bool) | Параметр, отвечающий за использование пользовательской конфигурации. По умолчанию: `False` |
|
||||
| config_save | (bool) | Параметр, отвечающий за сохранение файла конфигурации. По умолчанию: `False` |
|
||||
| connect_to | (list) | Список, в котором необходимо указывать виртуальные сетевые сегменты, которые Вы хотите соединить. См. примеры.
|
||||
|workflow_callback | (string) | URL, по которому вышестоящее приложение (например, пользовательский портал или оркестратор верхнего уровня, инициирующий запуск Ansible playbook) ожидает API вызова, в параметрах которого модуль desc_vm будет оперативно передавать информацию о своем статусе и текущей фазе исполнения. Данный параметр является опциональным. Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
|workflow_context | (string) | Контекстная информация, которая будет содержаться в параметрах API вызова, адресованного к `workflow_callback` URL. Данная информация призвана однозначно идентифицировать задачу, выполняемую модулем в настоящий момент, чтобы оркестратор верхнего уровня мог сопоставить получаемые через вызов workflow_callback данные со своим внутренним состоянием и отслеживать инициированные им задачи. Параметр является опциональным и имеет значение только при условии, что также задан `workflow_callback`. Функциональность callbacks в текущей версии модуля не реализована.|
|
||||
|
||||
## Возвращаемые значения модуля decort_vins
|
||||
|
||||
Модуль decort_vins возвращает информацию о виртуальном сетевом сегменте (Virtual Network Segment, ViNS) в виде словаря facts со следующими ключами:
|
||||
|
||||
| Ключ | Тип данных | Описание |
|
||||
| --- | --- | --- |
|
||||
| account_id | int | Уникальный целочисленный идентификатор учётной записи (_account_), которой принадлежит ViNS. |
|
||||
| ext_ip_addr | (string) | IP адрес интерфейса, которым ViNS подключён во внешнюю сеть. Если ViNS не подключён к внешней сети, то пустая строка. |
|
||||
| ext_net_id | (int) | Идентификатор внешней сети, к которой подключён ViNS. -1 означает, что ViNS в данный момент не подключён к внешней сети. |
|
||||
| gid | (int) | Идентификатор физического кластера (Grid ID), на базе которого развёрнуты ресурсы данного ViNS. |
|
||||
| id | (int) | Уникальный целочисленный идентификатор ViNS. |
|
||||
| name | (string) | Имя ViNS. Обратите внимание, что это имя уникально только в рамках учётной записи или ресурсной группы, на уровне которых создан ViNS. |
|
||||
| int_net_addr | (string) | Адрес внутренней сети ViNS. Обратите внимание, что адреса внутренних сетей всех ViNS, принадлежащих одной и той же учётной записи (независимо от того, создан ли ViNS на уровне учётной записи или ресурсной группы), не пересекаются. |
|
||||
| rg_id | (int) | Уникальный целочисленный идентификатор учётной ресурсной группы, которой принадлежит данный ViNS. Если данный ViNS создан на уровне учётной записи, то `rg_id=0`. |
|
||||
| state | (string) | Текущее состояние ViNS.<br/>Корректные состояния: `CREATED`, `ENABLED`, `DISABLED`, `DELETED`, `DESTROYED`. |
|
||||
|
||||
|
||||
|
||||
## Пример использования модуля decort_vins
|
||||
|
||||
В данном примере создаётся виртуальный сетевой сегмент с именем "MyVins01" (vins_name: "MyVins01").
|
||||
|
||||
Сетевой сегмент создаётся на уровне ресурсной группы "MyRg01" (rg_name: "MyRg01"), принадлежащей учётной записи "MyMainAccount" (account_name: "MyMainAccount"). Виртуальный сетевой сегмент будет иметь подключение во внешнюю сеть по умолчанию (ext_net_id: 0).
|
||||
```
|
||||
- name: Manage ViNS at resource group level
|
||||
decort_vins:
|
||||
authenticator: jwt
|
||||
jwt: "{{ my_jwt.jwt }}"
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
vins_name: "vins_created_by_decort_VINS_module"
|
||||
state: present
|
||||
rg_id: 198
|
||||
ext_net_id: -1
|
||||
ipcidr: "10.20.30.0/24"
|
||||
mgmtaddr: "10.20.30.1"
|
||||
custom_config: false
|
||||
config_save: false
|
||||
verify_ssl: false
|
||||
register: my_vins
|
||||
```
|
||||
|
||||
Здесь результат исполнения модуля decort_vins записывается в переменную my_vins, которую можно дальше использовать в Ansible playbooks. Ниже показано, как получить и использовать идентификатор ViNS для подключения к нему виртуального сервера.
|
||||
```
|
||||
- name: manage virtual server
|
||||
decort_kvmvm:
|
||||
<< для краткости фрагмент опущен >>
|
||||
networks:
|
||||
- type: VINS
|
||||
id: "{{ my_vins.facts.id }}"
|
||||
<< для краткости фрагмент опущен >>
|
||||
```
|
||||
|
||||
В данном примере идёт создание виртуального сетевого сегмента, а потом его привязка к виртуальным сетевым сегментам с id 864 и 196.
|
||||
```
|
||||
- name: Manage ViNS at 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"
|
||||
state: present
|
||||
rg_id: 98
|
||||
connect_to:
|
||||
- type: VINS
|
||||
id: 864
|
||||
ipaddr: 192.168.5.66
|
||||
netmask: 24
|
||||
- type: VINS
|
||||
id: 196
|
||||
ipaddr: 192.168.9.133
|
||||
netmask: 24
|
||||
register: managed_vins
|
||||
|
||||
```
|
||||
|
||||
|
||||
16
wiki/5.2.6/полезные-советы.md
Normal file
16
wiki/5.2.6/полезные-советы.md
Normal file
@@ -0,0 +1,16 @@
|
||||
## 4.1 Как хранить авторизационную информацию отдельно от плейбука.
|
||||
|
||||
В зависимости от метода авторизации нужная информация может передаваться в аргументах app_id & app_secret (пара аргументов), jwt (единичный аргумент) или user & password (пара аргументов). Однако, помещать данную информацию непосредственно в плейбук или роль может быть небезопасным, так как она позволяет любому, кто получил этот файл, осуществить доступ к контроллеру облачной инфраструктуры от лица данного пользователя.
|
||||
|
||||
Если вышеперечисленные параметры не указаны в плейбуке или роли, то Ansible модуль DECORT попытается использовать значения, заданные в соответствующих переменных окружения:
|
||||
|
||||
|
||||
| Аргумент | Переменная окружения|
|
||||
| ------ | ------ |
|
||||
| app_id | DECORT_APP_ID |
|
||||
| app_secret | DECORT_APP_SECRET |
|
||||
| jwt | DECORT_JWT |
|
||||
| user | DECORT_USER |
|
||||
| password | DECORT_PASSWORD |
|
||||
|
||||
Поэтому для использования плейбука, не содержащего секретной информации, рекомендуется вместо внесения значений непосредственно в файл перед запуском провайдера установить нужные переменные окружения.
|
||||
16
wiki/5.3.0/Home.md
Normal file
16
wiki/5.3.0/Home.md
Normal file
@@ -0,0 +1,16 @@
|
||||
1. [Введение](./введение.md)
|
||||
- [Введение](./введение.md#введение)
|
||||
- [Системные требования](./введение.md#системные-требования)
|
||||
- [Подготовка к работе](./введение.md#подготовка-к-работе)
|
||||
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) - управление балансировщиками нагрузки
|
||||
27
wiki/5.3.0/введение.md
Normal file
27
wiki/5.3.0/введение.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Модули 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.0.0
|
||||
|
||||
## Подготовка к работе
|
||||
|
||||
Для начала работы необходимо, чтобы Ansible было известно местоположение файлов модулей. Для этого необходимо:
|
||||
- либо разместить директории **library** и **module_utils** в одной директории с плейбуками
|
||||
- либо в рабочей директории, из которой будет запускаться Ansible, разместить файл **ansible.cfg**, в котором задать пути к файлам модулей, например:
|
||||
```
|
||||
[defaults]
|
||||
library=./library
|
||||
module_utils=./module_utils
|
||||
```
|
||||
92
wiki/5.3.0/модуль-decort_bservice.md
Normal file
92
wiki/5.3.0/модуль-decort_bservice.md
Normal file
@@ -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
|
||||
```
|
||||
177
wiki/5.3.0/модуль-decort_disk.md
Normal file
177
wiki/5.3.0/модуль-decort_disk.md
Normal file
@@ -0,0 +1,177 @@
|
||||
# Модуль decort_disk
|
||||
## Обзор модуля decort_disk
|
||||
|
||||
Модуль decort_disk предназначен для управления дисками и позволяет производить с ними следующие действия:
|
||||
- создавать
|
||||
- удалять (в корзину или безвозвратно)
|
||||
- восстановливать из корзины
|
||||
- изменять:
|
||||
- имя
|
||||
- размер
|
||||
- лимиты ввода/вывода
|
||||
- включать/отключать общий доступ
|
||||
|
||||
|
||||
Обратите внимание:
|
||||
|
||||
- Загрузочный диск для виртуальной машины создаётся и подключается автоматически в процессе создания этой машины.
|
||||
- Модуль decort_disk служит для управления дополнительными дисками (т.н. data-дисками);
|
||||
- Подключение дополнительных дисков, созданных посредством decort_disk, к виртуальным машинам выполняется с помощью модуля управления виртуальными машинами (см. модуль decort_kvmvm).
|
||||
|
||||
## Параметры модуля decort_disk
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_disk. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_disk`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр `name`) должно быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|account_name | (string) | Имя аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр name) должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
|
||||
| annotation | (string)<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 | Уникальный целочисленный идентификатор аккаунта, которому принадлежит диск.|
|
||||
| attached_to | int | Идентификатор виртуальной машины, к которой в настоящий момент подключён диск. Если диск не подключён, то `attached_to: 0`|
|
||||
| gid | int | Идентификатор физического кластера (Grid ID), на ресурсах которого создан диск.|
|
||||
| id | int | Уникальный целочисленный идентификатор данного диска.|
|
||||
| iotune | dict | Текущие ограничения ввода/вывода диска. |
|
||||
| name | string | Имя диска. Обратите внимание, что имя диска не является уникальным с точки зрения системы хранения данных, на которой этот диск расположен.|
|
||||
| pool | string | Имя пула на системе хранения данных, в котором размещаются ресурсы диска.|
|
||||
|sep_id | int | Идентификатор системы хранения данных (Storage Endpoint), на которой размещаются ресурсы данного диска.|
|
||||
| size | int | Размер диска в ГБ.|
|
||||
| state | string | Текущий статус диска. |
|
||||
|
||||
|
||||
## Пример использования модуля decort_disk
|
||||
|
||||
В данном примере создаётся диск размером 50ГБ (`size: 50`), с ограничением ввода/вывода в 2000 iops, на ресурсах системы хранения данных под номером 1 (`sep_id: 1`) в пуле "data01".
|
||||
|
||||
```
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: "DataDisk01"
|
||||
size: 50
|
||||
account_name: "MyAccount"
|
||||
sep_id: 1
|
||||
iops: 2000
|
||||
annotation: "Disk example"
|
||||
pool: data01
|
||||
register: my_data_disk01
|
||||
```
|
||||
В следующих двух примерах для существующего диска с именем "DataDisk01" задаются все доступные лимиты на операции ввода/вывода.
|
||||
|
||||
```
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: "DataDisk01"
|
||||
account_name: "MyAccount"
|
||||
limitIO:
|
||||
read_bytes_sec: 10000
|
||||
write_bytes_sec: 5000
|
||||
read_iops_sec и write_iops_sec
|
||||
read_iops_sec: 2500
|
||||
write_iops_sec: 1000
|
||||
read_bytes_sec_max: 11000
|
||||
write_bytes_sec_max: 6000
|
||||
read_iops_sec_max: 3000
|
||||
write_iops_sec_max: 1500
|
||||
size_iops_sec: 1000
|
||||
register: my_data_disk01
|
||||
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: "DataDisk01"
|
||||
account_name: "MyAccount"
|
||||
limitIO:
|
||||
total_bytes_sec: 15000
|
||||
total_iops_sec: 3500
|
||||
total_bytes_sec_max: 17000
|
||||
total_iops_sec_max: 4500
|
||||
size_iops_sec: 1000
|
||||
register: my_data_disk01
|
||||
```
|
||||
|
||||
В данном примере выполняется восстановление удаленного диска с id 111 из корзины.
|
||||
|
||||
```
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
id: 111
|
||||
size: 10
|
||||
register: my_data_disk01
|
||||
```
|
||||
|
||||
В данном примере выполняется переименование диска с id 111 на новое имя "NewExampleDisk".
|
||||
|
||||
```
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
id: 111
|
||||
name: "NewExampleDisk"
|
||||
size: 10
|
||||
register: my_data_disk01
|
||||
```
|
||||
|
||||
Здесь результат работы модуля decort_disk записывается в переменную my_data_disk01. Для получения идентификатора диска, например, при подключении его к виртуальной машине, следует воспользоваться показанной ниже конструкцией:
|
||||
|
||||
```
|
||||
- name: Manage compute
|
||||
decort_kvmvm:
|
||||
<< для краткости фрагмент опущен >>
|
||||
data_disks:
|
||||
- "{{ my_data_disk01.facts.id }}"
|
||||
<< для краткости фрагмент опущен >>
|
||||
```
|
||||
105
wiki/5.3.0/модуль-decort_group.md
Normal file
105
wiki/5.3.0/модуль-decort_group.md
Normal file
@@ -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>Default: `KVM_X86` | Драйвер. |
|
||||
| id | (int) | Идентификатор группы. |
|
||||
| image_id | (int) | Идентификатор образа. |
|
||||
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt` Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`. |
|
||||
| name | (str) | Имя группы. Обязательный параметр.
|
||||
| networks | (list) | Список словарей, описывающих сети, которые должны быть подключены.<br>Ключи словаря:<br>• `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя) или `EXTNET` (внешняя)<br>• `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>• `id` (int) - идентификатор ВМ<br>• `ipAddresses` (list) - список IP-адресов ВМ<br>• `name` (str) - имя ВМ<br>• `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
|
||||
```
|
||||
53
wiki/5.3.0/модуль-decort_jwt.md
Normal file
53
wiki/5.3.0/модуль-decort_jwt.md
Normal file
@@ -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 }}"
|
||||
```
|
||||
108
wiki/5.3.0/модуль-decort_k8s.md
Normal file
108
wiki/5.3.0/модуль-decort_k8s.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Модуль decort_k8s
|
||||
## Обзор модуля decort_k8s
|
||||
|
||||
Модуль **decort_k8s** предназначен для выполнения следующих действий над кластерами Kubernetes:
|
||||
- создать
|
||||
- получить информацию
|
||||
- отключить/включить/запустить
|
||||
- изменить группы Worker-узлов
|
||||
- удалить (в корзину или безвозвратно)
|
||||
- восстановить из корзины
|
||||
|
||||
## Параметры модуля decort_k8s
|
||||
Ниже приведен полный список параметров для модуля **decort_k8s**:
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Идентификатор аккаунта. |
|
||||
| account_name | (string) | Имя аккаунта. |
|
||||
| additionalSANs | (list) | Список дополнительных SAN (Subject Alternative Names) для использования в процессе автоматического выписывания сертификата Кластера Kubernetes. Можно использовать IP-адреса и доменные имена.
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. |
|
||||
| authenticator | (str)<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_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` | Автоматический запуск кластера после его создания. |
|
||||
| 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>• `annotations` (list) (необязательный) - список строк с annotations в формате: `key1=value1`<br>• `ci_user_data` (dict) (необязательный) - конфигурация для cloud-init<br>• `cpu` (int) (обязательный) - количество виртуальных процессоров на узле<br>• `disk` (int) (обязательный) - объём загрузочного диска на узле<br>• `labels` (list) (необязательный) - список строк с labels в формате: `label1=value1`<br>• `name` (string) (обязательный) - имя группы Worker-узлов<br>• `num` (int) (обязательный) - количество узлов<br>• `pool` (str) (обязательный) - пул СХД, заданной ключом `sep_id`<br>• `ram` (int) (обязательный) - объём оперативной памяти на узле<br>• `sep_id` (int) (обязательный) - идентификатор СХД; если задать `null`, то используется СХД образа узла<br>• `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>• `cpu` (int) - количество виртуальных процессоров<br>• `detailedInfo` (list) - список словарей с информацией об узлах; ключи словаря: `id` (int) - идентификатор ВМ, `name` (str) - имя ВМ, `status` (str) - статус ВМ, `techStatus` (str) - технический статус ВМ<br>• `disk` (int) - объём загрузочного диска<br>• `id` (int) - идентификатор группы<br>• `name` (str) - имя группы<br>• `num` (int) - количество узлов<br>• `ram` (int) - объём оперативной памяти
|
||||
| k8s_Workers | dict | Список словарей с информацией о группах Worker-узлов.<br>Ключи словаря:<br>• `cpu` (int) - количество виртуальных процессоров<br>• `detailedInfo` (list) - список словарей с информацией об узлах; ключи словаря: `id` (int) - идентификатор ВМ, `name` (str) - имя ВМ, `status` (str) - статус ВМ, `techStatus` (str) - технический статус ВМ<br>• `disk` (int) - объём загрузочного диска<br>• `id` (int) - идентификатор группы<br>• `labels` (list) - список строк с labels<br>• `name` (str) - имя группы<br>• `num` (int) - количество узлов<br>• `ram` (int) - объём оперативной памяти<br>• `taints` (list) - список строк с taints
|
||||
| name | string | Имя кластера. |
|
||||
| rg_id | int | Идентификатор ресурсной группы. |
|
||||
| state | string | Статус кластера. |
|
||||
| techStatus | string | Технический статус кластера. |
|
||||
| vins_id | int | Идентификатор внутренней сети кластера. |
|
||||
|
||||
|
||||
## Пример использования модуля decort_k8s
|
||||
|
||||
|
||||
Пример создания кластера Kubernetes с именем `cluster-test` с получением Kuber config.
|
||||
```
|
||||
- name: Create a k8s cluster named cluster-test
|
||||
decort_k8s:
|
||||
authenticator: jwt
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
getConfig: true
|
||||
jwt: "{{ token.jwt }}"
|
||||
k8ci_id: 18
|
||||
name: cluster-test
|
||||
rg_id: 125
|
||||
workers:
|
||||
- cpu: 10
|
||||
disk: 10
|
||||
name: wg1
|
||||
num: 1
|
||||
pool: null
|
||||
ram: 1024
|
||||
sep_id: null
|
||||
- cpu: 10
|
||||
disk: 10
|
||||
name: wg2
|
||||
num: 2
|
||||
pool: null
|
||||
ram: 1024
|
||||
sep_id: null
|
||||
register: k8s_cluster
|
||||
```
|
||||
106
wiki/5.3.0/модуль-decort_kvmvm.md
Normal file
106
wiki/5.3.0/модуль-decort_kvmvm.md
Normal file
@@ -0,0 +1,106 @@
|
||||
# Модуль decort_kvmvm
|
||||
## Обзор модуля decort_kvmvm
|
||||
|
||||
Модуль **decort_kvmvm** предназначен для выполнения следующих действий над виртуальными машинами:
|
||||
- создать
|
||||
- получить информацию
|
||||
- остановить/приостановить/запустить
|
||||
- подключить/отключить диски с данными
|
||||
- подключить/отключить сети
|
||||
- изменить
|
||||
- объём загрузочного диска в большую сторону
|
||||
- количество CPU
|
||||
- объём ОЗУ
|
||||
- тэги
|
||||
- affinity метку
|
||||
- affinity правила
|
||||
- anti-affinity правила
|
||||
- удалить (безвозвратно)
|
||||
|
||||
## Параметры модуля decort_kvmvm
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля **decort_kvmvm**. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_kvmvm`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| aaff_rule | (list) | Список словарей, описывающих anti-affinity правила.<br>Ключи словаря:<br>• `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)<br>• `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`<br>• `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)<br>• `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила<br>• `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`)
|
||||
| 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>• `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)<br>• `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`<br>• `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)<br>• `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила<br>• `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`)
|
||||
| affinity_label | (str) | Метка affinity.
|
||||
| annotation | (string) | Опциональное описание виртуальной машины. Этот параметр используется только при создании.|
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_APP_ID`.|
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DCORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
|
||||
| arch | (str)<br>Значения:<br/>`X86_64`<br>`PPC64_LE`<br>Default: `X86_64` | Архитектура виртуальной машины. |
|
||||
| authenticator | (str)<br>Значения:<br>`oauth2`<br>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. |
|
||||
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ. |
|
||||
| ci_user_data | (dict) | конфигурация для cloud-init
|
||||
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данная виртуальная машина. Данный параметр является обязательным. |
|
||||
| cpu | (int) | Количество виртуальных процессоров, выделяемых виртуальной машине. |
|
||||
| data_disks | (list) | Список идентификаторов дисков, которые следует подключить к данной виртуальной машине как дополнительные. |
|
||||
| id | (int) | Уникальный цифровой идентификатор виртуальной машины. Этот параметр используется как один из методов идентификации существующей ВМ (альтернатива – по комбинации `name`, `rg_name` и `account_name`). Если при вызове модуля **decort_kvmvm** существующая ВМ идентифицируется по `id`, то параметры `account_id`, `account_name`, `rg_id` и `rg_name` игнорируются. |
|
||||
| image_id | (int) | Уникальный цифровой идентификатор образа, на базе которого следует создать виртуальную машину. При создании задать этот параметр или параметр `image_name`. При любых других операциях данные параметры игнорируются. Если заданы оба этих параметра (`image_id` и `image_name`), то `image_name` игнорируется. |
|
||||
| image_name | (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`.|
|
||||
| networks | (list) | Список словарей, описывающих сети для подключения к ВМ.<br>Ключи словаря:<br>• `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя) или `EXTNET` (внешняя)<br>• `id` (int) (обязательный) - идентификатор сети<br>• `ip_addr` (string) (необязательный) - IP-адрес, используемый для подключения к данной сети. |
|
||||
| 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) | Словарь, пары ключ-значение которого, описывают тэги для ВМ. |
|
||||
| verify_ssl | (bool)<br>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
|
||||
## Возвращаемые значения модуля decort_kvmvm
|
||||
|
||||
Модуль **decort_kvmvm** возвращает информацию о виртуальной машине в виде словаря `facts` со следующими ключами:
|
||||
|
||||
|
||||
| Ключ | Тип данных | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | int | Идентификатор аккаунта. |
|
||||
| arch | string | Архитектура ВМ. |
|
||||
| cpu | int | Количество виртуальных процессоров. |
|
||||
| data_disks | list | Список идентификаторов дисков с данными, подключенных к ВМ. |
|
||||
| disk_size | int | Размер загрузочного диска в ГБ. |
|
||||
| id | int | Идентификатор ВМ. |
|
||||
| image_id | id | Идентификатор образа.
|
||||
| name | string | Имя ВМ. |
|
||||
| password | string | Пароль пользователя ОС по умолчанию. |
|
||||
| private_ips | list | Список IP-адресов на сетевых интерфейсах ВМ, которые подключены к внутренним сетям. |
|
||||
| public_ips | list | Список IP адресов на сетевых интерфейсах ВМ, которые подключены к внешним сетям. |
|
||||
| ram | int | Объём ОЗУ ВМ в МБ. |
|
||||
| rg_id | int | Идентификатор ресурсной группы, которой принадлежит данная ВМ. |
|
||||
| state | string | Состояние ВМ.|
|
||||
| tags | dict | Словарь, пары ключ-значение которого, описывают тэги ВМ.
|
||||
| tech_status | str | Технический статус ВМ.
|
||||
| username | string | Имя пользователя ОС по умолчанию. |
|
||||
|
||||
## Пример использования модуля decort_kvmvm
|
||||
|
||||
В данном примере создается ВМ с именем MyFirstVM.
|
||||
```
|
||||
- name: Сreate VM
|
||||
decort_kvmvm:
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
cpu: 2
|
||||
image_id: "{{ my_img.facts.id }}"
|
||||
name: MyFirstVM
|
||||
networks:
|
||||
- type: VINS
|
||||
id: "{{ my_vins.facts.id }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
ram: 4096
|
||||
rg_id: "{{ my_rg.facts.id }}"
|
||||
register: my_vm
|
||||
```
|
||||
893
wiki/5.3.0/модуль-decort_lb.md
Normal file
893
wiki/5.3.0/модуль-decort_lb.md
Normal file
@@ -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">
|
||||
annotation
|
||||
</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>
|
||||
Cловарь, описывающий параметры по умолчанию для 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>
|
||||
Cловарь, описывающий параметры по умолчанию для 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>
|
||||
Cловарь, описывающий параметры 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>
|
||||
132
wiki/5.3.0/модуль-decort_osimage.md
Normal file
132
wiki/5.3.0/модуль-decort_osimage.md
Normal file
@@ -0,0 +1,132 @@
|
||||
# Модуль 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`. |
|
||||
| architecture | (string)<br>Default: `X86_64` | Архитектура микропроцессора, для которой предназначен образ. Используется при создании образа.|
|
||||
| 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
|
||||
```
|
||||
|
||||
76
wiki/5.3.0/модуль-decort_pfw.md
Normal file
76
wiki/5.3.0/модуль-decort_pfw.md
Normal file
@@ -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>• `local_port` (int) (обязательный) - внутренний порт; значения: от `1` до `65535`<br>• `proto` (str) (обязательный) - протокол; значения: `tcp` или `udp`<br>• `public_port_end` (int) (необязательный) - верхняя граница диапазона внешних портов; значения: от значения ключа `public_port_start` до `65535`;<br>• `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>• `id` (int) - идентификатор правила<br>• `localIp` (str) - IP-адрес ВМ<br>• `localPort` (int) - внутренний порт<br>• `protocol` (str) - протокол<br>• `publicPortEnd` (int) - верхняя граница диапазона внешних портов<br>• `publicPortStart` (int) - нижняя граница диапазона внешних портов<br>• `vmId` (int) - идентификатор ВМ<br>• `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 }}"
|
||||
```
|
||||
200
wiki/5.3.0/модуль-decort_rg.md
Normal file
200
wiki/5.3.0/модуль-decort_rg.md
Normal file
@@ -0,0 +1,200 @@
|
||||
# Модуль decort_rg
|
||||
|
||||
## Обзор модуля decort_rg
|
||||
|
||||
Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет:
|
||||
|
||||
- создавать ресурсные группы
|
||||
- удалять ресурсные группы (в корзину или безвозвратно)
|
||||
- восстанавливать ресурсные группы из корзины
|
||||
- включать/отключать ресурсные группы
|
||||
- запрашивать информацию об уже существующих ресурсных группах
|
||||
- изменять ресурсные группы:
|
||||
- переименовывать
|
||||
- настраивать квоты
|
||||
- задавать стандартную сеть
|
||||
- настраивать права доступа для пользователей
|
||||
|
||||
## Параметры модуля decort_rg
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_rg. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: `ansible-doc -t module decort_rg`
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
|----------|--------------------------|----------|
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то account_name игнорируется. |
|
||||
| account_name | (string) | Имя аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
|
||||
| access | (dict) | Параметр, позволяющий выдать, забрать или изменить права у пользователя в ресурсной группе. |
|
||||
| annotation | (string) | Текстовое описание ресурсной группы. Данный параметр является опциональным и учитывается только при создании ресурсной группы, а при всех прочих операциях игнорируется. |
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения DECORT_APP_SECRET. |
|
||||
| authenticator | Значения:<br>`oauth2`<br>`jwt`| Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным.|
|
||||
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должна быть создана (или уже существует) данная ресурсная группа. Данный параметр является обязательным. |
|
||||
| def_netType | (string) <br>Значения:<br>`PRIVATE`<br>`PUBLIC`<br>`NONE`<br>Default: `PRIVATE` | Тип сети по умолчанию в ресурсной группе. Используется при создании ресурсной группы, а также при изменении. |
|
||||
| def_netId | (int) | Уникальный целочисленный идентификатор внутренней или внешней сети. Используется для изменения сети по умолчанию в ресурсной группе. |
|
||||
| extNetId | (int) | Уникальный целочисленный идентификатор внешней сети. Используется при создании РГ для подключения внешней сети к внутренней сети, которая будет создана и задана как сеть по умолчанию для РГ. |
|
||||
| extNetIp | (string) | IP-адрес для внешней сети, которая задана в параметре `extNetId`. |
|
||||
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
|
||||
| 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`. |
|
||||
| rename | (string) | Новое имя ресурсной группы. Используется при переименовании ресурсной группы. |
|
||||
| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
|
||||
| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным при создании. |
|
||||
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. Является обязательным при изменении РГ если не заданы `rg_name` и `account_id`/`account_name` |
|
||||
| state | Значения:<br>`present`<br>`absent`<br>`enabled`<br>`disabled`<br>Default: `present` | Целевое состояние ресурсной группы. |
|
||||
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. |
|
||||
| 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 | Список идентификаторов виртуальных машин ресурсной группы. |
|
||||
|
||||
## Пример использования модуля 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 }}"
|
||||
```
|
||||
120
wiki/5.3.0/модуль-decort_vins.md
Normal file
120
wiki/5.3.0/модуль-decort_vins.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# Модуль decort_vins
|
||||
## Обзор модуля decort_vins
|
||||
|
||||
Модуль decort_vins предназначен для управления внутренними сетями (Virtual Network Segment, ViNS) и позволяет производить с ними следующие действия:
|
||||
- создавать
|
||||
- на уровне ресурсной группы (если РГ задана)
|
||||
- на уровне аккаунта (если РГ не задана)
|
||||
- удалять (безвозвратно)
|
||||
- восстанавливать из корзины
|
||||
- запрашивать информацию
|
||||
- включать/отключать
|
||||
- соединять (необходимы права администратора)
|
||||
- изменять:
|
||||
- включать/отключать SSH-доступ к виртуальному маршрутизатору (необходимы права администратора)
|
||||
- включать/отключать режим **Custom Config** для виртуального маршрутизатора (необходимы права администратора)
|
||||
- сохранять конфигурацию виртуального маршрутизатора для возможности последующего отката к ней (необходимы права администратора)
|
||||
|
||||
## Параметры модуля decort_vins
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_vins. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_vins`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данная внутреняя сеть. При идентификации внутренней сети по имени (см. параметр `vins_name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
| account_name | (string) | Имя аккаунта, которому принадлежит данная внутренняя сеть. При идентификации внутренней сети по имени (см. параметр `vins_name`) должно быть задано либо имя, либо идентификатор аккаунта (см. параметр account_id). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|annotation | (string)| Текстовое описание внутренней сети. Данный аргумент является опциональным и учитывается только при создании внутренней сети, а при всех прочих операциях игнорируется.|
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.|
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
|
||||
| authenticator | Значения:<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
|
||||
|
||||
```
|
||||
|
||||
|
||||
21
wiki/5.4.0/Home.md
Normal file
21
wiki/5.4.0/Home.md
Normal file
@@ -0,0 +1,21 @@
|
||||
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) - получение информации об аккаунте
|
||||
182
wiki/5.4.0/введение.md
Normal file
182
wiki/5.4.0/введение.md
Normal file
@@ -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.0.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 }}"
|
||||
```
|
||||
3840
wiki/5.4.0/модуль-decort_account_info.md
Normal file
3840
wiki/5.4.0/модуль-decort_account_info.md
Normal file
File diff suppressed because it is too large
Load Diff
92
wiki/5.4.0/модуль-decort_bservice.md
Normal file
92
wiki/5.4.0/модуль-decort_bservice.md
Normal file
@@ -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
|
||||
```
|
||||
177
wiki/5.4.0/модуль-decort_disk.md
Normal file
177
wiki/5.4.0/модуль-decort_disk.md
Normal file
@@ -0,0 +1,177 @@
|
||||
# Модуль decort_disk
|
||||
## Обзор модуля decort_disk
|
||||
|
||||
Модуль decort_disk предназначен для управления дисками и позволяет производить с ними следующие действия:
|
||||
- создавать
|
||||
- удалять (в корзину или безвозвратно)
|
||||
- восстановливать из корзины
|
||||
- изменять:
|
||||
- имя
|
||||
- размер
|
||||
- лимиты ввода/вывода
|
||||
- включать/отключать общий доступ
|
||||
|
||||
|
||||
Обратите внимание:
|
||||
|
||||
- Загрузочный диск для виртуальной машины создаётся и подключается автоматически в процессе создания этой машины.
|
||||
- Модуль decort_disk служит для управления дополнительными дисками (т.н. data-дисками);
|
||||
- Подключение дополнительных дисков, созданных посредством decort_disk, к виртуальным машинам выполняется с помощью модуля управления виртуальными машинами (см. модуль decort_kvmvm).
|
||||
|
||||
## Параметры модуля decort_disk
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_disk. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_disk`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр `name`) должно быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|account_name | (string) | Имя аккаунта, которому принадлежит данный диск. При идентификации диска по имени (см. параметр name) должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
|
||||
| annotation | (string)<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 | Уникальный целочисленный идентификатор аккаунта, которому принадлежит диск.|
|
||||
| attached_to | int | Идентификатор виртуальной машины, к которой в настоящий момент подключён диск. Если диск не подключён, то `attached_to: 0`|
|
||||
| gid | int | Идентификатор физического кластера (Grid ID), на ресурсах которого создан диск.|
|
||||
| id | int | Уникальный целочисленный идентификатор данного диска.|
|
||||
| iotune | dict | Текущие ограничения ввода/вывода диска. |
|
||||
| name | string | Имя диска. Обратите внимание, что имя диска не является уникальным с точки зрения системы хранения данных, на которой этот диск расположен.|
|
||||
| pool | string | Имя пула на системе хранения данных, в котором размещаются ресурсы диска.|
|
||||
|sep_id | int | Идентификатор системы хранения данных (Storage Endpoint), на которой размещаются ресурсы данного диска.|
|
||||
| size | int | Размер диска в ГБ.|
|
||||
| state | string | Текущий статус диска. |
|
||||
|
||||
|
||||
## Пример использования модуля decort_disk
|
||||
|
||||
В данном примере создаётся диск размером 50ГБ (`size: 50`), с ограничением ввода/вывода в 2000 iops, на ресурсах системы хранения данных под номером 1 (`sep_id: 1`) в пуле "data01".
|
||||
|
||||
```
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: "DataDisk01"
|
||||
size: 50
|
||||
account_name: "MyAccount"
|
||||
sep_id: 1
|
||||
iops: 2000
|
||||
annotation: "Disk example"
|
||||
pool: data01
|
||||
register: my_data_disk01
|
||||
```
|
||||
В следующих двух примерах для существующего диска с именем "DataDisk01" задаются все доступные лимиты на операции ввода/вывода.
|
||||
|
||||
```
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: "DataDisk01"
|
||||
account_name: "MyAccount"
|
||||
limitIO:
|
||||
read_bytes_sec: 10000
|
||||
write_bytes_sec: 5000
|
||||
read_iops_sec и write_iops_sec
|
||||
read_iops_sec: 2500
|
||||
write_iops_sec: 1000
|
||||
read_bytes_sec_max: 11000
|
||||
write_bytes_sec_max: 6000
|
||||
read_iops_sec_max: 3000
|
||||
write_iops_sec_max: 1500
|
||||
size_iops_sec: 1000
|
||||
register: my_data_disk01
|
||||
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
name: "DataDisk01"
|
||||
account_name: "MyAccount"
|
||||
limitIO:
|
||||
total_bytes_sec: 15000
|
||||
total_iops_sec: 3500
|
||||
total_bytes_sec_max: 17000
|
||||
total_iops_sec_max: 4500
|
||||
size_iops_sec: 1000
|
||||
register: my_data_disk01
|
||||
```
|
||||
|
||||
В данном примере выполняется восстановление удаленного диска с id 111 из корзины.
|
||||
|
||||
```
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
id: 111
|
||||
size: 10
|
||||
register: my_data_disk01
|
||||
```
|
||||
|
||||
В данном примере выполняется переименование диска с id 111 на новое имя "NewExampleDisk".
|
||||
|
||||
```
|
||||
- name: Manage disk
|
||||
decort_disk:
|
||||
authenticator: oauth2
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
id: 111
|
||||
name: "NewExampleDisk"
|
||||
size: 10
|
||||
register: my_data_disk01
|
||||
```
|
||||
|
||||
Здесь результат работы модуля decort_disk записывается в переменную my_data_disk01. Для получения идентификатора диска, например, при подключении его к виртуальной машине, следует воспользоваться показанной ниже конструкцией:
|
||||
|
||||
```
|
||||
- name: Manage compute
|
||||
decort_kvmvm:
|
||||
<< для краткости фрагмент опущен >>
|
||||
data_disks:
|
||||
- "{{ my_data_disk01.facts.id }}"
|
||||
<< для краткости фрагмент опущен >>
|
||||
```
|
||||
105
wiki/5.4.0/модуль-decort_group.md
Normal file
105
wiki/5.4.0/модуль-decort_group.md
Normal file
@@ -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>Default: `KVM_X86` | Драйвер. |
|
||||
| id | (int) | Идентификатор группы. |
|
||||
| image_id | (int) | Идентификатор образа. |
|
||||
| jwt | (string) | JSON Web Token (JWT), который будет использоваться для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: jwt` Данный параметр является обязательным для указанного режима. Так как он содержит потенциально секретную информацию, а сам JWT, как правило, имеет ограниченное время жизни, то его не рекомендуется задавать непосредственно в playbook. Если этот параметр не определен в playbook, то модуль будет использовать значение переменной окружения `DECORT_JWT`. |
|
||||
| name | (str) | Имя группы. Обязательный параметр.
|
||||
| networks | (list) | Список словарей, описывающих сети, которые должны быть подключены.<br>Ключи словаря:<br>• `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя) или `EXTNET` (внешняя)<br>• `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>• `id` (int) - идентификатор ВМ<br>• `ipAddresses` (list) - список IP-адресов ВМ<br>• `name` (str) - имя ВМ<br>• `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
|
||||
```
|
||||
53
wiki/5.4.0/модуль-decort_jwt.md
Normal file
53
wiki/5.4.0/модуль-decort_jwt.md
Normal file
@@ -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 }}"
|
||||
```
|
||||
108
wiki/5.4.0/модуль-decort_k8s.md
Normal file
108
wiki/5.4.0/модуль-decort_k8s.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Модуль decort_k8s
|
||||
## Обзор модуля decort_k8s
|
||||
|
||||
Модуль **decort_k8s** предназначен для выполнения следующих действий над кластерами Kubernetes:
|
||||
- создать
|
||||
- получить информацию
|
||||
- отключить/включить/запустить
|
||||
- изменить группы Worker-узлов
|
||||
- удалить (в корзину или безвозвратно)
|
||||
- восстановить из корзины
|
||||
|
||||
## Параметры модуля decort_k8s
|
||||
Ниже приведен полный список параметров для модуля **decort_k8s**:
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Идентификатор аккаунта. |
|
||||
| account_name | (string) | Имя аккаунта. |
|
||||
| additionalSANs | (list) | Список дополнительных SAN (Subject Alternative Names) для использования в процессе автоматического выписывания сертификата Кластера Kubernetes. Можно использовать IP-адреса и доменные имена.
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`. |
|
||||
| authenticator | (str)<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_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` | Автоматический запуск кластера после его создания. |
|
||||
| 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>• `annotations` (list) (необязательный) - список строк с annotations в формате: `key1=value1`<br>• `ci_user_data` (dict) (необязательный) - конфигурация для cloud-init<br>• `cpu` (int) (обязательный) - количество виртуальных процессоров на узле<br>• `disk` (int) (обязательный) - объём загрузочного диска на узле<br>• `labels` (list) (необязательный) - список строк с labels в формате: `label1=value1`<br>• `name` (string) (обязательный) - имя группы Worker-узлов<br>• `num` (int) (обязательный) - количество узлов<br>• `pool` (str) (обязательный) - пул СХД, заданной ключом `sep_id`<br>• `ram` (int) (обязательный) - объём оперативной памяти на узле<br>• `sep_id` (int) (обязательный) - идентификатор СХД; если задать `null`, то используется СХД образа узла<br>• `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>• `cpu` (int) - количество виртуальных процессоров<br>• `detailedInfo` (list) - список словарей с информацией об узлах; ключи словаря: `id` (int) - идентификатор ВМ, `name` (str) - имя ВМ, `status` (str) - статус ВМ, `techStatus` (str) - технический статус ВМ<br>• `disk` (int) - объём загрузочного диска<br>• `id` (int) - идентификатор группы<br>• `name` (str) - имя группы<br>• `num` (int) - количество узлов<br>• `ram` (int) - объём оперативной памяти
|
||||
| k8s_Workers | dict | Список словарей с информацией о группах Worker-узлов.<br>Ключи словаря:<br>• `cpu` (int) - количество виртуальных процессоров<br>• `detailedInfo` (list) - список словарей с информацией об узлах; ключи словаря: `id` (int) - идентификатор ВМ, `name` (str) - имя ВМ, `status` (str) - статус ВМ, `techStatus` (str) - технический статус ВМ<br>• `disk` (int) - объём загрузочного диска<br>• `id` (int) - идентификатор группы<br>• `labels` (list) - список строк с labels<br>• `name` (str) - имя группы<br>• `num` (int) - количество узлов<br>• `ram` (int) - объём оперативной памяти<br>• `taints` (list) - список строк с taints
|
||||
| name | string | Имя кластера. |
|
||||
| rg_id | int | Идентификатор ресурсной группы. |
|
||||
| state | string | Статус кластера. |
|
||||
| techStatus | string | Технический статус кластера. |
|
||||
| vins_id | int | Идентификатор внутренней сети кластера. |
|
||||
|
||||
|
||||
## Пример использования модуля decort_k8s
|
||||
|
||||
|
||||
Пример создания кластера Kubernetes с именем `cluster-test` с получением Kuber config.
|
||||
```
|
||||
- name: Create a k8s cluster named cluster-test
|
||||
decort_k8s:
|
||||
authenticator: jwt
|
||||
controller_url: "https://ds1.digitalenergy.online"
|
||||
getConfig: true
|
||||
jwt: "{{ token.jwt }}"
|
||||
k8ci_id: 18
|
||||
name: cluster-test
|
||||
rg_id: 125
|
||||
workers:
|
||||
- cpu: 10
|
||||
disk: 10
|
||||
name: wg1
|
||||
num: 1
|
||||
pool: null
|
||||
ram: 1024
|
||||
sep_id: null
|
||||
- cpu: 10
|
||||
disk: 10
|
||||
name: wg2
|
||||
num: 2
|
||||
pool: null
|
||||
ram: 1024
|
||||
sep_id: null
|
||||
register: k8s_cluster
|
||||
```
|
||||
106
wiki/5.4.0/модуль-decort_kvmvm.md
Normal file
106
wiki/5.4.0/модуль-decort_kvmvm.md
Normal file
@@ -0,0 +1,106 @@
|
||||
# Модуль decort_kvmvm
|
||||
## Обзор модуля decort_kvmvm
|
||||
|
||||
Модуль **decort_kvmvm** предназначен для выполнения следующих действий над виртуальными машинами:
|
||||
- создать
|
||||
- получить информацию
|
||||
- остановить/приостановить/запустить
|
||||
- подключить/отключить диски с данными
|
||||
- подключить/отключить сети
|
||||
- изменить
|
||||
- объём загрузочного диска в большую сторону
|
||||
- количество CPU
|
||||
- объём ОЗУ
|
||||
- тэги
|
||||
- affinity метку
|
||||
- affinity правила
|
||||
- anti-affinity правила
|
||||
- удалить (безвозвратно)
|
||||
|
||||
## Параметры модуля decort_kvmvm
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля **decort_kvmvm**. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_kvmvm`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| aaff_rule | (list) | Список словарей, описывающих anti-affinity правила.<br>Ключи словаря:<br>• `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)<br>• `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`<br>• `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)<br>• `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила<br>• `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`)
|
||||
| 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>• `topology` (string) (обязательный) - назначение правила; значения: `node` (узел) или `compute` (ВМ)<br>• `policy` (string) (обязательный) - степень "необходимости" этого правила; значения: `RECOMMENDED` или `REQUIRED`<br>• `mode` (string) (обязательный) - режим сравнения; значения: `EQ` (должно соответствовать), `NE` (не должно соответствовать), `ANY` (любое)<br>• `key` (string) (обязательный) - ключ, который учитывается при анализе данного правила<br>• `value` (string) (обязательный) - значение ключа, учитываемого при анализе данного правила (зависит от ключа `mode`)
|
||||
| affinity_label | (str) | Метка affinity.
|
||||
| annotation | (string) | Опциональное описание виртуальной машины. Этот параметр используется только при создании.|
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_APP_ID`.|
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DCORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль **decort_kvmvm** будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
|
||||
| arch | (str)<br>Значения:<br/>`X86_64`<br>`PPC64_LE`<br>Default: `X86_64` | Архитектура виртуальной машины. |
|
||||
| authenticator | (str)<br>Значения:<br>`oauth2`<br>`jwt` | Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Обязательный параметр. |
|
||||
| boot_disk | (int) | Объём загрузочного диска виртуальной машины в ГБ. |
|
||||
| ci_user_data | (dict) | конфигурация для cloud-init
|
||||
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должен быть создан (или уже существует) данная виртуальная машина. Данный параметр является обязательным. |
|
||||
| cpu | (int) | Количество виртуальных процессоров, выделяемых виртуальной машине. |
|
||||
| data_disks | (list) | Список идентификаторов дисков, которые следует подключить к данной виртуальной машине как дополнительные. |
|
||||
| id | (int) | Уникальный цифровой идентификатор виртуальной машины. Этот параметр используется как один из методов идентификации существующей ВМ (альтернатива – по комбинации `name`, `rg_name` и `account_name`). Если при вызове модуля **decort_kvmvm** существующая ВМ идентифицируется по `id`, то параметры `account_id`, `account_name`, `rg_id` и `rg_name` игнорируются. |
|
||||
| image_id | (int) | Уникальный цифровой идентификатор образа, на базе которого следует создать виртуальную машину. При создании задать этот параметр или параметр `image_name`. При любых других операциях данные параметры игнорируются. Если заданы оба этих параметра (`image_id` и `image_name`), то `image_name` игнорируется. |
|
||||
| image_name | (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`.|
|
||||
| networks | (list) | Список словарей, описывающих сети для подключения к ВМ.<br>Ключи словаря:<br>• `type` (string) (обязательный) - тип сети; значения: `VINS` (внутренняя) или `EXTNET` (внешняя)<br>• `id` (int) (обязательный) - идентификатор сети<br>• `ip_addr` (string) (необязательный) - IP-адрес, используемый для подключения к данной сети. |
|
||||
| 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) | Словарь, пары ключ-значение которого, описывают тэги для ВМ. |
|
||||
| verify_ssl | (bool)<br>Default: `true` | Позволяет отключить проверку SSL сертификатов при выполнении API вызовов в адрес контроллера облачной инфраструктуры, например, при работе с изолированной облачной инфраструктурой, использующей самоподписанные сертификаты.<br>Применяйте данный параметр с осторожностью, предпочтительно в защищенных средах. |
|
||||
|
||||
## Возвращаемые значения модуля decort_kvmvm
|
||||
|
||||
Модуль **decort_kvmvm** возвращает информацию о виртуальной машине в виде словаря `facts` со следующими ключами:
|
||||
|
||||
|
||||
| Ключ | Тип данных | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | int | Идентификатор аккаунта. |
|
||||
| arch | string | Архитектура ВМ. |
|
||||
| cpu | int | Количество виртуальных процессоров. |
|
||||
| data_disks | list | Список идентификаторов дисков с данными, подключенных к ВМ. |
|
||||
| disk_size | int | Размер загрузочного диска в ГБ. |
|
||||
| id | int | Идентификатор ВМ. |
|
||||
| image_id | id | Идентификатор образа.
|
||||
| name | string | Имя ВМ. |
|
||||
| password | string | Пароль пользователя ОС по умолчанию. |
|
||||
| private_ips | list | Список IP-адресов на сетевых интерфейсах ВМ, которые подключены к внутренним сетям. |
|
||||
| public_ips | list | Список IP адресов на сетевых интерфейсах ВМ, которые подключены к внешним сетям. |
|
||||
| ram | int | Объём ОЗУ ВМ в МБ. |
|
||||
| rg_id | int | Идентификатор ресурсной группы, которой принадлежит данная ВМ. |
|
||||
| state | string | Состояние ВМ.|
|
||||
| tags | dict | Словарь, пары ключ-значение которого, описывают тэги ВМ.
|
||||
| tech_status | str | Технический статус ВМ.
|
||||
| username | string | Имя пользователя ОС по умолчанию. |
|
||||
|
||||
## Пример использования модуля decort_kvmvm
|
||||
|
||||
В данном примере создается ВМ с именем MyFirstVM.
|
||||
```
|
||||
- name: Сreate VM
|
||||
decort_kvmvm:
|
||||
app_id: "{{ my_app_id }}"
|
||||
app_secret: "{{ my_app_secret }}"
|
||||
authenticator: oauth2
|
||||
controller_url: "https://cloud.digitalenergy.online"
|
||||
cpu: 2
|
||||
image_id: "{{ my_img.facts.id }}"
|
||||
name: MyFirstVM
|
||||
networks:
|
||||
- type: VINS
|
||||
id: "{{ my_vins.facts.id }}"
|
||||
oauth2_url: "https://sso.digitalenergy.online"
|
||||
ram: 4096
|
||||
rg_id: "{{ my_rg.facts.id }}"
|
||||
register: my_vm
|
||||
```
|
||||
893
wiki/5.4.0/модуль-decort_lb.md
Normal file
893
wiki/5.4.0/модуль-decort_lb.md
Normal file
@@ -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">
|
||||
annotation
|
||||
</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>
|
||||
Cловарь, описывающий параметры по умолчанию для 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>
|
||||
Cловарь, описывающий параметры по умолчанию для 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>
|
||||
Cловарь, описывающий параметры 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>
|
||||
132
wiki/5.4.0/модуль-decort_osimage.md
Normal file
132
wiki/5.4.0/модуль-decort_osimage.md
Normal file
@@ -0,0 +1,132 @@
|
||||
# Модуль 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`. |
|
||||
| architecture | (string)<br>Default: `X86_64` | Архитектура микропроцессора, для которой предназначен образ. Используется при создании образа.|
|
||||
| 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
|
||||
```
|
||||
|
||||
76
wiki/5.4.0/модуль-decort_pfw.md
Normal file
76
wiki/5.4.0/модуль-decort_pfw.md
Normal file
@@ -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>• `local_port` (int) (обязательный) - внутренний порт; значения: от `1` до `65535`<br>• `proto` (str) (обязательный) - протокол; значения: `tcp` или `udp`<br>• `public_port_end` (int) (необязательный) - верхняя граница диапазона внешних портов; значения: от значения ключа `public_port_start` до `65535`;<br>• `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>• `id` (int) - идентификатор правила<br>• `localIp` (str) - IP-адрес ВМ<br>• `localPort` (int) - внутренний порт<br>• `protocol` (str) - протокол<br>• `publicPortEnd` (int) - верхняя граница диапазона внешних портов<br>• `publicPortStart` (int) - нижняя граница диапазона внешних портов<br>• `vmId` (int) - идентификатор ВМ<br>• `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 }}"
|
||||
```
|
||||
200
wiki/5.4.0/модуль-decort_rg.md
Normal file
200
wiki/5.4.0/модуль-decort_rg.md
Normal file
@@ -0,0 +1,200 @@
|
||||
# Модуль decort_rg
|
||||
|
||||
## Обзор модуля decort_rg
|
||||
|
||||
Модуль decort_rg предназначен для создания, редактирования и удаления ресурсных групп (Resource Group, RG) в облачной платформе DECORT, а также для получения информации об уже существующей ресурсной группе. Модуль decort_rg позволяет:
|
||||
|
||||
- создавать ресурсные группы
|
||||
- удалять ресурсные группы (в корзину или безвозвратно)
|
||||
- восстанавливать ресурсные группы из корзины
|
||||
- включать/отключать ресурсные группы
|
||||
- запрашивать информацию об уже существующих ресурсных группах
|
||||
- изменять ресурсные группы:
|
||||
- переименовывать
|
||||
- настраивать квоты
|
||||
- задавать стандартную сеть
|
||||
- настраивать права доступа для пользователей
|
||||
|
||||
## Параметры модуля decort_rg
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_rg. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой: `ansible-doc -t module decort_rg`
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
|----------|--------------------------|----------|
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то account_name игнорируется. |
|
||||
| account_name | (string) | Имя аккаунта, в рамках которого создаётся или уже существует данная ресурсная группа. Должно быть задано либо имя, либо идентификатор учётной записи (см. параметр `account_id`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется. |
|
||||
| access | (dict) | Параметр, позволяющий выдать, забрать или изменить права у пользователя в ресурсной группе. |
|
||||
| annotation | (string) | Текстовое описание ресурсной группы. Данный параметр является опциональным и учитывается только при создании ресурсной группы, а при всех прочих операциях игнорируется. |
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`. |
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме authenticator: oauth2. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения DECORT_APP_SECRET. |
|
||||
| authenticator | Значения:<br>`oauth2`<br>`jwt`| Режим аутентификации при подключении к контроллеру облачной платформы DECORT. Данный параметр является обязательным.|
|
||||
| controller_url | (string) | URL контроллера, соответствующего экземпляру облачной платформы DECORT, в рамках которого должна быть создана (или уже существует) данная ресурсная группа. Данный параметр является обязательным. |
|
||||
| def_netType | (string) <br>Значения:<br>`PRIVATE`<br>`PUBLIC`<br>`NONE`<br>Default: `PRIVATE` | Тип сети по умолчанию в ресурсной группе. Используется при создании ресурсной группы, а также при изменении. |
|
||||
| def_netId | (int) | Уникальный целочисленный идентификатор внутренней или внешней сети. Используется для изменения сети по умолчанию в ресурсной группе. |
|
||||
| extNetId | (int) | Уникальный целочисленный идентификатор внешней сети. Используется при создании РГ для подключения внешней сети к внутренней сети, которая будет создана и задана как сеть по умолчанию для РГ. |
|
||||
| extNetIp | (string) | IP-адрес для внешней сети, которая задана в параметре `extNetId`. |
|
||||
| owner | (string) | Владелец ресурсной группы. Задаётся при создании ресурсной группы, не обязателен. Если оставить пустое значение - владельцем ресурсной группы будет пользователь, создавший ресурсную группу. |
|
||||
| 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`. |
|
||||
| rename | (string) | Новое имя ресурсной группы. Используется при переименовании ресурсной группы. |
|
||||
| quotas | (dict) | Предназначено для задания или изменения квоты на ресурсы в составе данной ресурсной группы. |
|
||||
| rg_name | (string) | Имя ресурсной группы. Данный параметр является обязательным при создании. |
|
||||
| rg_id | (int) | Уникальный целочисленный идентификатор ресурсной группы. Является обязательным при изменении РГ если не заданы `rg_name` и `account_id`/`account_name` |
|
||||
| state | Значения:<br>`present`<br>`absent`<br>`enabled`<br>`disabled`<br>Default: `present` | Целевое состояние ресурсной группы. |
|
||||
| permanently | (bool)<br>Default: `false` | Параметр, использующийся при удалении ресурсной группы. При значении `true` - ресурсная группа удалится безвозвратно, а при `false` - попадёт в корзину. |
|
||||
| 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 | Список идентификаторов виртуальных машин ресурсной группы. |
|
||||
|
||||
## Пример использования модуля 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 }}"
|
||||
```
|
||||
120
wiki/5.4.0/модуль-decort_vins.md
Normal file
120
wiki/5.4.0/модуль-decort_vins.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# Модуль decort_vins
|
||||
## Обзор модуля decort_vins
|
||||
|
||||
Модуль decort_vins предназначен для управления внутренними сетями (Virtual Network Segment, ViNS) и позволяет производить с ними следующие действия:
|
||||
- создавать
|
||||
- на уровне ресурсной группы (если РГ задана)
|
||||
- на уровне аккаунта (если РГ не задана)
|
||||
- удалять (безвозвратно)
|
||||
- восстанавливать из корзины
|
||||
- запрашивать информацию
|
||||
- включать/отключать
|
||||
- соединять (необходимы права администратора)
|
||||
- изменять:
|
||||
- включать/отключать SSH-доступ к виртуальному маршрутизатору (необходимы права администратора)
|
||||
- включать/отключать режим **Custom Config** для виртуального маршрутизатора (необходимы права администратора)
|
||||
- сохранять конфигурацию виртуального маршрутизатора для возможности последующего отката к ней (необходимы права администратора)
|
||||
|
||||
## Параметры модуля decort_vins
|
||||
|
||||
Ниже в алфавитном порядке приведен полный список параметров для модуля decort_vins. Актуальную информацию по параметрам, которые поддерживает версия модуля, установленного на вашем Ansible-сервере, можно получить командой:
|
||||
`ansible-doc -t module decort_vins`
|
||||
|
||||
|
||||
| Параметр | Тип, допустимые значения | Описание |
|
||||
| ------ | ------ | ------ |
|
||||
| account_id | (int) | Уникальный целочисленный идентификатор аккаунта, которому принадлежит данная внутреняя сеть. При идентификации внутренней сети по имени (см. параметр `vins_name`) должен быть задан либо идентификатор, либо имя аккаунта (см. параметр `account_name`). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
| account_name | (string) | Имя аккаунта, которому принадлежит данная внутренняя сеть. При идентификации внутренней сети по имени (см. параметр `vins_name`) должно быть задано либо имя, либо идентификатор аккаунта (см. параметр account_id). Если одновременно заданы и `account_id`, и `account_name`, то `account_name` игнорируется.|
|
||||
|annotation | (string)| Текстовое описание внутренней сети. Данный аргумент является опциональным и учитывается только при создании внутренней сети, а при всех прочих операциях игнорируется.|
|
||||
| app_id | (string) | Идентификатор приложения, использующийся для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Если параметр не задан в playbook, модуль будет использовать значение переменной окружения `DECORT_APP_ID`.|
|
||||
| app_secret | (string) | Секретный ключ приложения, который используется для подключения к контроллеру облачной платформы DECORT в режиме `authenticator: oauth2`. Данный параметр является обязательным для указанного режима. Так как он содержит секретную информацию, то его не рекомендуется задавать непосредственно в playbook. Если параметр не задан в playbook, то модуль будет использовать значение переменной окружения `DECORT_APP_SECRET`.|
|
||||
| authenticator | Значения:<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
|
||||
|
||||
```
|
||||
|
||||
|
||||
22
wiki/5.5.0/Home.md
Normal file
22
wiki/5.5.0/Home.md
Normal file
@@ -0,0 +1,22 @@
|
||||
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) - управление аккаунтами
|
||||
182
wiki/5.5.0/введение.md
Normal file
182
wiki/5.5.0/введение.md
Normal file
@@ -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.0.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 }}"
|
||||
```
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user