Собираетесь мигрировать в облако, но не знаете, с чего начать? Уже готовы сделать этот ответственный шаг или вплотную задумываетесь о том, чтобы перейти в виртуальную среду?
Наверняка вы уже задали себе вопрос вроде: «А что делать, если уже куплены лицензии Windows, RHEL, Suse?» или, например, «Как эффективно протестировать функциональность, которую мы хотим предоставить из облачной среды?»
Ответ очевиден. Необходимо самостоятельно устанавливать собственные операционные системы и готовить из них шаблоны — эталонные конфигурации серверов.
Преимущества подготовки шаблонов
- Во-первых, это быстрый старт. Можно использовать сервера автоматической установки или системы централизованного управления конфигурацией, но установка сервера из шаблона выполняется гораздо быстрее.
- Во-вторых, шаблоны дают стабильную и контролируемую конфигурацию. Для отладки или тестирования нового функционала не изменяющаяся конфигурация сервера и версии ПО будут очень кстати. Особенно это может быть полезно для проектов, где ведется активная разработка собственного ПО.
- В-третьих, использование шаблонов позволит быстро масштабироваться, просто запуская необходимое количество новых однотипных серверов.
- В-четвертых, шаблоны часто применяются в процессе переноса физических серверов в облачное окружение или любую другую виртуальную среду.
Создаём первый шаблон на Linux
Ниже — про Linux-шаблон, автоматическую генерацию пароля, вывод его на консоль при загрузке ОС, плюс про то, как подойти к выполнению других автоматических действий во время разворачивания нового виртуального сервера в облачной инфраструктуре. Про Windows-решения, если интересно, будет позже.
Для примера используется наше облако (КРОК), но механики работают со всеми амазон-совместимыми облаками.
1. Установка операционной системы с собственного диска.
Перед тем, как выполнить установку необходимого вам Linux дистрибутива, необходимо загрузить iso-образ установочного диска в файловое хранилище. Для этого мы воспользуемся специальным скриптом c2-s3curl (http://storage.cloud.croc.ru/tools/c2-s3curl), который предназначен для выполнения основных файловых операций с нашим S3-совместимым хранилищем.
root@c-jenkins:~# c2-s3curl --put my-bucket/rhel-server-6.1-x86_64-dvd.iso rhel-server-6.1-x86_64-dvd.iso
Uploading object: my-bucket/rhel-server-6.1-x86_64-dvd.iso
######################################################################## 100.0%
OK
Процесс установки продемонстрируем на примере загруженного в файловое хранилище образа дистрибутива RedHat Enterprise Linux 6.1. После загрузки iso-файла необходимо создать образ диска, который будет использоваться для установки:
Установка нового виртуального сервера состоит из двух шагов: выбора образа установочного диска и размера системного диска, а также выбора параметров виртуального сервера и сетей. На первом шаге выберем создание нового экземпляра:
На втором шаге настраивается окружение и параметры нового виртуального сервера. Оставим все параметры по умолчанию, изменив только тип экземпляра, чем добавим серверу немного ресурсов, чтобы установка прошла быстрее.
После запуска нового экземпляра, воспользуемся удаленной консолью для проведения процесса установки (имена виртуальных сетей и IP-информация о сервере удалены из иллюстрации):
Установим ОС (подробно останавливаться не будем):
После окончания установки у вас есть возможность зайти в систему с указанными во время установки логином и паролем, после чего будет необходимо выполнить все необходимые для шаблона настройки операционной системы.
Создание собственного Linux-шаблона
Удаляем из udev правила создания сетевых интерфейсов:
root@localhost:~# rm -Rf /etc/udev/rules.d/70-persistent-net.rules
Этот шаг необходим, чтобы после старта нового виртуального сервера из шаблона, операционная система пересоздавала сетевые интерфейсы, получая от гипервизора новую информацию о MAC-адресах.
Затем нужно отредактировать информацию о первом сетевом интерфейсе, который обычно подключается к виртуальной сети, где работает DHCP сервер:
[root@ i-F98949C2 ~]# cat >> /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
DEVICE="eth0"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
EOF
Без этого шага созданный из шаблона сервер не получит от облака сетевых настроек и подключиться к нему будет невозможно.
Теперь убедитесь, что SSH-сервер будет запускаться при загрузке операционной системы.
[root@@ i-F98949C2~]# chkconfig --list | grep ssh
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Потом — что фаервол операционой системы пропускает подключения к SSH-серверу. В некоторых случаях его можно совсем отключить, так как для каждой виртуальной сети в нашем облаке у вас уже работает фаервол, который блокирует абсолютно весь входящий трафик.
Следующий шаг — установим автоматическую генерацию пароля администратора при каждом старте нового сервера.
[root@ i-F98949C2 ~]# cat >> /etc/rc.local << EOF
sh /usr/sbin/set-ssh-key.sh
EOF
Содержимое файла /usr/sbin/set-ssh-key.sh
#!/bin/sh
if [ -f /etc/.ssh_done ]; then
exit 0
fi
getpw()
{
echo `pwqgen`
}
if [ $? -eq 0 ]; then
PWRES=1
while [ $PWRES -eq 1 ];
do
ROOT_PW=$(getpw)
echo $ROOT_PW | passwd root --stdin > /dev/null 2>&1
PWRES=$?
done
echo ""
echo "$ROOT_PW" > /dev/ttyS0
fi
touch /etc/.ssh_done
Этот шаг позволит каждому новому создаваемому из вашего шаблона серверу генерировать пароль для пользователя root и выдавать его на серийную консоль сервера:
Передача дополнительных параметров виртуальному серверу
Поле «пользовательские данные» на третьем рисунке (этап создания нового виртуального сервера) предназначено для передачи вашим серверам дополнительных параметров, инструкций или любой другой информации на этапе создания нового виртуального сервера. Получить информацию из данного поля или записать её туда можно в течение всего жизненного цикла виртуального сервера. Для этого необходимо использовать любую утилиту, позволяющую получать доступ к Amazon-совместимому API нашего облака. В этой статье мы для этих целей будем использовать утилиту boto и небольшой скрипт, иллюстрирующий работу с нашим облачным API:
#!/usr/bin/env python
import sys
import os
from boto.ec2.connection import EC2Connection
import boto
import boto.ec2
from operator import attrgetter
from optparse import OptionParser
from boto.ec2.blockdevicemapping import BlockDeviceType
from boto.ec2.blockdevicemapping import BlockDeviceMapping
from pprint import pprint
import time
import base64
import logging
global region
global conn
AWS_ACCESS_KEY_ID = os.environ['EC2_ACCESS_KEY']
AWS_SECRET_ACCESS_KEY = os.environ['EC2_SECRET_KEY']
logging.basicConfig(filename="boto.log", level=logging.DEBUG)
region = boto.ec2.regioninfo.RegionInfo(name="ru-msk-vol51", endpoint="console.cloud.croc.ru")
conn = boto.connect_ec2(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,
is_secure=False,
region=region,
path="/services/cloud")
def getInstanceUserData(ami):
reservations = conn.get_all_instances()
instances = [i for r in reservations for i in r.instances]
for i in instances:
if (i.__dict__['id'] == ami):
return base64.b64decode(i.get_attribute('userData')['userData'])
return ''
def setInstanceUserData(ami, userData=''):
conn.modify_instance_attribute(ami, 'userData', base64.b64encode(userData))
''' Иллюстрируем работу функций '''
setInstanceUserData('i-9A4D0DDF','test!!!!')
print getInstanceUserData('i-9A4D0DDF')
Дополнительный вариант использования данного поля — это возможность изменения пароля административной учетной записи, если пароль был по каким-то причинам забыт или потерян, а также установка дополнительного программного обеспечения или любая другая настройка вашего шаблона. Детальнее можно рассмотреть отдельно, если интересно, тема очень большая.
Резюме
Облака — удобные. Удобства начинаются с эталонных инсталляций — шаблонов. Шаблоны нужны, чтобы не конфигурировать руками каждый раз сервера, иметь возможность использовать свои дистрибутивы со своими лицензиями, экономить время, защищаться от ошибок и вообще стандартизировать процессы. Один такой шаблон мы только что создали.
В комментариях c удовольствием отвечу на вопросы по данной части работы в облаке.
Автор: maksimov_andrei