Облачная платформаAdvanced

(Необязательно) Установка и настройка Cloud-Init

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Сценарии

Чтобы обеспечить возможность использования функции инъекции пользовательских данных для введения начальной настраиваемой информации в экземпляры ECS, созданные из частного образа (например, установка пароля входа в систему для ECSECS), установите Cloud-Init на экземпляр ECSECS, используемый для создания образа.

  • По умолчанию экземпляры ECS, созданные из общедоступного образа, имеют установленный Cloud-Init. Вам не требуется устанавливать или настраивать Cloud-Init на таких экземплярах ECS.
  • Для экземпляров ECSECS, созданных с использованием внешнего файла образа, выполните операции данного раздела для установки и настройки Cloud-Init.
  • Вам необходимо скачать Cloud-Init с официального веб-сайта. Следовательно, вы должны привязать EIP к экземпляру ECSCloud-Initдля этого.ECS.
  • Если Cloud-Init не установлен, вы не сможете настроить экземпляр ECSECS. В результате вы можете использовать только пароль из файла образа для входа в созданный экземпляр ECSECS.
Note

Cloud-Init является открытым программным обеспечением. Если установлена версия с уязвимостью безопасности, рекомендуется обновить ее до последней версии.

Предварительные условия

  • К экземпляру ECS привязан EIPECS.
  • Вы вошли в экземпляр ECSECS.
  • Экземпляр ECS использует DHCP для получения IP-адресов.

Процедура

  1. Проверьте, установлен ли Cloud-Init.
  2. Установите 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)
  • Если вы находитесь в среде 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 показывает, что Cloud-Init установлен, значит он установлен.

Если Cloud-Init уже установлен, выполните следующие действия:

  • Определите, следует ли продолжать использование сертификата SSH в операционной системе текущего экземпляра ECSECS. Если нет, удалите его.
    • Если сертификат хранится в каталоге пользователя rootroot, например, /$path/$to/$root/.ssh/authorized_keys, выполните следующие команды:

      cd /root/.ssh

      rm authorized_keys

    • Если сертификат не хранится в каталоге пользователя rootroot, например, /$path/$to/$none-root/.ssh/authorized_keys, выполните следующие команды:

      cd /home/centos/.ssh

      rm authorized_keys

  • Удалите кэшированные данные, генерируемые Cloud-Init, чтобы убедиться, что экземпляры ECS, созданные из приватного образа, могут быть доступны с использованием сертификата SSH:sudo rm -rf /var/lib/cloud/*

Note

После завершения операций не перезагружайте экземпляр ECSECS. Иначе вам придется повторить эти операции заново.

(Рекомендуется) Установите Cloud-Init из официального репозитория

Метод установки Cloud-Init на экземпляр ECSECSзависит от операционной системы. Выполняйте операции установки под пользователем rootroot.

Далее описан способ установки Cloud-Init на экземпляре ECS под управлением SUSE Linux, CentOS, Fedora, Debian и Ubuntu. Для других типов операционных систем установите требуемую версию Cloud-Init. Например, на экземплярах ECS под управлением CoreOS потребуется установить coreos-cloudinit.

  • SUSE Linux

    URL сетевого хранилища пакетов Cloud-Init для SUSE Linux

    Note

    Выберите пакет из репозитория в зависимости от версии вашей ОС.

    Возьмем в качестве примера сервер SUSE Enterprise Linux Server 12. Выполните следующие шаги, чтобы установить Cloud-Init:

    1. Войдите в ECS используемый для создания частного образа Linux.
    2. Добавьте сетевой репозиторий установки.

      zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_12_SP3/Cloud:Tools.repo

    3. Обновите сетевой репозиторий установки.

      zypper refresh

    4. Установите Cloud-Init.

      zypper install cloud-init

    5. Активируйте автоматический запуск 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:

      1. Откройте файл dhcp с помощью редактора vi.

        vi etc/sysconfig/network/dhcp

      2. Измените значение параметра DHCLIENT_SET_HOSTNAME в файле dhcp на no.
  • CentOS

    Таблица 1 содержит ссылки на сетевые репозитории установки Cloud-Init для CentOS. Откройте ссылку и выберите пакет epel-release для своей операционной системы.

    Таблица 1 Сетевые адреса репозиториев установки Cloud-Init

    Тип ОС

    Версия

    Адрес

    CentOS

    6 32-разрядный

    6 64-разрядный

    7 64-разрядный

    1. Установите Cloud-Init.

      yum install network-installation-repository-URL/epel-release-x-y.noarch.rpm

      yum install cloud-init

      Note

      network-installation-repository-URL указывает место, где можно получить установочный пакет epel-release для Cloud-Init. x-y обозначает версию пакета epel-release для Cloud-Init, требуемую текущей ОС. Замените эти параметры фактическими значениями согласно Таблице 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

    2. Активируйте автоматический запуск 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

  • Fedora

    Перед установкой Cloud-Init убедитесь, что сетевой адрес репозитория установлен для вашей ОС, проверив наличие адреса репозитория пакета Cloud-Init в файле /etc/yum.repo.d/fedora.repo. Если адрес отсутствует, настройте его, следуя инструкциям на официальном сайте Fedora.

    1. Установите Cloud-Init.

      yum install cloud-init

    2. Активируйте автоматический запуск 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

  • Debian и Ubuntu

    Перед установкой Cloud-Init убедитесь, что сетевой адрес репозитория установлен для вашей ОС, проверив наличие адреса репозитория пакета Cloud-Init в файле /etc/apt/sources.list. Если адрес отсутствует, настройте его, следуя инструкциям на официальных сайтах Debian или Ubuntu.

    1. Установите Cloud-Init.

      apt-get update

      apt-get install cloud-init

    2. Активируйте автоматический запуск 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 с использованием официального пакета исходного кода и инструмента pip

Далее приведены операции с примером использования Cloud-Init 0.7.9, описывающие процесс установки Cloud-Init.

  1. Загрузите файл cloud-init-0.7.9.tar.gz пакет исходного кода и загрузите его в каталог /home/ каталога ECS.

    Загрузите cloud-init-0.7.9.tar.gz из следующего пути:

  2. Создайте файл pip.conf в каталоге ~/.pip/ и отредактируйте следующее содержимое:
    Note

    Если каталог ~/.pip/ отсутствует, выполните команду mkdir ~/.pip для создания.

    [global]
    index-url = https://<$mirror><$mirror>/simple/
    trusted-host = <$mirror><$mirror>
    Note

    Замените <$mirror> на общедоступный источник PyPI.

    Источник общедоступной сети PyPI: https://pypi.python.org/

  3. Выполните следующую команду для установки загруженного пакета исходного кода Cloud-Init (выберите параметр --upgrade при необходимости во время установки):

    pip install [--upgrade] /home/cloud-init-0.7.9.tar.gz

    Note

    Для получения дополнительной информации о том, как установить пакет исходного кода Cloud-Init, см. документацию Cloud-Init Documentation.

  4. Запустите команду cloud-init -v. Установка Cloud-Init прошла успешно, если отображается информация аналогичная следующей:
    cloud-init 0.7.9
  5. Разрешить автоматический запуск 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

      Caution

      При установке Cloud-Init с использованием официального пакета исходного кода и pip обратите внимание, что:

      1. Добавьте пользователя syslog к группе adm во время установки. Если пользователь syslog уже существует, добавьте его в группу adm. Для некоторых операционных систем (таких как CentOS и SUSE) пользователь syslog может отсутствовать. Выполните следующие команды для создания пользователя syslog и добавления его в группу adm:

        useradd syslog

        groupadd adm

        usermod -g adm syslog

      2. Измените значение параметра distro в system_info файла /etc/cloud/cloud.cfg в соответствии с версией выпуска операционной системы. Например, можно указать distro: ubuntu, distro: sles, distro: debian, или distro: fedora.

Настройка Cloud-Init

  1. Настройте разрешения пользователей для входа в систему ECS. Если вы используете общий аккаунт (не пользователь root), отключите права доступа SSH пользователя root и удаленный вход с использованием пароля для повышения безопасности ECS.
    • Вы можете войти в ECS через SSH, используя пару ключей, внедренную в ваш аккаунт. (Рекомендуется выбрать режим входа с использованием пары ключей при создании ECS.)
    • Также вы можете использовать случайный пароль для входа в ECS через noVNC.

    Выполните следующую команду, чтобы открыть файл sshd_config с помощью редактора vi:

    vi /etc/ssh/sshd_config

  2. Измените значение параметра PasswordAuthentication в файле sshd_config на no.
    Note

    Для SUSE и openSUSE измените значения следующих параметров в файле sshd_config на no:

    • PasswordAuthentication
    • ChallengeResponseAuthentication
  3. Выполните следующую команду, чтобы открыть файл cloud.cfg с помощью редактора vi:

    vi /etc/cloud/cloud.cfg

  4. (Необязательно) В /etc/cloud/cloud.cfg, установите apply_network_config к false.

    Этот шаг актуален только для версии Cloud-Init 18.3 или более поздней.

    Рисунок 1 Пример конфигурации


  5. Отключите разрешения SSH пользователя root в /etc/cloud/cloud.cfg, добавьте обычного пользователя (который используется для входа в ECS через VNC), задайте пароль для этого пользователя и назначьте ему права sudo.
    Note

    Для Ubuntu и Debian установите значение параметра manage_etc_hosts в файле /etc/cloud/cloud.cfg равным localhost. Иначе переключение на пользователя root может завершиться тайм-аутом. Подробности о том, как изменить имя хоста облачного сервера, настроить ключ SSH, использовать Cloud-Init для добавления пользователя и настройки разделов подкачки, см. в разделе Cloud-Init Configuration FAQ.

    Возьмем Ubuntu в качестве примера.

    • Выполните следующую команду для создания скрипта /etc/cloud/set_linux_random_password.sh, который является исполняемым и может использоваться для генерации случайных паролей:

      cat /etc/cloud/set_linux_random_password.sh

      Содержимое файла выглядит следующим образом:

      #!/bin/bash#!/bin/bash
      password=$(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" | chpasswd
      sed -i -e '/^Login/d' /etc/issuesed -i -e '/^Login/d' /etc/issue
      sed -i -e '/^Initial/d' /etc/issuesed -i -e '/^Initial/d' /etc/issue
      sed -i -c -e '/^$/d' /etc/issuesed -i -c -e '/^$/d' /etc/issue
      echo -e "\nInitial login with linux:$password\n" >> /etc/issueecho -e "\nInitial login with linux:$password\n" >> /etc/issue
      Note

      Вы можете выполнить команду chmod +x /etc/cloud/set_linux_random_password.sh для предоставления прав выполнения set_linux_random_password.sh.

    • После того, как вы вошли в ECS, выполните следующие команды для добавления дружественного пользователю приглашения «Пожалуйста, измените пароль пользователя linux после первого входа».

      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

  6. Добавьте общего пользователя для входа, задайте ему пароль, назначьте права sudo и используйте bootcmd для создания сценария, используемого для генерации случайного пароля для каждого созданного ECS.
    Caution

    Убедитесь, что формат конфигурационного файла (такой как выравнивание и пробелы) совпадает с приведенным примером.

    system_info:
    # Это повлияет на то, какой класс дистрибутива будет использован
    distro: rhel
    # Имя пользователя по умолчанию + группы этого пользователя по умолчанию (если задано/используется)
    default_user:
    name: linuxname: linux #Имя пользователя для входа
    lock_passwd: Falselock_passwd: False #Разрешен вход с использованием пароля. Обратите внимание, что некоторые ОС используют значение 00 для включения входа по паролю.
    gecos: Cloud User
    groups: usersgroups: users #Необязательно. Добавляйте пользователей в другие группы, которые были настроены в /etc/group/etc/group.
    passwd: $6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0passwd: $6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0
    sudo: ["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: sshd
    bootcmd: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]
    Note

    Значение 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
  7. Разрешите агенту доступ к источнику данных IaaS OpenStack.

    Добавьте следующую информацию в последнюю строку /etc/cloud/cloud.cfg:

    datasource_list: [ OpenStack ]
    datasource:
    OpenStack:
    metadata_urls: ['http://169.254.169.254']
    max_wait: 120
    timeout: 5
    Note
    • Можно решить, устанавливать ли параметры max_wait и timeout. Значения параметров max_wait и timeoutв приведенном выше примере приведены только справочные данные.
    • Если версия ОС старше Debian 8 или CentOS 5, вы не сможете включить агенту доступ к источнику данных IaaS OpenStack.
    • Стандартный маршрут Zeroconf должен быть отключен для ECS под управлением CentOS и EulerOS для точного доступа к источнику данных IaaS OpenStack.

      echo "NOZEROCONF=yes" >> /etc/sysconfig/network

  8. Измените файл/etc/cloud/cloud.cfgдля отключения возможности настройки сети Cloud-Init.

    Если версия Cloud-Init равна 0.7.9 или новее, добавьте следующий контент в/etc/cloud/cloud.cfg

    network:
    config: disabled
    Note

    Добавленный контент должен быть в формате YAML.

    Рисунок 2Отключение возможности настройки сети Cloud-Init


  9. Изменитеcloud_init_modulesв файле конфигурацииcloud.cfg

    Переместитеsshснизу вверх, чтобы ускорить вход через SSH.

    Рисунок 3Ускорение входа по SSH наECS


  10. Измените конфигурацию так, чтобы имя хостаECSсоздаваемого из образа не содержало суффикс.novalocalи могло содержать точку (.)
    1. Выполните следующую команду для изменения файла__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(".", "-")]#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


    2. Выполните следующую команду для перехода в папкуcloudinit/sources

      cd /usr/lib/python2.7/site-packages/cloudinit/sources/

    3. Выполните следующие команды для удаления файла__init__.pycи оптимизированного файла__init__.pyo

      rm -rf __init__.pyc

      rm -rf __init__.pyo

    4. Выполните следующие команды для очистки логов:

      rm -rf /var/lib/cloud/*

      rm -rf /var/log/cloud-init*

  11. Выполните следующую команду для редактирования файла/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 установлен правильно, отображается информация о версии и отсутствуют ошибки. Например, сообщения об отсутствии файлов не будут отображаться.

Note

(Необязательно) Выполните следующую команду, чтобы установить срок действия пароля на максимум:

chage -M 99999 $user_name

user_name— системный пользователь, например пользовательroot.

Рекомендуется установить срок действия пароля равным99999.