全部產品
Search
文件中心

Elastic Compute Service:安裝cloud-init

更新時間:Nov 29, 2024

cloud-init是一款開源初始化工具,能夠為Linux作業系統提供初始化密碼、設定主機名稱、執行自訂指令碼等初始化配置能力。如果您本地製作的自訂鏡像未安裝cloud-init且需要遷移上雲,需要手動安裝cloud-init,否則使用該自訂鏡像的建立ECS執行個體將無法自動執行設定主機名稱、配置網路等初始化任務,進而影響執行個體的自動化部署與配置效率。本文介紹如何在Linux作業系統中安裝cloud-init。

關於cloud-init的更多資訊,請參見cloud-init官方文檔

操作環境

阿里雲所有公用鏡像已預設安裝cloud-init,為了保證使用您本地自訂鏡像建立的ECS執行個體能自動初始化系統配置,建議您結合實際情況,參考以下相關建議並執行相應操作。

  • 準備遷移上雲但未安裝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的預設設定檔,按i進入插入模式。

    sudo vim /etc/cloud/cloud.cfg
  2. Example datasource config之前增加disabled配置,禁用cloud-init的網路自動設定功能。

    network:
      config: disabled

    image

    增加該配置之後,cloud-init不會再管理/etc/sysconfig/network-scripts/目錄下的網路設定檔(例如ifcfg-eth0),需要您自行管理。

  3. Esc鍵,輸入:wq,按Enter鍵關閉並儲存設定檔。

  4. 根據需求自訂/etc/sysconfig/network-scripts/目錄下的網路設定,例如IP地址、子網路遮罩、網關等。

禁用阿里雲自動化佈建主機名稱

預設情況下,cloud-init會在執行個體啟動時自動化佈建主機名稱並更新/etc/hostname檔案。如果您不希望修改,可以參考以下操作修改cloud-init的設定檔。

  1. 運行以下命令,以開啟cloud-init的預設設定檔,按i進入編輯模式。

    sudo vim /etc/cloud/cloud.cfg
  2. 將設定檔中的preserve_hostname: false修改為preserve_hostname: true

    image

  3. Esc鍵,輸入:wq,按Enter鍵關閉並儲存設定檔。

後續步驟

  • 對於準備遷移上雲的Linux伺服器,您可以使用Server Migration Center進行遷移。具體操作,請參見伺服器遷移至ECS執行個體

  • 對於已在阿里雲上運行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: