Скрипт автоматического удаления инфраструктуры, созданной с помощью openstack cli, используя исходный скрипт установки.
Скрипт анализирует файл с командами openstack create
, извлекает типы ресурсов и удаляет их в порядке, обратном установки, чтобы избежать ошибок.
openstack ... create
из файлаopenstack <type> delete <name>
--image
, --network
, --port
)--insecure
Операции управления пользователями, само собой, будут работать только от admin пользователя облака.
#!/bin/bash
source ./cloud-vars.conf
openstack domain create Domain1 --insecure
openstack project create Project1 --domain Domain1 --insecure
openstack user create --password 'P@ssw0rd' --domain Domain1 User1 --insecure
openstack network create net1 --insecure
#!/bin/bash
export OS_AUTH_URL=https://10.0.0.81:5000/v3/
export OS_PROJECT_NAME="admin"
export OS_USER_DOMAIN_NAME="Default"
export OS_PROJECT_DOMAIN_ID="default"
export OS_USERNAME="admin"
export OS_PASSWORD=password
Немного подробнее о переменных, актуальных для Кибер Инфраструктуры тут.
Дабы скрипт мог нормально воспринимать команды создания и далее переделать их в команды удаления, необходимо хотя бы немного думать о их читаемости.
Стоит указывать имя создаваемого объекта с помощью --name, либо в конце команды, например:
openstack user create --password 'P@ssw0rd' --domain Domain1 User1 --insecure
Флаг --insecure, в данном контексте, ни на что не влияет, его можно указывать где угодно.
В целом, любой help от openstack cli выдаст именно такие же хотелки, но от неверного порядка cli не сломается, а вот скрипт иногда может не удалять объект.
openstack user create
usage: openstack user create [-h] [-f {json,shell,table,value,yaml}] [-c COLUMN] [--noindent] [--prefix PREFIX] [--max-width <integer>] [--fit-width] [--print-empty] [--domain <domain>] [--project <project>] [--project-domain <project-domain>]
[--password <password>] [--password-prompt] [--email <email-address>] [--description <description>] [--ignore-lockout-failure-attempts] [--no-ignore-lockout-failure-attempts] [--ignore-password-expiry] [--no-ignore-password-expiry]
[--ignore-change-password-upon-first-use] [--no-ignore-change-password-upon-first-use] [--enable-lock-password] [--disable-lock-password] [--enable-multi-factor-auth] [--disable-multi-factor-auth] [--multi-factor-auth-rule <rule>]
[--enable | --disable] [--or-show]
<name>
Если к какой-либо команде cli не поддерживает <name>
, но поддерживает --name, то рекомендую указать его, так скрипт точно правильно найдет объект.
Так, например при создании пула балансировки:
openstack loadbalancer pool create --name lb1_pool1 --lb-algorithm ROUND_ROBIN --protocol HTTPS --loadbalancer lb1
Каким-либо способом качаем uninstall.sh с github репозитория.
Для удобства даем права на выполнение:
chmod +x ./uninstall.sh
Если облако не доверенное, то необходимо указать переменной INSECURE опцию --insecure в скрипте удаления следующим образом:
INSECURE=--insecure
Так же, если необходимо удалять пользователей из домена, но без удаления домена (в скрипте установки не должно быть создания домена!), необходимо указать опцию в начале скрипта удаления:
DOMAIN='--domain Domain1'
Далее использование простейшее:
./uninstall.sh <файл_переменных> <файл_установки>
Например:
./uninstall.sh cloud-vars.conf install.sh
Тестировалось всё на следующем скрипте установки:
#!/bin/bash
source ./cloud-vars.conf
openstack domain create Domain1 --insecure
openstack project create Project1 --domain Domain1 --insecure
openstack user create User1 --password 'P@ssw0rd' --domain Domain1 --insecure
USER_ID=$(openstack user list --insecure --domain Domain1 | grep User1 | awk -F '|' '{print$2}' | awk -F ' ' '{print$1}')
openstack role add --user "$USER_ID" --project Project1 admin --insecure
openstack network create net1 --insecure
openstack subnet create --dhcp --subnet-range 10.21.1.0/24 --allocation-pool start=10.21.1.10,end=10.21.1.210 --gateway 10.21.1.1 --network net1 net1_subnet1 --insecure
openstack network create net2 --insecure
openstack subnet create --dhcp --subnet-range 10.22.1.0/24 --allocation-pool start=10.22.1.10,end=10.22.1.210 --gateway 10.22.1.1 --network net2 net2_subnet1 --insecure
openstack router create --enable-snat --external-gateway public router1 --insecure
openstack port create --network net1 --fixed-ip subnet=net1_subnet1,ip-address=10.21.1.1 router1_port1 --insecure
openstack router add port router1 router1_port1 --insecure
ROUTER1_EXT_IP=$(openstack router show router1 --insecure -c external_gateway_info -f yaml | grep ip_address | awk -F ' ' '{print$3}')
openstack router create --enable-snat --external-gateway public router2 --insecure
openstack port create --network net2 --fixed-ip subnet=net2_subnet1,ip-address=10.22.1.1 router2_port1 --insecure
openstack router add port router2 router2_port1 --insecure
openstack router set --route destination=10.21.1.0/24,gateway=$ROUTER1_EXT_IP router2 --insecure
openstack port create --network net1 --fixed-ip subnet=net1_subnet1,ip-address=10.21.1.211 vm1_port1 --insecure
openstack keypair create --public-key ~/.ssh/id_rsa.pub CloudVMKey1 --insecure
openstack server create --image alt-p10-cloud-x86_64 --boot-from-volume 10 --port vm1_port1 --flavor small --key-name CloudVMKey1 server1 --insecure
openstack floating ip create --port vm1_port1 public --insecure
openstack port create --network net2 --fixed-ip subnet=net2_subnet1,ip-address=10.22.1.211 vm2_port1 --insecure
openstack server create --image alt-p10-cloud-x86_64 --boot-from-volume 10 --port vm2_port1 --flavor small --key-name CloudVMKey1 server2 --insecure
openstack floating ip create --port vm2_port1 public --insecure
openstack port create --network net2 --fixed-ip subnet=net2_subnet1,ip-address=10.22.1.221 lb1_port1 --insecure
openstack loadbalancer create --name lb1 --vip-port-id lb1_port1 --insecure --wait
openstack loadbalancer pool create --name lb1_pool1 --lb-algorithm ROUND_ROBIN --protocol HTTPS --loadbalancer lb1 --insecure
openstack loadbalancer member create --address 10.21.1.211 --protocol-port 443 --name member1_lb1 lb1_pool1 --insecure
openstack loadbalancer member create --address 10.22.1.211 --protocol-port 443 --name member2_lb1 lb1_pool1 --insecure
openstack loadbalancer listener create --protocol HTTPS --protocol-port 443 --default-pool lb1_pool1 lb1 --insecure
openstack floating ip create --port lb1_port1 public --insecure
openstack volume create --image alt-p10-cloud-x86_64 --size 10 volume1 --insecure
openstack server add volume server2 volume1 --device /dev/sdv --insecure
openstack security group create sg1 --insecure
openstack security group rule create --ingress --protocol tcp --dst-port 44 sg1 --insecure
openstack port set --security-group sg1 vm1_port1 --insecure
В данном случае всё отрабатывалось успешно.