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

(Optional) Установка и настройка Cloud-Init

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

Сценарии

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

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

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

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

  • К ECS привязан EIP.
  • Вы вошли в ECS.
  • ECS использует DHCP для получения IP-адресов.

Процедура

  1. Проверьте, установлен ли Cloud-Init.

    Для получения подробной информации см. Check Whether Cloud-Init Has Been Installed.

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

    Вы можете установить Cloud-Init одним из следующих способов:

Проверьте, установлен ли Cloud-Init

Выполните приведённые здесь операции, чтобы проверить, установлен ли Cloud-Init. Методы проверки установки Cloud-Init различаются в зависимости от ОС.

Среда Python 3 (пример: Ubuntu 22.0.4)

  • Если вы работаете в среде 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 (пример: CentOS 6)

  • Если вы работаете в среде 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 считается установленным.

Если 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
  • Удалите кэш‑данные, созданные Cloud-Init, чтобы ECSs, созданные из приватного образа, могли входить в систему с использованием SSH‑сертификата:
    sudo rm -rf /var/lib/cloud/*
Note

После завершения операций не перезапускайте ECS. В противном случае вам потребуется выполнить эти операции повторно.

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

Метод установки Cloud-Init на ECS зависит от ОС. Выполните операции установки от имени пользователя root.

Ниже описано, как установить Cloud-Init на ECS с SUSE Linux, CentOS, Fedora, Debian и Ubuntu. Для других типов ОС установите соответствующий тип Cloud-Init. Например, необходимо установить coreos-cloudinit на ECSs с CoreOS.

SUSE

  • URL сетевых репозиториев установки Cloud-Init для SUSE

    https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/

    https://download.opensuse.org/repositories/Cloud:/Tools/

    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 and 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

  • Table 1 перечисляет URL‑адреса репозиториев сетевой установки Cloud-Init для CentOS. Перейдите по URL и выберите пакет установки epel-release в соответствии с вашей ОС.
    Table 1 URL‑адреса репозиториев сетевой установки Cloud-Init

    Тип ОС

    Версия

    URL

    CentOS

    6 32-bit

    https://archives.fedoraproject.org/pub/archive/epel/6/i386/

    6 64-bit

    https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/

    7 64-bit

    https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/

    1. Установите Cloud-Init.
      yum install network-installation-repository-URL/epel-release-x-y.noarch.rpm
      yum install cloud-init
      Note

      network-installation-repository-URL указывает, где можно получить пакет установки Cloud-Init epel-release. x-y указывает версию Cloud-Init epel-release, требуемую текущей ОС. Замените их фактическими значениями на основе Table 1.

      • Возьмём CentOS 6 64-bit в качестве примера. Если версия 6.8, команда выглядит следующим образом:
        yum install https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
      • Возьмём CentOS 7 64-bit в качестве примера. Если версия 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 в Fedora убедитесь, что URL репозитория сетевой установки настроен для ОС, проверив, содержит ли файл /etc/yum.repo.d/fedora.repo URL репозитория пакета Cloud-Init. Если файл не содержит URL, настройте его, следуя инструкциям на официальном сайте 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 в Debian или Ubuntu убедитесь, что URL репозитория сетевой установки настроен для ОС, проверив, содержит ли файл /etc/apt/sources.list URL репозитория пакета Cloud-Init. Если файл не содержит URL, настройте его, следуя инструкциям на официальном сайте 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 по следующему пути:

    https://launchpad.net/cloud-init/trunk/0.7.9/+download/cloud-init-0.7.9.tar.gz

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

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

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

    Замените \u003c$mirror\u003e на публичный сетевой источник 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) для входа в ECS, отключите 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. (Optional) В /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
      password=$(cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%&+=' | head -c 9)
      echo "linux:$password" | chpasswd
      sed -i -e '/^Login/d' /etc/issue
      sed -i -e '/^Initial/d' /etc/issue
      sed -i -c -e '/^$/d' /etc/issue
      echo -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 выполните следующие команды, чтобы добавить удобную подсказку "Please change password for user linux after first login."

      echo -e '\e[1;31m#################################\\e[0m' \u003e /etc/motd

      echo -e '\e[1;31m# Important !!! #\e[0m' \u003e\u003e /etc/motd

      echo -e '\e[1;31m# Please change password for user linux after first login. #\e[0m' \u003e\u003e /etc/motd

      echo -e '\e[1;31m#################################\e[0m' \u003e\u003e /etc/motd

      echo -e '' \u003e\u003e /etc/motd

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

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

    system_info:
    # This will affect which distro class gets used
    distro: rhel
    # Default user name + that default users groups (if added/used)
    default_user:
    name: linux #Username for login
    lock_passwd: False #Login using a password is enabled. Note that some OSs use the value 0 to enable password login.
    gecos: Cloud User
    groups: users #Optional. Add users to other groups that have been configured in /etc/group .
    passwd: $6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0
    sudo: ["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 classes
    paths:
    cloud_dir: /var/lib/cloud/
    templates_dir: /etc/cloud/templates/
    ssh_svcname: sshd
    bootcmd:
    - [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.

    Подробности о том, как зашифровать пароль и сгенерировать шифртекст, см. ниже (в качестве примера используется пароль 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
  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 по умолчанию должен быть отключен для CentOS и EulerOS ECS для точного доступа к источнику данных 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.

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


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

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

    Figure 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(".", "-")] # 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! для сохранения настроек и выхода.

      Figure 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

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

chage -M 99999 $user_name

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

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