Чтобы обеспечить возможность использования функции инъекции пользовательских данных для введения начальной настраиваемой информации в экземпляры ECS, созданные из частного образа (например, установка пароля входа в систему для ECSECS), установите Cloud-Init на экземпляр ECSECS, используемый для создания образа.
Cloud-Init является открытым программным обеспечением. Если установлена версия с уязвимостью безопасности, рекомендуется обновить ее до последней версии.
Подробности см. в разделе Проверка наличия установленной программы Cloud-Init.
Вы можете установить Cloud-Init одним из следующих способов: (Рекомендуется) Установите Cloud-Init из официального репозиторияили установите Cloud-Init с использованием пакета исходного кода с официального сайта через pip.
Выполните описанные здесь действия, чтобы проверить наличие установленной программы Cloud-Init. Методы проверки зависят от типа ОС.
which cloud-init
/usr/bin/cloud-init
/usr/bin/which: no cloud-init in (/usr/local/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)
which cloud-init
cloud-init-0.7.5-10.el6.centos.2.x86_64
Чтобы убедиться, что Cloud-Init действительно не установлен, рекомендуем выполнить проверку снова командой rpm -qa |grep cloud-init. Если хотя бы одна из команд which cloud-init и rpm -qa |grep cloud-init показывает, что Cloud-Init установлен, значит он установлен.
Если Cloud-Init уже установлен, выполните следующие действия:
cd /root/.ssh
rm authorized_keys
cd /home/centos/.ssh
rm authorized_keys
После завершения операций не перезагружайте экземпляр ECSECS. Иначе вам придется повторить эти операции заново.
Метод установки Cloud-Init на экземпляр ECSECSзависит от операционной системы. Выполняйте операции установки под пользователем rootroot.
Далее описан способ установки Cloud-Init на экземпляре ECS под управлением SUSE Linux, CentOS, Fedora, Debian и Ubuntu. Для других типов операционных систем установите требуемую версию Cloud-Init. Например, на экземплярах ECS под управлением CoreOS потребуется установить coreos-cloudinit.
URL сетевого хранилища пакетов Cloud-Init для SUSE Linux
Выберите пакет из репозитория в зависимости от версии вашей ОС.
Возьмем в качестве примера сервер SUSE Enterprise Linux Server 12. Выполните следующие шаги, чтобы установить Cloud-Init:
zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_12_SP3/Cloud:Tools.repo
zypper refresh
zypper install cloud-init
chkconfig cloud-init-local on; chkconfig cloud-init on; chkconfig cloud-config on; chkconfig cloud-final on
service cloud-init-local status; service cloud-init status; service cloud-config status; service cloud-final status
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
Для SUSE и openSUSE выполните следующие действия, чтобы предотвратить изменение имени хоста через DHCP:
vi etc/sysconfig/network/dhcp
Таблица 1 содержит ссылки на сетевые репозитории установки Cloud-Init для CentOS. Откройте ссылку и выберите пакет epel-release для своей операционной системы.
Тип ОС | Версия | Адрес |
|---|---|---|
CentOS | 6 32-разрядный | |
6 64-разрядный | ||
7 64-разрядный |
yum install network-installation-repository-URL/epel-release-x-y.noarch.rpm
yum install cloud-init
network-installation-repository-URL указывает место, где можно получить установочный пакет epel-release для Cloud-Init. x-y обозначает версию пакета epel-release для Cloud-Init, требуемую текущей ОС. Замените эти параметры фактическими значениями согласно Таблице 1.
yum install https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
Перед установкой Cloud-Init убедитесь, что сетевой адрес репозитория установлен для вашей ОС, проверив наличие адреса репозитория пакета Cloud-Init в файле /etc/yum.repo.d/fedora.repo. Если адрес отсутствует, настройте его, следуя инструкциям на официальном сайте Fedora.
yum install cloud-init
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
Перед установкой Cloud-Init убедитесь, что сетевой адрес репозитория установлен для вашей ОС, проверив наличие адреса репозитория пакета Cloud-Init в файле /etc/apt/sources.list. Если адрес отсутствует, настройте его, следуя инструкциям на официальных сайтах Debian или Ubuntu.
apt-get update
apt-get install cloud-init
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
Далее приведены операции с примером использования Cloud-Init 0.7.9, описывающие процесс установки Cloud-Init.
Загрузите cloud-init-0.7.9.tar.gz из следующего пути:
Если каталог ~/.pip/ отсутствует, выполните команду mkdir ~/.pip для создания.
[global]index-url = https://<$mirror><$mirror>/simple/trusted-host = <$mirror><$mirror>
Замените <$mirror> на общедоступный источник PyPI.
Источник общедоступной сети PyPI: https://pypi.python.org/
pip install [--upgrade] /home/cloud-init-0.7.9.tar.gz
Для получения дополнительной информации о том, как установить пакет исходного кода Cloud-Init, см. документацию Cloud-Init Documentation.
cloud-init 0.7.9
chkconfig --add cloud-init-local; chkconfig --add cloud-init; chkconfig --add cloud-config; chkconfig --add cloud-final
chkconfig cloud-init-local on; chkconfig cloud-init on; chkconfig cloud-config on; chkconfig cloud-final on
service cloud-init-local status; service cloud-init status; service cloud-config status; service cloud-final status
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
При установке Cloud-Init с использованием официального пакета исходного кода и pip обратите внимание, что:
useradd syslog
groupadd adm
usermod -g adm syslog
Выполните следующую команду, чтобы открыть файл sshd_config с помощью редактора vi:
vi /etc/ssh/sshd_config
Для SUSE и openSUSE измените значения следующих параметров в файле sshd_config на no:
vi /etc/cloud/cloud.cfg
Этот шаг актуален только для версии Cloud-Init 18.3 или более поздней.
Рисунок 1 Пример конфигурации

Для Ubuntu и Debian установите значение параметра manage_etc_hosts в файле /etc/cloud/cloud.cfg равным localhost. Иначе переключение на пользователя root может завершиться тайм-аутом. Подробности о том, как изменить имя хоста облачного сервера, настроить ключ SSH, использовать Cloud-Init для добавления пользователя и настройки разделов подкачки, см. в разделе Cloud-Init Configuration FAQ.
Возьмем Ubuntu в качестве примера.
cat /etc/cloud/set_linux_random_password.sh
Содержимое файла выглядит следующим образом:
#!/bin/bash#!/bin/bashpassword=$(cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%&+=' | head -c 9)password=$(cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%&+=' | head -c 9)echo "linux:$password" | chpasswdecho "linux:$password" | chpasswdsed -i -e '/^Login/d' /etc/issuesed -i -e '/^Login/d' /etc/issuesed -i -e '/^Initial/d' /etc/issuesed -i -e '/^Initial/d' /etc/issuesed -i -c -e '/^$/d' /etc/issuesed -i -c -e '/^$/d' /etc/issueecho -e "\nInitial login with linux:$password\n" >> /etc/issueecho -e "\nInitial login with linux:$password\n" >> /etc/issue
Вы можете выполнить команду chmod +x /etc/cloud/set_linux_random_password.sh для предоставления прав выполнения set_linux_random_password.sh.
echo -e '\e[1;31m#################################\\e[0m' > /etc/motd
echo -e '\e[1;31m# Important !!! #\e[0m' >> /etc/motd
echo -e '\e[1;31m# Please change password for user linux after first login. #\e[0m' >> /etc/motd
echo -e '\e[1;31m#################################\e[0m' >> /etc/motd
echo -e '' >> /etc/motd
Убедитесь, что формат конфигурационного файла (такой как выравнивание и пробелы) совпадает с приведенным примером.
system_info:# Это повлияет на то, какой класс дистрибутива будет использованdistro: rhel# Имя пользователя по умолчанию + группы этого пользователя по умолчанию (если задано/используется)default_user:name: linuxname: linux #Имя пользователя для входаlock_passwd: Falselock_passwd: False #Разрешен вход с использованием пароля. Обратите внимание, что некоторые ОС используют значение 00 для включения входа по паролю.gecos: Cloud Usergroups: usersgroups: users #Необязательно. Добавляйте пользователей в другие группы, которые были настроены в /etc/group/etc/group.passwd: $6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0passwd: $6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0sudo: ["ALL=(ALL) NOPASSWD:ALL"] sudo: ["ALL=(ALL) NOPASSWD:ALL"] # Назначает права rootroot этому пользователю.shell: /bin/bashshell: /bin/bash # Выполняйте оболочку в режиме bash.# Другая конфигурация здесь будет передана классу дистрибутивов и/или классов путейpaths:cloud_dir: /var/lib/cloud/templates_dir: /etc/cloud/templates/ssh_svcname: sshdbootcmd:bootcmd:- [cloud-init-per, instance, password, bash, - [cloud-init-per, instance, password, bash,/etc/cloud/set_linux_random_password.sh] /etc/cloud/set_linux_random_password.sh]
Значение passwd зашифровано с использованием SHA512 (которая используется в качестве примера). Для получения дополнительной информации см. https://cloudinit.readthedocs.io/en/latest/topics/examples.html.
Подробнее о том, как зашифровать пароль и создать шифротекст, см. ниже (в качестве примера используется зашифровка пароля cloud.1234):
[root@** ~]# python -c "import crypt, getpass, pwd; print crypt.mksalt()"$6$I63DBVKK[root@** ~]# python -c "import crypt, getpass, pwd; print crypt.crypt('cloud.1234cloud.1234', '\$6\$I63DBVKK\$6\$I63DBVKK')"$6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0
Добавьте следующую информацию в последнюю строку /etc/cloud/cloud.cfg:
datasource_list: [ OpenStack ]datasource:OpenStack:metadata_urls: ['http://169.254.169.254']max_wait: 120timeout: 5
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
Если версия Cloud-Init равна 0.7.9 или новее, добавьте следующий контент в/etc/cloud/cloud.cfg
network:config: disabled
Добавленный контент должен быть в формате YAML.
Рисунок 2Отключение возможности настройки сети Cloud-Init

Переместитеsshснизу вверх, чтобы ускорить вход через SSH.
Рисунок 3Ускорение входа по SSH наECS

vi /usr/lib/python2.7/site-packages/cloudinit/sources/__init__.py
Нажмите клавишуiдля перехода в режим редактирования. Измените содержимое файла следующим образом на основе ключевого словаtoks
if toks:toks = str(toks).split('.')else:#toks = ["ip-%s" % lhost.replace(".", "-")]#toks = ["ip-%s" % lhost.replace(".", "-")] # Закомментируйте эту строку.toks = lhost.split(".novalocal") toks = lhost.split(".novalocal") # Добавьте эту строку.if len(toks) > 1:hostname = toks[0]#domain = '.'.join(toks[1:]) #domain = '.'.join(toks[1:]) # Закомментируйте эту строку.else:hostname = toks[0]if fqdn and domain != defdomain:return hostname return hostname#return "%s.%s" % (hostname, domain) #return "%s.%s" % (hostname, domain) # Закомментируйте эту строку.else:return hostname
После завершения модификации нажмите клавишуEscдля выхода из режима редактирования и введите:wq!для сохранения настроек и выхода.
Рисунок 4Редактирование файла__init__.py

cd /usr/lib/python2.7/site-packages/cloudinit/sources/
rm -rf __init__.pyc
rm -rf __init__.pyo
rm -rf /var/lib/cloud/*
rm -rf /var/log/cloud-init*
vim /etc/cloud/cloud.cfg.d/05_logging.cfg
Рисунок 5Установка параметра равным значениюcloudLogHandler

Выполните следующую команду для проверки корректности установки Cloud-Init:
cloud-init init --local
Если Cloud-Init установлен правильно, отображается информация о версии и отсутствуют ошибки. Например, сообщения об отсутствии файлов не будут отображаться.
(Необязательно) Выполните следующую команду, чтобы установить срок действия пароля на максимум:
chage -M 99999 $user_name
user_name— системный пользователь, например пользовательroot.
Рекомендуется установить срок действия пароля равным99999.