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

(Опционально) Установка и настройка Cloud-Init

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

Сценарии

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

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

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

Prerequisites

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

Процедура

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

    Для подробностей см Проверьте, установлен ли Cloud-Init.

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

Проверьте, установлен ли 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 shows that Cloud-Init has been installed, Cloud-Init is installed.

Если 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 на ECS, работающих под CoreOS.

  • SUSE Linux

    Пути получения пакета установки Cloud-Init для SUSE Linux

    Note

    Выберите требуемый пакет установки репо в указанных путях.

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

    1. Войдите в ECS используется для создания приватного образа Linux.
    2. Выполните следующую команду, чтобы установить сетевой источник установки для SUSE Enterprise Linux Server 12:

      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 файл на нет.
  • CentOS

    Таблица 1 перечисляет пути установки Cloud-Init для CentOS. Выберите пакет установки epel-release, соответствующий вашей ОС.

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

    Тип ОС

    Версия

    Как получить

    CentOS

    6 32‑бит

    6 64‑бит

    7 64‑бит

    1. Запустите следующие команды для установки 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

    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 убедитесь, что адрес сетевого источника установки настроен для ОС, проверив, существует ли /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 and Ubuntu

    Перед установкой 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>/simple/
    trusted-host = <$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

  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. Измените значение дистрибутив в system_info в /etc/cloud/cloud.cfg файл, основанный на версии выпуска ОС, например дистрибутив: ubuntu, дистрибутив: sles, дистрибутив: debian, и дистрибутив: 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 для добавления пользователя и настроить swap-разделы, см. FAQ по конфигурации Cloud-Init.

    Возьмём 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' > /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. Добавьте общего пользователя login, установите его пароль, назначьте ему права 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 value 0 to enable the 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.

    Для получения деталей о том, как зашифровать пароль и сгенерировать шифротекст, см. следующее (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
  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 и тайм-аут. Значения max_wait и тайм-аут в приведённом выше примере являются лишь справочными.
    • Если версия OS старше Debian 8 или CentOS 5, вы не сможете включить агент для доступа к источнику данных IaaS OpenStack.
    • Маршрут zeroconf по умолчанию должен быть отключён для CentOS и EulerOS ECSs для точного доступа к источнику данных 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(".", "-")] # 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 файл


    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 является системным пользователем, например user root.

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