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
登入原始伺服器。
運行以下命令檢查是否已安裝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,可直接執行後續步驟。
為避免安裝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,該版本已變為軟體包維護方式,您可以選擇適合自己作業系統版本的軟體包進行安裝,也可以選擇使用源碼包進行安裝。
以下操作分別以Debian 12和CentOS Stream 9系統下載安裝二進位軟體包為例,介紹如何安裝cloud-init。
Debian 12
運行以下命令,下載cloud-init軟體包。
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/debian12/cloud-init_23.2.2-5_all.deb
運行以下命令,安裝軟體包。
sudo apt-get install -y ./cloud-init_23.2.2-5_all.deb
(可選)為了避免後期軟體封裝更新或升級到開源更高版本,建議您運行以下命令,固化cloud-init的軟體包版本。
sudo apt-mark hold cloud-init
運行以下命令,查看cloud-init的版本資訊是否符合預期。
cloud-init --version
CentOS Stream 9
運行以下命令,下載cloud-init軟體包。
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/centosstream9/cloud-init-23.2.2-5.el9.noarch.rpm
運行以下命令,安裝軟體包。
sudo yum install -y ./cloud-init-23.2.2-5.el9.noarch.rpm
(可選)為了避免後期軟體封裝更新或升級到開源更高版本,建議您運行以下命令,固定cloud-init的軟體包版本。
sudo sh -c 'echo "exclude=cloud-init" >> /etc/dnf/dnf.conf'
運行以下命令,查看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
確保原始伺服器已安裝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
運行以下命令下載阿里雲版cloud-init。
wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/cloudinit/cloud-init-19.1.21.tgz
運行以下命令解壓cloud-init安裝包到目前的目錄。
tar -zxvf cloud-init-19.1.21.tgz
進入cloud-init目錄下,並安裝依賴庫。
cd ./cloud-init-19.1.21 pip3 install -r ./requirements.txt
進入cloud-init的tools目錄。
cd ./tools
運行以下命令執行安裝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
。確認cloud-init是否安裝成功。
若返回
"description": "success"
,表示安裝成功。運行以下命令,查看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
命令備份設定檔。
運行以下命令,檢查作業系統的版本為CentOS 6、Debian 9及SUSE Linux Enterprise Server 12。
cat /etc/issue
確保原始伺服器已安裝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
運行以下命令,下載並解壓阿里雲版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
進入cloud-init的tools目錄。
cd cloud-init-0.7.6a17/tools/
運行以下命令。安裝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
運行以下命令,查看cloud-init的版本資訊是否符合預期。
cloud-init --version
社區版cloud-init
確保原始伺服器已安裝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
運行以下命令使用Git下載cloud-init源碼包。
git clone https://git.launchpad.net/cloud-init
進入cloud-init目錄。
cd ./cloud-init
運行以下命令安裝所有依賴庫。
sudo pip3 install -r ./requirements.txt
運行以下命令安裝cloud-init。
python3 setup.py install
修改設定檔cloud.cfg。
開啟設定檔。
sudo vi /etc/cloud/cloud.cfg
將
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:
運行以下命令,查看cloud-init的版本資訊是否符合預期。
cloud-init --version
(可選)步驟三:配置cloud-init
禁用阿里雲自動設定網路初始化
如果您的cloud-init版本為18或更高版本,會自動完成網路的初始化配置,自動設定的網路為BOOTPROTO=dhcp DEVICE=eth0 ONBOOT=yes STARTMODE=auto TYPE=Ethernet USERCTL=no
。如果系統預設的網路設定不符合您的業務需求,可以參考以下操作修改cloud-init的設定檔,以實現自訂網路設定。
運行以下命令,以開啟cloud-init的預設設定檔,按
i
進入插入模式。sudo vim /etc/cloud/cloud.cfg
在
Example datasource config
之前增加disabled配置,禁用cloud-init的網路自動設定功能。network: config: disabled
增加該配置之後,cloud-init不會再管理/etc/sysconfig/network-scripts/目錄下的網路設定檔(例如
ifcfg-eth0
),需要您自行管理。按
Esc
鍵,輸入:wq
,按Enter
鍵關閉並儲存設定檔。根據需求自訂/etc/sysconfig/network-scripts/目錄下的網路設定,例如IP地址、子網路遮罩、網關等。
禁用阿里雲自動化佈建主機名稱
預設情況下,cloud-init會在執行個體啟動時自動化佈建主機名稱並更新/etc/hostname
檔案。如果您不希望修改,可以參考以下操作修改cloud-init的設定檔。
運行以下命令,以開啟cloud-init的預設設定檔,按
i
進入編輯模式。sudo vim /etc/cloud/cloud.cfg
將設定檔中的
preserve_hostname: false
修改為preserve_hostname: true
。按
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