Сценарии
Чтобы убедиться, что вы можете использовать функцию внедрения пользовательских данных для внедрения первоначальной пользовательской информации в ECS, созданные из приватного образа (например, при установке ECS пароль для входа), установить Cloud-Init на ECS используется для создания образа.
- По умолчанию в ECS, созданных из публичного образа, установлен Cloud-Init. Вам не нужно устанавливать или настраивать Cloud-Init на таких ECS.
- Для ECS, созданных с использованием внешнего файла образа, установите и настройте Cloud-Init, выполнив действия, описанные в этом разделе.
- Вам необходимо скачать Cloud-Init с официального сайта. Поэтому вам необходимо привязать EIP к ECS.
- Если Cloud-Init не установлен, вы не сможете настроить ECS. В результате вы можете использовать только пароль из образа для входа в созданный ECSs.
Cloud-Init — это программное обеспечение с открытым исходным кодом. Если установленная версия имеет уязвимости в безопасности, рекомендуется обновить её до последней версии.
Prerequisites
- EIP привязан к ECS.
- Вы вошли в ECS.
- Этот ECS использует DHCP для получения IP-адресов.
Процедура
- Проверьте, установлен ли Cloud-Init.
Для подробностей см Проверьте, установлен ли Cloud-Init.
- Установить Cloud-Init.
Вы можете установить Cloud-Init, используя любой из следующих методов: (Рекомендуется) Установить Cloud-Init с помощью официального пакета установки и Установить Cloud-Init с помощью официального пакета исходного кода и pip.
Проверьте, установлен ли Cloud-Init
Выполните приведённые здесь операции, чтобы проверить, установлен ли Cloud-Init. Способы проверки установки Cloud-Init зависят от ОС.
- Если вы работаете в среде Python 3, выполните следующую команду, чтобы проверить, установлен ли Cloud-Init (в примере используется Ubuntu 22.0.4):
which cloud-init
- Если отображается информация, похожая на следующую, Cloud-Init установлен:/usr/bin/cloud-init
- Если отображается информация, похожая на следующую, Cloud-Init не установлен:/usr/bin/which: no cloud-init in (/usr/local/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)
- Если отображается информация, похожая на следующую, Cloud-Init установлен:
- Если вы работаете в среде Python 2, выполните следующую команду, чтобы проверить, установлен ли Cloud-Init (в качестве примера используется CentOS 6):
which cloud-init
- Если отображается информация, аналогичная следующей, Cloud-Init установлен:cloud-init-0.7.5-10.el6.centos.2.x86_64
- Если информация не возвращается, Cloud-Init не установлен.Note
Чтобы убедиться, что Cloud-Init действительно не установлен, рекомендуется выполнить rpm -qa |grep cloud-init чтобы проверить снова. Если любой из which cloud-init и rpm -qa |grep cloud-init shows that Cloud-Init has been installed, Cloud-Init is installed.
- Если отображается информация, аналогичная следующей, Cloud-Init установлен:
Если Cloud-Init установлен, выполните следующие операции:
- Определите, следует ли продолжать использовать SSH‑сертификат в ОС этого ECS. Если нет, удалите его.
- Если сертификат хранится в каталоге пользователя root, например, /$path/$to/$root/.ssh/authorized_keys, выполните следующие команды:
cd /root/.ssh
rm authorized_keys
- Если сертификат не хранится в каталоге пользователя root, например, /$path/$to/$none-root/.ssh/authorized_keys, выполните следующие команды:
cd /home/centos/.ssh
rm authorized_keys
- Если сертификат хранится в каталоге пользователя root, например, /$path/$to/$root/.ssh/authorized_keys, выполните следующие команды:
- Удалите кэш‑данные, созданные Cloud-Init, чтобы обеспечить ECSs, созданные из приватного образа, могут входить в систему с использованием SSH‑сертификата:
sudo rm -rf /var/lib/cloud/*
После завершения операций не перезапускайте ECS. В противном случае вам необходимо выполнить эти операции снова.
(Рекомендуется) Установите Cloud-Init, используя официальный пакет установки
Метод установки Cloud-Init на ECS зависит от ОС. Выполните операции установки от имени пользователя root.
Ниже описано, как установить Cloud-Init на ECS под управлением SUSE Linux, CentOS, Fedora, Debian и Ubuntu. Для других типов ОС установите требуемый тип Cloud-Init. Например, вам необходимо установить coreos-cloudinit на ECS, работающих под CoreOS.
- SUSE Linux
Пути получения пакета установки Cloud-Init для SUSE Linux
NoteВыберите требуемый пакет установки репо в указанных путях.
Возьмите SUSE Enterprise Linux Server 12 в качестве примера. Выполните следующие шаги, чтобы установить Cloud-Init:
- Войдите в ECS используется для создания приватного образа Linux.
- Выполните следующую команду, чтобы установить сетевой источник установки для SUSE Enterprise Linux Server 12:
zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_12_SP3/Cloud:Tools.repo
- Выполните следующую команду, чтобы обновить сетевой источник установки:
zypper refresh
- Выполните следующую команду, чтобы установить Cloud-Init:
zypper install cloud-init
- Выполните следующие команды, чтобы включить автоматический запуск Cloud-Init при загрузке системы:
- SUSE 11
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
- SUSE 12 и openSUSE 12/13/42
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
CautionДля SUSE и openSUSE выполните следующие действия, чтобы предотвратить изменение имени хоста DHCP:
- Выполните следующую команду, чтобы открыть dhcp файл с использованием редактора vi:
vi etc/sysconfig/network/dhcp
- Измените значение DHCLIENT_SET_HOSTNAME в dhcp файл на нет.
- SUSE 11
- CentOS
Таблица 1 перечисляет пути установки Cloud-Init для CentOS. Выберите пакет установки epel-release, соответствующий вашей ОС.
Таблица 1 Адреса пакетов установки Cloud-Init Тип ОС
Версия
Как получить
CentOS
6 32‑бит
6 64‑бит
7 64‑бит
- Запустите следующие команды для установки Cloud-Init:
yum install Адрес пакета установки Cloud-Init/epel-release-x-y.noarch.rpm
yum install cloud-init
NoteАдрес пакета установки Cloud-Init указывает адрес пакета установки Cloud-Init epel-release, и x-y указывает версию Cloud-Init epel-release, необходимую для текущей ОС. Замените их фактическими значениями согласно Таблица 1.
- Возьмём CentOS 6 64-бит в качестве примера. Если версия 6.8, команда будет следующей:
yum install https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
- Возьмём CentOS 7 64-бит в качестве примера. Если версия 7.14, команда будет следующей:
yum install https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
- Возьмём CentOS 6 64-бит в качестве примера. Если версия 6.8, команда будет следующей:
- Выполните следующие команды, чтобы включить 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:
- Fedora
Перед установкой Cloud-Init убедитесь, что адрес сетевого источника установки настроен для ОС, проверив, существует ли /etc/yum.repo.d/fedora.repo Файл содержит адрес источника установки программного пакета. Если файл не содержит адрес, настройте его, следуя инструкциям на официальном сайте Fedora.
- Выполните следующую команду для установки Cloud-Init:
yum install cloud-init
- Выполните следующие команды, чтобы включить 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:
- Debian and Ubuntu
Перед установкой Cloud-Init убедитесь, что адрес источника сети установлен для ОС, проверив, есть ли /etc/apt/sources.list файл содержит адрес источника установки программного пакета. Если файл не содержит адрес, настройте его, следуя инструкциям на официальном сайте Debian или Ubuntu.
- Выполните следующие команды, чтобы установить Cloud-Init:
apt-get update
apt-get install cloud-init
- Выполните следующие команды, чтобы включить 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, используя официальный пакет исходного кода и pip
Следующие действия используют Cloud-Init 0.7.9 в качестве примера для описания процесса установки Cloud-Init.
- Скачать cloud-init-0.7.9.tar.gz пакет исходного кода и загрузить его в /home/ каталог ECS.
Скачать cloud-init-0.7.9.tar.gz по следующему пути:
- Создать pip.conf файл в ~/.pip/ каталог и отредактировать следующее содержимое:Note
Если ~/.pip/ каталог не существует, выполните mkdir ~/.pip команду для его создания.
[global]index-url = https://<$mirror>/simple/trusted-host = <$mirror>NoteЗамените <$mirror> на публичный сетевой источник PyPI.
Публичный сетевой источник PyPI: https://pypi.python.org/
- Выполните следующую команду для установки загруженного пакета исходного кода Cloud-Init (выберите --upgrade по необходимости во время установки):
pip install [--upgrade] /home/cloud-init-0.7.9.tar.gz
NoteПодробности о том, как установить пакет исходного кода Cloud-Init, смотрите Документация Cloud-Init
- Запустите cloud-init -v команда. Cloud-Init установлен успешно, если отображается следующая информация:cloud-init 0.7.9
- Включите Cloud-Init для автоматического запуска при загрузке системы.
- Если ОС использует SysVinit для управления автоматическим запуском сервисов, выполните следующие команды:
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
- Если ОС использует Systemd для управления автоматическим запуском сервисов, выполните следующие команды:
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
- Если ОС использует SysVinit для управления автоматическим запуском сервисов, выполните следующие команды:
Если вы устанавливаете Cloud-Init, используя официальный пакет исходного кода и pip, обратите внимание на следующее:
- Добавить пользователя syslog в adm группу во время установки. Если пользователь syslog существует, добавьте его в adm группу. Для некоторых ОС (например CentOS и SUSE), пользователь syslog может не существовать. Выполните следующие команды для создания пользователя syslog и добавьте его в adm группу:
useradd syslog
groupadd adm
usermod -g adm syslog
- Измените значение дистрибутив в system_info в /etc/cloud/cloud.cfg файл, основанный на версии выпуска ОС, например дистрибутив: ubuntu, дистрибутив: sles, дистрибутив: debian, и дистрибутив: fedora.
Настройте Cloud-Init
- Настройте разрешения пользователей для входа в ECS. Если вы используете общую учётную запись (не пользователь root) для входа в ECS, отключите разрешения SSH для пользователя root и удалённый вход с использованием пароля для повышения безопасности ECS.
- Вы можете удалённо войти в ECS, используя SSH и пару ключей, внедрённую в ваш аккаунт. (Рекомендуется выбрать режим входа с парой ключей при создании ECS.)
- Вы также можете использовать случайный пароль для входа в ECS через noVNC.
Выполните следующую команду, чтобы открыть sshd_config файл с помощью редактора vi:
vi /etc/ssh/sshd_config
- Измените значение PasswordAuthentication в sshd_config файле на no.Note
Для SUSE и openSUSE измените значения следующих параметров в sshd_config файле на no:
- PasswordAuthentication
- ChallengeResponseAuthentication
- Запустите следующую команду, чтобы открыть cloud.cfg файл с помощью редактора vi:
vi /etc/cloud/cloud.cfg
- (Optional) в /etc/cloud/cloud.cfg, установить apply_network_config на false.
Этот шаг предназначен только для Cloud-Init 18.3 и выше.
Рисунок 1 Пример конфигурации

- Отключите SSH‑разрешения пользователя root в /etc/cloud/cloud.cfg, добавить общего пользователя (который используется для входа в ECS с помощью VNC), и настроить пароль для добавленного пользователя и назначить ему права sudo.Note
Для Ubuntu и Debian установите значение manage_etc_hosts в /etc/cloud/cloud.cfg файл в localhost. В противном случае переключение на пользователя root может завершиться по таймауту. Для получения подробной информации о том, как изменить имя хоста облачного сервера, настроить SSH-ключ, использовать Cloud-Init для добавления пользователя и настроить swap-разделы, см. FAQ по конфигурации Cloud-Init.
Возьмём Ubuntu в качестве примера.
- Выполните следующую команду для создания скрипта /etc/cloud/set_linux_random_password.sh, который является исполняемым и может использоваться для генерации случайных паролей:
cat /etc/cloud/set_linux_random_password.sh
Содержимое файла выглядит следующим образом:
#!/bin/bashpassword=$(cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%&+=' | head -c 9)echo "linux:$password" | chpasswdsed -i -e '/^Login/d' /etc/issuesed -i -e '/^Initial/d' /etc/issuesed -i -c -e '/^$/d' /etc/issueecho -e "\nInitial login with linux:$password\n" >> /etc/issueNoteВы можете выполнить chmod +x /etc/cloud/set_linux_random_password.sh команду для добавления прав на выполнение set_linux_random_password.sh.
- После входа в ECS выполните следующие команды, чтобы добавить дружественное сообщение "Please change password for user linux after first login."
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
- Выполните следующую команду для создания скрипта /etc/cloud/set_linux_random_password.sh, который является исполняемым и может использоваться для генерации случайных паролей:
- Добавьте общего пользователя login, установите его пароль, назначьте ему права sudo и используйте bootcmd для создания скрипта, генерирующего случайный пароль для каждого созданного ECS.Caution
Убедитесь, что формат файла конфигурации (например, выравнивание и пробелы) согласован с предоставленным примером.
system_info:# This will affect which distro class gets useddistro: rhel# Default user name + that default users groups (if added/used)default_user:name: linux #Username for loginlock_passwd: False #Login using a password is enabled. Note that some OSs use value 0 to enable the password login.gecos: Cloud Usergroups: users #Optional. Add users to other groups that have been configured in /etc/group.passwd: $6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0sudo: ["ALL=(ALL) NOPASSWD:ALL"] # Assign the root rights to the user.shell: /bin/bash #Execute shell in bash mode.# Other config here will be given to the distro class and/or path classespaths:cloud_dir: /var/lib/cloud/templates_dir: /etc/cloud/templates/ssh_svcname: sshdbootcmd:- [cloud-init-per, instance, password, bash,/etc/cloud/set_linux_random_password.sh]NoteЗначение passwd зашифровано с использованием SHA512 (это используется как пример). Для получения более подробной информации см https://cloudinit.readthedocs.io/en/latest/topics/examples.html.
Для получения деталей о том, как зашифровать пароль и сгенерировать шифротекст, см. следующее (encrypting password 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.1234', '\$6\$I63DBVKK')"$6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0 - Разрешите агенту доступ к источнику данных IaaS OpenStack.
Добавьте следующую информацию в последнюю строку /etc/cloud/cloud.cfg:
datasource_list: [ OpenStack ]datasource:OpenStack:metadata_urls: ['http://169.254.169.254']max_wait: 120timeout: 5Note- Вы можете решить, устанавливать max_wait и тайм-аут. Значения max_wait и тайм-аут в приведённом выше примере являются лишь справочными.
- Если версия OS старше Debian 8 или CentOS 5, вы не сможете включить агент для доступа к источнику данных IaaS OpenStack.
- Маршрут zeroconf по умолчанию должен быть отключён для CentOS и EulerOS ECSs для точного доступа к источнику данных IaaS OpenStack.
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
- Измените /etc/cloud/cloud.cfg файл, чтобы отключить возможность сетевой конфигурации Cloud-Init.
Если версия Cloud-Init 0.7.9 или новее, добавьте следующее содержимое в /etc/cloud/cloud.cfg:
network:config: disabledNoteДобавленный контент должен быть в формате YAML.
Рисунок 2 Отключение возможности сетевой конфигурации Cloud-Init

- Изменить cloud_init_modules в cloud.cfg файл конфигурации.
Переместить ssh с нижней части к верхней, чтобы ускорить вход SSH.
Рисунок 3 Ускорение входа SSH в ECS

- Измените конфигурацию так, чтобы имя хоста ECS созданный из образа не содержит .novalocal суффикс и может содержать точку (.).
- Выполните следующую команду, чтобы изменить __init__.py файл:
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(".", "-")] # Comment out this line.toks = lhost.split(".novalocal") # Add this line.if len(toks) > 1:hostname = toks[0]#domain = '.'.join(toks[1:]) # Comment out this line.else:hostname = toks[0]if fqdn and domain != defdomain:return hostname#return "%s.%s" % (hostname, domain) # Comment out this line.else:return hostnameПосле завершения изменения нажмите Esc чтобы выйти из режима редактирования и войти :wq! чтобы сохранить настройки и выйти.
Рисунок 4 Модификация __init__.py файл

- Выполните следующую команду, чтобы перейти к cloudinit/sources папка:
cd /usr/lib/python2.7/site-packages/cloudinit/sources/
- Выполните следующие команды, чтобы удалить __init__.pyc файл и оптимизированный __init__.pyo файл:
rm -rf __init__.pyc
rm -rf __init__.pyo
- Выполните следующие команды, чтобы очистить логи:
rm -rf /var/lib/cloud/*
rm -rf /var/log/cloud-init*
- Выполните следующую команду, чтобы изменить __init__.py файл:
- Выполните следующую команду, чтобы отредактировать /etc/cloud/cloud.cfg.d/05_logging.cfg файл для использования cloudLogHandler для обработки логов:
vim /etc/cloud/cloud.cfg.d/05_logging.cfg
Рисунок 5 Установка значения параметра cloudLogHandler

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