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服務器,您可以使用服務器遷移中心SMC進行遷移。具體操作,請參見服務器遷移至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
常見問題
不同鏡像缺少的庫可能不同,您都可以通過pip安裝,之后再次安裝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(例如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執行文件中解釋器的操作如下:
運行以下命令,打開cloud-init文件。
vim /usr/local/bin/cloud-init
按i進入編輯模式,將文件開頭
#!
后的內容修改為Python 3.6所在的路徑。修改后,對應的
#!
行內容如下所示:#!/usr/bin/python3.6
按Esc鍵退出編輯模式,然后輸入
:wq
并回車,保存退出文件。
在實例內運行以下命令,檢查實例元數據中的user-data是否存在。
curl http://100.100.100.200/latest/user-data
檢查結果說明:
如果已設置了user-data,則會返回對應的user-data信息。您需要繼續下一步進行問題排查。
如果沒有返回信息,則表示您沒有設置user-data。
通過多種方式,排查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的四個服務是否設置為開機自啟動。
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未設置開機自啟動。運行以下命令,設置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文件中配置正確。
運行以下命令,檢查系統是否安裝growpart工具。
which growpart
(條件必選)如果沒有安裝,運行以下命令安裝growpart工具。
RHEL系列:
sudo yum -y install cloud-utils-growpart
Debian系列:
sudo apt -y install cloud-guest-utils
運行以下命令,查看/etc/cloud/cloud.cfg文件中是否存在如下圖中的內容。
cat /etc/cloud/cloud.cfg
(條件必選)如果不存在,添加該內容到/etc/cloud/cloud.cfg文件中。
問題描述
在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: