安装cloud-init

cloud-init是一款开源初始化工具,能够为Linux操作系统提供初始化密码、设置主机名、执行自定义脚本等初始化配置能力。如果您本地制作的自定义镜像未安装cloud-init且需要迁移上云,需要手动安装cloud-init,否则使用该自定义镜像的创建ECS实例将无法自动执行设置主机名、配置网络等初始化任务,进而影响实例的自动化部署与配置效率。本文介绍如何在Linux操作系统中安装cloud-init。

关于cloud-init的更多信息,请参见cloud-init官方文档

操作场景

阿里云所有公共镜像已默认安装cloud-init,为了保证使用您本地自定义镜像创建的ECS实例能自动初始化系统配置,建议您在以下场景中为Linux服务器安装cloud-init。

  • 准备迁移上云但未安装cloud-init的Linux服务器

    如果您的服务器计划迁移到阿里云,但目前尚未安装cloud-init,您应当在迁移前安装cloud-init,以确保新创建的ECS实例能够在启动时自动执行初始化任务。

    说明

    不准备迁移上云的服务器,安装cloud-init可能引入不必要的复杂性或资源占用,请您根据实际环境选择是否安装。

  • 已安装cloud-init但版本低于0.7.9的Linux服务器

    cloud-init的新版本通常包含了更多的功能和修复,以保证与最新云平台特性的兼容性。如果您的服务器上cloud-init版本较低,建议升级至更高版本,以确保最佳的兼容性和安全性。

  • 已在阿里云运行但未安装cloud-init的ECS实例

    如果您的ECS实例缺少cloud-init,建议在实例内部手动安装cloud-init,以确保ECS实例能成功完成初始化配置。

步骤一:检查是否需要升级安装cloud-init

  1. 登录源服务器。

  2. 运行以下命令检查是否已安装cloud-init。

    CentOS系列

    rpm -qa | grep -i cloud-init 
    pip list | grep -i cloud-init

    Ubuntu系列

    dpkg -l | grep -i cloud-init 
    pip list | grep -i cloud-init
    • 若无任何输出或版本低于0.7.9版本:您需要步骤二:安装cloud-init

      重要

      0.7.9版本是初期的社区版cloud-init,不适用于初始化ECS实例,必须升级至较高版本。

    • 若版本为18或更高版本:无需安装cloud-init,但cloud-init在初始化实例时可以自动配置网络,如果默认配置不符合您的需求,您可按需自定义网络配置

    • 若版本为19.1.21:建议您升级安装阿里云版cloud-init 23.2.2。阿里云版cloud-init 23.2.2版本相对于阿里云版cloud-init 19.1.21版本有一些新的改进和特性:

      • 如果实例的cloud-init版本为23.2.2,则该实例支持通过加固模式访问元数据。关于实例元数据的更多说明,请参考实例元数据

      • 其他功能增强、性能改进、错误修复和社区贡献的变化。更多信息,请参见ChangeLog文件

    • 其他:无需再安装cloud-init,可直接执行后续步骤

  3. 为避免安装cloud-init误操作导致数据丢失,建议您先备份源服务器数据(例如创建快照)。

步骤二:安装cloud-init

  • 阿里云版cloud-init 23.2.2:推荐,依赖Python 3.6及以上版本,数据源为Aliyun

  • 阿里云版cloud-init 19.1.21:依赖Python 3.6及以上版本,数据源为Aliyun

  • 阿里云版cloud-init 0.7.6a17:部分低版本操作系统(例如CentOS 6、Debian 9及SUSE Linux Enterprise Server 12等),需要安装该版本,依赖Python 2.7版本,数据源为Aliyun

    重要

    由于Python社区已停止对Python 2.7的技术支持,建议您尽量使用高版本的cloud-init,避免依赖库的潜在问题。

  • 社区版本cloud-init:社区版cloud-init由社区维护。阿里云版cloud-init的最新版本为23.2.2,如果您需要使用更高版本的cloud-init,可以安装社区版本的cloud-init。更多版本信息,请参见cloud-init官方网站

社区版的cloud-init是cloud-init项目的官方版本,而阿里云版的cloud-init是针对阿里云平台进行优化的版本,可以更好地支持阿里云的平台服务,因此推荐您使用阿里云版cloud-init。请您根据实际需要选择安装cloud-init。

(推荐)阿里云版cloud-init 23.2.2

阿里云cloud-init的最新版本为23.2.2,该版本已变为软件包维护方式,您可以选择适合自己操作系统版本的软件包进行安装,也可以选择使用源码包进行安装。

各操作系统的软件包下载地址如下:

操作系统类型

操作系统版本

二进制软件包

MD5SUM校验

源码包

Debian

12

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/debian12/cloud-init_23.2.2-5_all.deb

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/debian12/cloud-init_23.2.2-5_all.deb.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/debian12/debian12-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

11

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/debian11/cloud-init_23.2.2-5_all.deb

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/debian11/cloud-init_23.2.2-5_all.deb.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/debian11/debian11-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

CentOS Stream

9

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/centosstream9/cloud-init-23.2.2-5.el9.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/centosstream9/cloud-init-23.2.2-5.el9.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/centosstream9/centosstream9-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

8

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/centosstream8/cloud-init-23.2.2-5.el8.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/centosstream8/cloud-init-23.2.2-5.el8.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/centosstream8/centosstream8-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

Fedora

40

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora40/cloud-init-23.2.2-5.fc40.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora40/cloud-init-23.2.2-5.fc40.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora40/fedora40-cloud-init_23.2.2-5-5febbb46a4cdcb4716dc5a73359a5a73e454607a.tar.gz

39

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora39/cloud-init-23.2.2-5.fc39.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora39/cloud-init-23.2.2-5.fc39.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora39/fedora39-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

38

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora38/cloud-init-23.2.2-5.fc38.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora38/cloud-init-23.2.2-5.fc38.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/fedora38/fedora38-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

AlmaLinux

9

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/almalinux9/cloud-init-23.2.2-5.el9.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/almalinux9/cloud-init-23.2.2-5.el9.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/almalinux9/almalinux9-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

8

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/almalinux8/cloud-init-23.2.2-5.el8.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/almalinux8/cloud-init-23.2.2-5.el8.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/almalinux8/almalinux8-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

Rocky Linux

9

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/rockylinux9/cloud-init-23.2.2-5.el9.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/rockylinux9/cloud-init-23.2.2-5.el9.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/rockylinux9/rockylinux9-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

8

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/rockylinux8/cloud-init-23.2.2-5.el8.noarch.rpm

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/rockylinux8/cloud-init-23.2.2-5.el8.noarch.rpm.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/rockylinux8/rockylinux8-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

Ubuntu

24

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu24/cloud-init_23.2.2-5_all.deb

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu24/cloud-init_23.2.2-5_all.deb.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu24/ubuntu24-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

22

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu22/cloud-init_23.2.2-5_all.deb

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu22/cloud-init_23.2.2-5_all.deb.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu22/ubuntu22-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

20

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu20/cloud-init_23.2.2-5_all.deb

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu20/cloud-init_23.2.2-5_all.deb.md5sum

https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/ubuntu20/ubuntu20-cloud-init_23.2.2-5-bd18eafc764973b6cef608786eac317e63ec22c0.tar.gz

以下操作分别以Debian 12和CentOS Stream 9系统下载安装二进制软件包为例,介绍如何安装cloud-init。

Debian 12

  1. 运行以下命令,下载cloud-init软件包。

    wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/debian12/cloud-init_23.2.2-5_all.deb
  2. 运行以下命令,安装软件包。

    sudo apt-get install -y ./cloud-init_23.2.2-5_all.deb
  3. (可选)为了避免后期软件包更新或升级到开源更高版本,建议您运行以下命令,固化cloud-init的软件包版本。

    sudo apt-mark hold cloud-init
  4. 运行以下命令,查看cloud-init的版本信息是否符合预期。

    cloud-init --version

CentOS Stream 9

  1. 运行以下命令,下载cloud-init软件包。

    wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/centosstream9/cloud-init-23.2.2-5.el9.noarch.rpm
  2. 运行以下命令,安装软件包。

    sudo yum install -y ./cloud-init-23.2.2-5.el9.noarch.rpm
  3. (可选)为了避免后期软件包更新或升级到开源更高版本,建议您运行以下命令,固定cloud-init的软件包版本。

    sudo sh -c 'echo "exclude=cloud-init" >> /etc/dnf/dnf.conf'
  4. 运行以下命令,查看cloud-init的版本信息是否符合预期。

    cloud-init --version
说明

阿里云cloud-init 23.2.2版本默认不再在/etc/hosts文件中做hostname到private-ipv4的映射,如果您的业务需要该配置,请自行配置。高版本操作系统通过nss-myhostname组件实现自身与hostname的连通性,该组件由systemd-libs软件包(Red Hat系列)或libnss-myhostname软件包(Debian系列)提供,并通过/etc/nsswitch.conf配置文件来启用此功能。更多信息,请参见nss-myhostname手册

阿里云版cloud-init 19.1.21

  1. 确保源服务器已安装Python PIP依赖库。

    以安装Python3-pip依赖库为例,Linux部分发行版的安装命令如下。

    CentOS/Red Hat Enterprise Linux

    sudo yum -y install python3-pip

    Ubuntu/Debian

    sudo apt-get -y install python3-pip

    OpenSUSE/SUSE

    sudo zypper -n install python3-pip
  2. 运行以下命令下载阿里云版cloud-init。

    wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/cloud-init-19.1.21.tgz
  3. 运行以下命令解压cloud-init安装包到当前目录。

    tar -zxvf cloud-init-19.1.21.tgz
  4. 进入cloud-init目录下,并安装依赖库。

    cd ./cloud-init-19.1.21
    pip3 install -r ./requirements.txt
  5. 进入cloud-inittools目录。

    cd ./tools
  6. 运行以下命令执行安装cloud-init的脚本deploy.sh

    sudo bash ./deploy.sh <issue> <major_version>

    deploy.sh脚本的参数说明和取值示例如下:

    参数

    说明

    示例

    <issue>

    操作系统平台类型。取值范围:centos | redhat |rhel | debian | ubuntu | opensuse | sles。参数取值均大小写敏感,其中sles表示SUSE/SLES。

    说明

    如果操作系统是CentOS Stream,操作系统平台类型选择centos

    centos

    <major_version>

    操作系统平台的主要版本号。

    说明

    Ubuntu 14不支持安装阿里云版cloud-init 19.1.21。

    CentOS 7.6的主要版本号为7

    例如,您当前的操作系统为CentOS 7,则需要运行的命令为sudo bash ./deploy.sh centos 7

  7. 确认cloud-init是否安装成功。

    若返回"description": "success",表示安装成功。阿里云cloud-init安装成功

  8. 运行以下命令,查看cloud-init的版本信息是否符合预期。

    cloud-init --version

不同Linux发行平台安装阿里云cloud-init的Shell脚本示例如下,供您参考。实际安装时,请根据您的操作系统适当调整脚本。

CentOS 7/8

# 检查安装python3-pip
if ! python3 -c 'import setuptools' >& /dev/null; then
  yum -y install python3-pip
fi
# 备份旧版cloud-init
test -d /etc/cloud && mv /etc/cloud /etc/cloud-old
# 下载并解压阿里云版cloud-init
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/cloud-init-19.1.21.tgz
tar -zxvf ./cloud-init-19.1.21.tgz
# 安装cloud-init
issue_major=$( cat /etc/redhat-release | grep -Eo '[0-9]+\.?[0-9]+' | head -1 | awk -F'.' '{printf $1}')
bash ./cloud-init-*/tools/deploy.sh centos "$issue_major"

Red Hat Enterprise Linux 7/8

# 检查安装python3-pip
if ! python3 -c 'import setuptools' >& /dev/null; then
  yum -y install python3-pip
fi
# 备份旧版cloud-init
test -d /etc/cloud && mv /etc/cloud /etc/cloud-old
# 下载并解压阿里云版cloud-init
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/cloud-init-19.1.21.tgz
tar -zxvf ./cloud-init-19.1.21.tgz
# 安装cloud-init
issue_major=$( cat /etc/os-release | grep VERSION_ID | grep -Eo '[0-9]+\.?[0-9]+' | head -1 | awk -F'.' '{printf $1}')
bash ./cloud-init-*/tools/deploy.sh rhel "$issue_major"

Ubuntu 16/18/20

# 检查安装python3-pip
if ! python3 -c 'import setuptools' >& /dev/null; then
  apt-get install python36 python3-pip -y
fi
# 备份旧版cloud-init
test -d /etc/cloud && mv /etc/cloud /etc/cloud-old
# 下载并解压阿里云版cloud-init
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/cloud-init-19.1.21.tgz
tar -zxvf ./cloud-init-19.1.21.tgz
# 安装cloud-init
issue_major=$( cat /etc/os-release | grep VERSION_ID | grep -Eo '[0-9]+\.?[0-9]+' | head -1 | awk -F'.' '{printf $1}')
bash ./cloud-init-*/tools/deploy.sh ubuntu "$issue_major"

Debian 9/10

# 检查安装python3-pip
if ! python3 -c 'import setuptools' >& /dev/null; then
  apt-get -y install python3-pip
fi
# 备份旧版cloud-init
test -d /etc/cloud && mv /etc/cloud /etc/cloud-old
# 下载并解压阿里云版cloud-init
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/cloud-init-19.1.21.tgz
tar -zxvf ./cloud-init-19.1.21.tgz
# 安装cloud-init
issue_major=$( cat /etc/os-release | grep VERSION_ID | grep -Eo '[0-9]+\.?[0-9]+' | head -1 | awk -F'.' '{printf $1}')
bash ./cloud-init-*/tools/deploy.sh debian "$issue_major"

SUSE 12/15

# 检查安装python3-pip
if ! python3 -c 'import setuptools'>& /dev/null; then
  zypper -n install python3-pip
fi
# 备份旧版cloud-init
test -d /etc/cloud && mv /etc/cloud/etc/cloud-old
# 下载并解压阿里云版cloud-init
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/cloud-init-19.1.21.tgz
tar -zxvf ./cloud-init-19.1.21.tgz
# 安装cloud-init
issue_major=$( cat /etc/os-release | grep VERSION_ID | grep -Eo '[0-9]+\.?[0-9]+' | head -1 | awk -F'.' '{printf $1}')
bash ./cloud-init-*/tools/deploy.sh sles "$issue_major"

OpenSUSE 15

# 检查安装python3-pip
if ! python3 -c 'import setuptools'>& /dev/null; then
  zypper -n install python3-pip
fi
# 备份旧版cloud-init
test -d /etc/cloud && mv /etc/cloud/etc/cloud-old
# 下载并解压阿里云版cloud-init
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/cloud-init-19.1.21.tgz
tar -zxvf ./cloud-init-19.1.21.tgz
# 安装cloud-init
issue_major=$( cat /etc/os-release | grep VERSION_ID | grep -Eo '[0-9]+\.?[0-9]+' | head -1 | awk -F'.' '{printf $1}')
bash ./cloud-init-*/tools/deploy.sh opensuse"$issue_major"

阿里云版cloud-init 0.7.6a17

说明

阿里云公共镜像CentOS 6、Debian 9及SUSE Linux Enterprise Server 12默认已安装cloud-init-0.7.6a17。如果您需要进行测试,请先运行sudo mv /etc/cloud/cloud.cfg /etc/cloud/cloud.cfg_bak命令备份配置文件。

  1. 运行以下命令,检查操作系统的版本为CentOS 6、Debian 9及SUSE Linux Enterprise Server 12。

    cat /etc/issue
  2. 确保源服务器已安装Python PIP依赖库。

    以安装Python2-pip依赖库为例,安装命令如下。

    CentOS 6/SUSE Linux Enterprise Server 12

    sudo yum -y install python2-pip

    Debian 9

    sudo apt-get -y install python2-pip
  3. 运行以下命令,下载并解压阿里云版cloud-init 0.7.6a17。

    wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloud-init-0.7.6a17.tgz
    tar -zxvf cloud-init-0.7.6a17.tgz
  4. 进入cloud-inittools目录。

    cd cloud-init-0.7.6a17/tools/
  5. 运行以下命令。安装cloud-init。

    sudo bash ./deploy.sh <issue> <major_version>

    例如,您当前的操作系统为CentOS 6,则需要运行的命令为sudo bash ./deploy.sh centos 6

    deploy.sh脚本的参数说明和取值示例如下:

    参数

    说明

    示例

    <issue>

    操作系统平台类型。取值范围:centos | debian | sles。参数取值均大小写敏感,其中sles表示SUSE/SLES。

    centos

    <major_version>

    操作系统平台的主要版本号。

    CentOS 6.5的主要版本号为6

  6. 运行以下命令,查看cloud-init的版本信息是否符合预期。

    cloud-init --version

社区版cloud-init

  1. 确保源服务器已安装Git、Python和Python PIP依赖库。

    以安装Git、Python 3.6和Python3-pip依赖库为例,Linux部分发行版的安装命令如下。

    CentOS/Red Hat Enterprise Linux

    sudo yum -y install git python36 python3-pip

    Ubuntu/Debian

    sudo apt-get -y install git python36 python3-pip

    OpenSUSE/SUSE

    sudo zypper -n install git python36 python3-pip
  2. 运行以下命令使用Git下载cloud-init源码包。

    git clone https://git.launchpad.net/cloud-init
  3. 进入cloud-init目录。

    cd ./cloud-init
  4. 运行以下命令安装所有依赖库。

    sudo pip3 install -r ./requirements.txt
  5. 运行以下命令安装cloud-init。

    python3 setup.py install
  6. 修改配置文件cloud.cfg

    1. 打开配置文件。

      sudo vi /etc/cloud/cloud.cfg

      vi /etc/cloud/cloud.cfg

    2. cloud_init_modules:之前的配置修改为以下内容。

      # Example datasource config
      # The top level settings are used as module
      # and system configuration.
      # A set of users which may be applied and/or used by various modules
      # when a 'default' entry is found it will reference the 'default_user'
      # from the distro configuration specified below
      users:
         - default
      user:
          name: root
          lock_passwd: False
      # If this is set, 'root' will not be able to ssh in and they 
      # will get a message to login instead as the above $user
      disable_root: false
      # This will cause the set+update hostname module to not operate (if true)
      preserve_hostname: false
      syslog_fix_perms: root:root
      datasource_list: [ AliYun ]
      # Example datasource config
      datasource:
          AliYun:
              support_xen: false
              timeout: 5 # (defaults to 50 seconds)
              max_wait: 60 # (defaults to 120 seconds)
      #      metadata_urls: [ 'blah.com' ]
      # The modules that run in the 'init' stage
      cloud_init_modules:
  7. 运行以下命令,查看cloud-init的版本信息是否符合预期。

    cloud-init --version

(可选)步骤三:配置cloud-init

自定义网络配置

如果您的cloud-init版本为18或更高版本,会自动完成网络的初始化配置,自动配置的网络为BOOTPROTO=dhcp DEVICE=eth0 ONBOOT=yes STARTMODE=auto TYPE=Ethernet USERCTL=no。如果系统默认的网络配置不符合您的业务需求,可以参考以下操作修改cloud-init的配置文件实现自定义网络配置。

  1. 安装cloud-init后,打开/etc/cloud/cloud.cfg文件。

    sudo vim /etc/cloud/cloud.cfg
  2. i进入编辑模式,在Example datasource config之前增加disabled配置,禁用cloud-init的网络自动配置功能。

    network:
      config: disabled

    cloud-init-disable-config

    增加该配置之后,cloud-init不会再管理/etc/sysconfig/network-scripts/目录下的网络配置文件(例如ifcfg-eth0),需要您自行管理。

  3. 编辑完成后,按Esc键退出编辑模式,然后输入:wq并回车,保存退出文件。

  4. 根据需求自定义/etc/sysconfig/network-scripts/目录下的网络配置,例如IP地址、子网掩码、网关等。

保留主机名以及/etc/hosts配置文件

默认情况下,cloud-init会在实例启动时自动设置主机名并更新/etc/hosts文件。如果您不希望修改,可以参考以下操作修改cloud-init的配置文件。

  1. 安装cloud-init后,打开/etc/cloud/cloud.cfg文件。

    sudo vim /etc/cloud/cloud.cfg
  2. i进入编辑模式,将preserve_hostname: false修改为preserve_hostname: true

    hostname

    preserve_hostname: true时,cloud-init将不会自动修改主机名以及/etc/hosts文件。

  3. 编辑完成后,按Esc键退出编辑模式,然后输入:wq并回车,保存退出文件。

后续步骤

  • 对于准备迁移上云的Linux服务器,您可以使用服务器迁移中心SMC进行迁移。具体操作,请参见服务器迁移至ECS实例

  • 对于已安装cloud-init但版本低于0.7.9的Linux服务器,可以运行以下命令查看cloud-init的版本信息是否符合预期。如果符合预期版本,则表示cloud-init已成功安装。

    cloud-init --version

    例如您安装的是阿里云版cloud-init 19.1.21。如果回显信息包含19.1.21,则表示cloud-init 19.1.21已成功安装。

  • 对于已在阿里云上运行Linux自定义镜像的ECS实例,您可以重启系统验证结果。如果系统自动配置了主机名、网络和NTP等配置,则表示已成功安装cloud-init。 例如运行如下命令查看网络配置文件:

    sudo reboot
    cat /etc/sysconfig/network-scripts/ifcfg-eth0

    查看结果如下,表示系统已自动配置DHCP协议、网络设备、设备类型等网络配置,表示已成功安装cloud-init。

    BOOTPROTO=dhcp
    DEVICE=eth0
    ONBOOT=yes
    STARTMODE=auto
    TYPE=Ethernet
    USERCTL=no

常见问题

  • 通过Python 3安装cloud-init时,缺少依赖库怎么处理?

    不同镜像缺少的库可能不同,您都可以通过pip安装,之后再次安装cloud-init。

  • cloud-init运行异常,提示报错信息,如何处理?

    如果系统默认的软件包管理器(例如yum)和pip管理器分别安装过不同版本的依赖库,可能造成库版本冲突,导致cloud-init运行异常。建议您根据报错信息按需下载依赖库。

    报错信息

    原因

    排错命令

    no setuptools module in python

    缺失模块python setuptools

    以Python3.6为例:

    • CentOS/Red Hat:yum -y install python3-pip

    • Ubuntu/Debian:apt-get -y install python3-pip

    • OpenSUSE/SUSE:zypper -n install python3-pip

    File "/home/testuser/cloud-init/cloudinit/log.py", line 19, in <module>
          import six
      ImportError: No module named six  )

    缺失依赖库six

    pip3 install six
    File "/home/testuser/cloud-init/cloudinit/url_helper.py", line 20, in <module>
          import oauthlib.oauth1 as oauth1
      ImportError: No module named oauthlib.oauth1  )

    缺失依赖库oauthlib

    pip3 install oauthlib

    报错时没有明确缺少的依赖库

    未映射相关错误信息

    根据cloud-init的requirements.txt文件里显示的库,运行以下命令安装所有依赖库:

    pip3 install -r requirements.txt
  • 实例中安装了新版本的Python 3导致了cloud-init执行异常,如何处理?

    如果您在实例中安装了新版本的Python 3(例如Python 3.9),并将新版本的Python 3设置为默认版本(即已为新版Python 3创建了软链接,例如,ln -s /usr/bin/python3.9 /usr/bin/python3),则会导致已安装的cloud-init执行异常。例如,运行cloud-init --version将会报错:

    $cloud-init --version
    Traceback (most recent call last):
      File "/usr/local/bin/cloud-init", line 33, in <module>
        sys.exit(load_entry_point('cloud-init==19.1.9', 'console_scripts', 'cloud-init')())
      File "/usr/local/bin/cloud-init", line 22, in importlib_load_entry_point
        for entry_point in distribution(dist_name).entry_points
      File "/usr/lib64/python3.9/importlib/metadata.py", line 524, in distribution
        return Distribution.from_name(distribution_name)
      File "/usr/lib64/python3.9/importlib/metadata.py", line 187, in from_name
        raise PackageNotFoundError(name)
    importlib.metadata.PackageNotFoundError: cloud-init

    您可以通过以下任意一种方式解决该问题:

    • 方式一:使用新版的Python 3重新安装cloud-init。

    • 方式二:修改cloud-init执行文件,将Python解释器对应的路径修改为历史版本的Python 3。以Python 3.6为例,修改cloud-init执行文件中解释器的操作如下:

      1. 运行以下命令,打开cloud-init文件。

        vim   /usr/local/bin/cloud-init
      2. i进入编辑模式,将文件开头#!后的内容修改为Python 3.6所在的路径。

        修改后,对应的#!行内容如下所示:

        #!/usr/bin/python3.6
      3. Esc键退出编辑模式,然后输入:wq并回车,保存退出文件。

  • 安装cloud-init后,在创建实例时设置的实例元数据中的自定义数据(User data)不执行或者执行失败,如何处理?

    1. 在实例内运行以下命令,检查实例元数据中的user-data是否存在。

      curl http://100.100.100.200/latest/user-data

      检查结果说明:

      • 如果已设置了user-data,则会返回对应的user-data信息。您需要继续下一步进行问题排查。

      • 如果没有返回信息,则表示您没有设置user-data。

    2. 通过多种方式,排查user-data不执行或执行失败的原因。

      • 检查user-data数据格式是否准确。

        user-data的数据由cloud-init执行,您需要确保数据格式准确无误。例如,user-data的首行必须以#!开头。更多信息,请参见自定义实例初始化配置

      • 通过cloud-init的日志文件/var/log/cloud-init.log,查看user-data执行结果,并根据报错信息排查问题。

        日志文件记录信息示例如下:

         util.py[DEBUG]: Running command ['/var/lib/cloud/instance/scripts/part-001'] with allowed return codes [0] (shell=False, capture=False)
      • 查看user-data执行过程的标准输出以及标准错误输出。

        在Linux系统初始化工具systemd中,user-data由系统服务cloud-final.service执行,您可以运行以下命令查看user-data执行过程的标准输出以及标准错误输出,并根据输出内容排查问题。

        journalctl -u cloud-final.service
      • 如果以上方式均无法定位user-data不执行或者执行失败的原因,建议您将user-data内容拷贝到本地主机进行调试,查看是否可以成功执行。

  • 安装cloud-init后,但系统初始化配置和实例自定义数据(User data)脚本无法正常执行,如何处理?

    1. 运行以下命令,检查cloud-init的四个服务是否设置为开机自启动。

      systemctl is-enabled cloud-init-local.service
      systemctl is-enabled cloud-init.service
      systemctl is-enabled cloud-config.service
      systemctl is-enabled cloud-final.service

      如果出现报错信息或者disabled信息,表示cloud-init未设置开机自启动。

    2. 运行以下命令,设置cloud-init开机自启动。

      systemctl enable cloud-init-local.service
      systemctl enable cloud-init.service
      systemctl enable cloud-config.service
      systemctl enable cloud-final.service
  • 在创建实例时对系统盘进行扩容,但在实例内部发现根分区大小并没有自动扩容,如何处理?

    Linux实例分区自动扩容由cloud-init提供支持,需要确保系统安装growpart工具且cloud.cfg文件中配置正确。

    1. 运行以下命令,检查系统是否安装growpart工具。

      which growpart
    2. (条件必选)如果没有安装,运行以下命令安装growpart工具。

      • RHEL系列:

        sudo yum -y install cloud-utils-growpart
      • Debian系列:

        sudo apt -y install cloud-guest-utils
    3. 运行以下命令,查看/etc/cloud/cloud.cfg文件中是否存在如下图中的内容。

      cat /etc/cloud/cloud.cfg

      配置内容

    4. (条件必选)如果不存在,添加该内容到/etc/cloud/cloud.cfg文件中。

  • 0.7.6a16及以下版本cloud-init的ECS实例在控制台更新hostname后,重启实例后未生效,如何处理?

    • 问题描述

      在ECS控制台更新hostname后,重启ECS实例,新的hostname未设置成功,且执行cloud-init --version命令查看cloud-init版本为0.7.6a16或以下。

    • 问题原因

      cloud-init通过update_hostname模块更新hostname时,会执行hostname命令获取当前系统的hostname,并读取/var/lib/cloud/data/previous-hostname文件获取cloud-init数据缓存中的hostname,然后判断两者是否一致。如果一致,会更新hostname;如果不一致,则认为已手动修改过主机名,不会更新hostname。

      在Red Hat系列的操作系统中,读取的/var/lib/cloud/data/previous-hostname做了换行符处理,但是hostname命令的输出没有做换行符处理,导致两者结果不一致,进而导致未更新hostname。

    • 解决方案

      您可以选择以下任意一种方案来处理该问题:

      • 升级cloud-init版本。具体操作,请参见步骤二:安装cloud-init

        • 如果使用的是CentOS 6及以下系统,请使用cloud-init 0.7.6a17版本。

        • 如果使用的是CentOS 7版本,请使用cloud-init 19.1.21版本。

        • 如果使用的是CentOS 8及以上系统,推荐使用cloud-init 23.2.2及以上版本。

      • 手动处理换行符。

        手动修改cloud-init有缺陷的文件cloudinit/distros/rhel.py(通过find / -name rhel.py命令获取文件路径),参考distros/rhel.py: _read_hostname() missing strip on "hostname" hostname命令输出的换行符进行处理。处理示例如下:

        diff --git a/cloudinit/distros/rhel.py b/cloudinit/distros/rhel.py
        index 0b68414e..65176e99 100644
        --- a/cloudinit/distros/rhel.py
        +++ b/cloudinit/distros/rhel.py
        @@ -143,6 +143,7 @@ class Distro(distros.Distro):
                     return util.load_file(filename).strip()
                 elif self.uses_systemd():
                     (out, _err) = util.subp(['hostname'])
        +            out = out.strip()
                     if len(out):
                         return out
                     else: