Снимок Openstack создание и восстановление сценариев с помощью команд bash - PullRequest
0 голосов
/ 03 октября 2019

Прежде всего меня поражает, что так мало информации о openstack и примерах сценариев, но у меня нет вопроса

Я хочу создать снимок и простой способ восстановить снимок. Поскольку наш хостинг-провайдер использует базовое хранилище, я не могу использовать команду rebuild, поэтому мне нужно уничтожить работающий vm и воссоздать его с образом снимка в качестве базы. Создание образа работает только тогда, когда вся информация о работающем vm предоставляется в качестве входных параметров, и здесь возникают проблемы, которые у меня есть.

необходимая информация предоставляется 3 командами

command1: nova show Вывод: + -------------------------------------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ + |Недвижимость |Значение |+ -------------------------------------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------- + |NWFINFRA_1600 сеть |10.0.0.39 ||OS-DCF: diskConfig |РУКОВОДСТВО ||OS-EXT-AZ: доступность_зона |gn3a ||OS-EXT-STS: power_state |1 ||OS-EXT-STS: task_state |- ||OS-EXT-STS: vm_state |активный ||OS-SRV-USG: launch_at |2019-10-02T14: 25: 21.000000 ||OS-SRV-USG: terminated_at |- ||accessIPv4 |||accessIPv6 |||config_drive |||создано |2019-10-02T14: 25: 05Z ||описание |- ||вкус: диск |0 ||вкус: эфемерный |0 ||вкус: extra_specs |{"ostype": "win", "hw: cpu_cores": "1", "hw: cpu_sockets": "2"} ||вкус: оригинальное_имя |win.2large ||вкус: баран |8192 ||вкус: обмен |0 ||вкус: vcpus |2 ||hostId |18aa94c61106a53b2d9e672e93619a6fce76abb1ee6ba9da471491f9 ||id |70941fbf-9143-4f1c-a5e7-979f818ace23 ||изображение |IFW039-InstanceSnapshot (8ee1104d-55e4-4c99-93e5-ceb4a53ce13f) ||имя_ключа |- ||заблокирован |Ложь ||метаданные |{} ||имя |IWF039 ||os-extended-объемы: volume_attached |[{"id": "1134fe12-777b-4c26-ac2b-e6ecb6ad4f70", "delete_on_termination": false}, {"id": "f610a46e-46ad-460f-81b3-e2b34acfbbfc", "delete_on_termination": false}]] ||прогресс |0 ||статус |ACTIVE ||теги |[] ||tenant_id |4c15fd467dde4bd6a25427d6bab64a7f ||trust_image_certificates |- ||обновлено |2019-10-02T14: 25: 21Z ||user_id |ddff2ce854114bef873bac9a1476805e |+ -------------------------------------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------- +

Команда 2: ./Scripts/openstack port show NWFINFRA_1600_IWF039, где NWFINFRA_1600_IWF039 - это комбинация предыдущего вывода сети NWFINFRA_1600 и имени сервера IWF039 Вывод: + ------------------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------- + |Поле |Значение |+ ------------------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------- + |admin_state_up |UP ||allow_address_pairs |||binding_host_id |Нет ||binding_profile |Нет ||binding_vif_details |Нет ||binding_vif_type |Нет ||binding_vnic_type |нормальный ||создал_ат |2019-10-02T06: 49: 08Z ||data_plane_status |Нет ||описание |||идентификатор_устройства |70941fbf-9143-4f1c-a5e7-979f818ace23 ||устройство_владелец |вычислить: gn3a ||dns_assignment |fqdn = 'iwf039.rijkscloud.local.', hostname = 'iwf039', ip_address = '10 .0.0.39 '||dns_domain |||dns_name |iwf039 ||extra_dhcp_opts |||fixed_ips |ip_address = '10 .0.0.39 ', subnet_id =' 3298e8d0-b317-465c-8757-c1a4f2cad298 '||id |b49a7d3a-bb0d-49cb-a04b-64c5dbf9df20 ||местоположение |cloud = '', project.domain_id = 'default', project.domain_name =, project.id = '4c15fd467dde4bd6a25427d6bab64a7f', project.name = 'vws-pgb', region_name = 'Groningen3', zone = ||mac_address |fa: 16: 3e: 99: cc: 3c ||имя |NWFINFRA_1600_IWF039 ||network_id |450dcc7a-5e55-4e38-9f4e-de9a9c685502 ||port_security_enabled |Ложь ||идентификатор_проекта |4c15fd467dde4bd6a25427d6bab64a7f ||пропагат_uplink_status |Нет ||qos_policy_id |Нет ||resource_request |Нет ||номер редакции |15 ||security_group_ids |||статус |ACTIVE ||теги |||trunk_details |Нет ||updated_at |2019-10-03T11: 10:00 |+ ------------------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------- +

сэти выходные данные я могу создать команду сборки для восстановления снимка: nova boot --poll --flavor win.2large --image IFW039-InstanceSnapshot --security-groups default --availability-zone gn3a --nic net-id = 450dcc7a-5e55-4e38-9f4e-de9a9c685502 IWF039

примечание: изображение - это имя созданного снимка

Я пытаюсь создать сценарий, чтобы у меня был простой снимоксоздать и восстановить процедуру

, но я застрял на макете таблицы вывода. Это действительно хорошо, но я не могу использовать его в своем скрипте для перенаправления вывода во входные переменные.

Я пытался использовать это: {read foo;читать имя ID MAC IP-статус;} <<(./ Сценарии / список портов openstack --server IWF039 | sed 's / + -------------------------------------- + ---------------------- + ------------------- + -------------------------------------------------------------------------- + -------- + // '| sed's / | // '| sed' s / MAC-адрес / MAC / '| sed' s / Фиксированные IP-адреса / IP / ') </p>

Но переменные получают содержимое типа' | 'char и т. д.

Итак, echo $ Name дает '|'

Должен быть более простой способ, но я не могу его увидеть.

Пожалуйста, помогите ...

Мне удалось заставить его почти работать, используя awkвместо grep:

теперь у меня есть этот код: #/bin/bash # # Query needed variables # echo -e "\nQuery needed information" NETWORK=$(nova show IWF039 | awk '/network/ {print $2}') ZONE=$(nova show IWF039 | awk '/OS-EXT-AZ:availability_zone/ {print $4}') FLAVOR=$(nova show IWF039 | awk '/flavor:original_name/ {print $4}') SERVERID=$(nova show IWF039 | awk -F '|' '/id/ {print $3; exit}') NETWORKPORT=$(nova interface-list IWF039 | awk -F '|' '/ACTIVE/ {print $3}') # Print out variables echo "network: $NETWORK" echo "zone: $ZONE" echo "flavor: $FLAVOR" echo "server_id: $SERVERID" echo "network_port_id: $NETWORKPORT" # Remove current instance echo -e "\nRemove current instance" nova delete $SERVERID # Rebuild instance from snapshot image echo -e "\nRebuild instance from snapshot" nova boot --poll --flavor $FLAVOR --image IFW039-InstanceSnapshot2 --security-groups default --availability-zone $ZONE --nic port-id=$NETWORKPORT IWF039

Если я запускаю скрипт, последний элемент, однако, например, IWF039, который является именем экземпляра, который я хочу использовать, выдает мнеошибка: ошибка: нераспознанные аргументы: IWF039

кто-нибудь может сказать мне, почему?

Если я запускаю строку в командной строке, она работает, только не из сценария bash

1 Ответ

0 голосов
/ 18 октября 2019
#/bin/bash

#
# Script restores snapshot created in OpenStack
# Script created by Lex IT, Alex Flora
# usage: snapshot-restore.sh <snapshot image name> <server name to restore to>
# to use: make sure to install the following python openstack modules: 
# pip install python-openstackclient python-keystoneclient python-glanceclient python-novaclient python-neutronclient
#


#
# Query needed variables
#

if [ "$#" -eq  "0" ]
    then
        echo -e "usage: restore_snapshot <name of snapshot> <name of server>"
        echo -e "Querying available snapshots, one moment please ..."
        glance image-list

        echo -e "\n\033[0;33mGive name of snapshot to restore"
        echo -e "\033[0m"
        read SNAPSHOT

        echo -e "\n\033[0;33mGive server name to restore"
        echo -e "\033[0m"
        read SERVER
    else
        SNAPSHOT=$1
        SERVER=$2
fi

echo -e "\n\033[0mQuery needed server information from server $SERVER, one moment please ..."
NETWORK=$(nova show IWF039 | awk '/network/ {print $2}' | sed -e 's/^[[:space:]]*//')
ZONE=$(nova show IWF039 | awk '/OS-EXT-AZ:availability_zone/ {print $4}' | sed -e 's/^[[:space:]]*//')
FLAVOR=$(nova show IWF039 | awk '/flavor:original_name/ {print $4}' | sed -e 's/^[[:space:]]*//')
SERVERID=$(nova show IWF039 | awk -F '|' '/\<id\>/ {print $3; exit}' | sed -e 's/^[[:space:]]*//')
NETWORKPORT=$(nova interface-list IWF039 | awk -F '|' '/ACTIVE/ {print $3}' | sed -e 's/^[[:space:]]*//')

# Print out variables
echo -e "\033[0mnetwork: \033[0;32m$NETWORK"
echo -e "\033[0mzone: \033[0;32m$ZONE"
echo -e "\033[0mflavor: \033[0;32m$FLAVOR"
echo -e "\033[0mserver_id: \033[0;32m$SERVERID"
echo -e "\033[0mnetwork_port_id: \033[0;32m$NETWORKPORT"
echo -e "\033[0mSnapshot image: \033[0;32m$SNAPSHOT"
echo -e "\033[0mServer naam: \033[0;32m$SERVER"

# Ask confirmation
echo -e "\n\033[0mGoing to restore snapshot image $SNAPSHOT to server $SERVER"
read -p "Is this correct (y/n) ? " -n 1 -r

if [[ $REPLY =~ ^[Yy]$ ]]
then
    # Remove current instance
    echo -e "\n\033[0mRemove current instance"
    nova delete $SERVERID
    sleep 3
    # Rebuild instance from snapshot image
    echo -e "\nRebuild instance from snapshot using command:"
    echo -e "\033[0mnova boot --poll --flavor $FLAVOR --image $SNAPSHOT --security-groups default --availability-zone $ZONE --nic port-id=$NETWORKPORT $SERVER"
    nova boot --poll --flavor $FLAVOR --image $SNAPSHOT --security-groups default --availability-zone $ZONE --nic port-id=$NETWORKPORT $SERVER
fi 

Это мой полный сценарий. Проблема заключалась в том, что вывод содержал пробелы перед строкой. Я решил эту проблему с помощью следующей команды sed: sed -e 's/^[[:space:]]*//'

Надеюсь, кто-то использует скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...