在使用Linux類型自訂鏡像時,為保證運行該鏡像的執行個體能成功完成初始化配置,建議您根據本文描述在原始伺服器上安裝cloud-init。
什麼是cloud-init
cloud-init是雲平台為Linux作業系統的虛擬機器做系統初始化配置的開源服務軟體。阿里雲、AWS、Azure和OpenStack等主流雲平台均支援cloud-init。更多詳情,請參見cloud-init官方文檔。
阿里雲cloud-init能在執行個體啟動階段完成初始化配置,包括網路、NTP、軟體源、主機名稱和SSH金鑰組等,同時進行執行個體自訂資料(User data)指令碼的執行。
適用對象
阿里雲所有公用鏡像預設安裝cloud-init。如果您在以下情境中使用自訂鏡像時,為保證建立的執行個體能自動初始化系統配置,建議您為Linux伺服器安裝阿里雲版本cloud-init:
- 準備遷移上雲的,但未安裝cloud-init的Linux伺服器。
- 已安裝cloud-init,但版本低於0.7.9的Linux伺服器。
- 已在阿里雲啟動並執行,但未安裝cloud-init的ECS執行個體。
檢查版本
不同雲平台及不同版本之間的cloud-init可能互相不相容,請選擇合適版本並配置合適的資料來源(datasource)。其中阿里雲cloud-init的版本為0.7.6a,資料來源為Aliyun
。
安裝cloud-init後,預設開啟開機自啟動選項,若所選版本不相容或資料來源配置不當,下次重啟伺服器時可能導致cloud-init運行異常和系統啟動緩慢,甚至無法正常啟動系統。安裝前請做好資料備份,不準備遷移上雲的伺服器需謹慎安裝。
-
如何檢查是否已安裝cloud-init:
which cloud-init
说明 無輸出資訊表示未安裝,您需要安裝阿里雲版本cloud-init。 -
如何檢查cloud-init版本號碼命令:
cloud-init --version
说明 如果版本低於社區0.7.9版本(0.7.6a版本除外),您需要安裝阿里雲版本cloud-init。
(推薦)安裝阿里雲版本cloud-init
- 檢查並安裝python-pip依賴庫。
- 下載阿里雲版本cloud-init並解壓到目前的目錄:
wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/cloudinit/ali-cloud-init-latest.tgz tar -zxvf ali-cloud-init-latest.tgz
- 進入cloud-init的tools目錄,執行cloud-init安裝指令碼deploy.sh:
bash ./deploy.sh <issue> <major_version>
-
參數說明如下:
- issue:作業系統平台類型,取值範圍:centos | redhat |rhel | debian | ubuntu | opensuse | sles。參數取值均大小寫敏感,其中sles表示SUSE/SLES。
- major_version:作業系統平台主要版本號碼。例如,CentOS 6.5的主要版本號碼為6。
-
命令樣本如下:
- 在CentOS 6.5中安裝cloud-init:
bash ./deploy.sh centos 6
- 在Ubuntu 14.04中安裝cloud-init:
bash ./deploy.sh ubuntu 14
- 在CentOS 6.5中安裝cloud-init:
-
- 確認是否成功安裝。若返回
"description": "success"
,表示安裝成功。
安裝阿里雲版本cloud-init樣本
以下為不同發行平台的安裝命令樣本供您參考:
- CentOS 6/7
# 檢查安裝python-pip if ! python -c 'import setuptools' >& /dev/null; then yum -y install python-pip fi # 備份舊版cloud-init配置 test -d /etc/cloud && mv /etc/cloud /etc/cloud-old # 下載並解壓阿里雲版本cloud-init wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/cloudinit/ali-cloud-init-latest.tgz tar -zxvf ./ali-cloud-init-latest.tgz # 安裝cloud-init issue_major=$( cat /etc/redhat-release | awk '{printf $3}' | awk -F'.' '{printf $1}') bash ./cloud-init-*/tools/deploy.sh centos "$issue_major"
- RHEL 6/7
# 檢查安裝python-pip if ! python -c 'import setuptools' >& /dev/null; then yum -y install python-pip fi # 備份舊版cloud-init配置 test -d /etc/cloud && mv /etc/cloud /etc/cloud-old # 下載並解壓阿里雲版本cloud-init wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/cloudinit/ali-cloud-init-latest.tgz tar -zxvf ./ali-cloud-init-latest.tgz # 安裝cloud-init issue_major=$(cat /etc/os-release | grep VERSION_ID | awk -F'"' '{printf $2}' | awk -F'.' '{printf $1}') bash ./cloud-init-*/tools/deploy.sh rhel "$issue_major"
- Ubuntu 14/16/18
# 檢查安裝python-pip if ! python -c 'import setuptools' >& /dev/null; then apt-get install python-pip -y fi # 備份舊版cloud-init配置 test -d /etc/cloud && mv /etc/cloud /etc/cloud-old # 下載並解壓阿里雲版本cloud-init wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/cloudinit/ali-cloud-init-latest.tgz tar -zxvf ./ali-cloud-init-latest.tgz # 安裝cloud-init issue_major=$(cat /etc/os-release | grep VERSION_ID | awk -F'"' '{printf $2}' | awk -F'.' '{printf $1}') bash ./cloud-init-*/tools/deploy.sh ubuntu "$issue_major"
- Debian 8/9
# 檢查安裝python-pip if ! python -c 'import setuptools' >& /dev/null; then apt-get -y install python-pip fi # 備份舊版cloud-init配置 test -d /etc/cloud && mv /etc/cloud /etc/cloud-old # 下載並解壓阿里雲版本cloud-init wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/cloudinit/ali-cloud-init-latest.tgz tar -zxvf ./ali-cloud-init-latest.tgz # 安裝cloud-init issue_major=$(cat /etc/os-release | grep VERSION_ID | awk -F'"' '{printf $2}' | awk -F'.' '{printf $1}') bash ./cloud-init-*/tools/deploy.sh debian "$issue_major"
- SUSE 11/12
# 檢查安裝python-pip if ! python -c 'import setuptools'>& /dev/null; then zypper -n install python-pip fi # 備份舊版cloud-init配置 test -d /etc/cloud && mv /etc/cloud/etc/cloud-old # 下載並解壓阿里雲版本cloud-init wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/cloudinit/ali-cloud-init-latest.tgz tar -zxvf ./ali-cloud-init-latest.tgz # 安裝cloud-init issue_major=$(cat /etc/os-release | grep VERSION_ID | awk -F'"' '{printf $2}' | awk -F'.' '{printf $1}') bash ./cloud-init-*/tools/deploy.sh sles "$issue_major"
- OpenSUSE 13/42
# 檢查安裝python-pip if ! python -c 'import setuptools'>& /dev/null; then zypper -n install python-pip fi # 備份舊版cloud-init配置 test -d /etc/cloud && mv /etc/cloud/etc/cloud-old # 下載並解壓阿里雲版本cloud-init wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/cloudinit/ali-cloud-init-latest.tgz tar -zxvf ./ali-cloud-init-latest.tgz # 安裝cloud-init issue_major=$(cat /etc/os-release | grep VERSION_ID | awk -F'"' '{printf $2}' | awk -F'.' '{printf $1}') bash ./cloud-init-*/tools/deploy.sh opensuse"$issue_major"
(可選)安裝社區版cloud-init
前提條件
安裝cloud-init之前,原始伺服器必須安裝git、python 2.7和python-pip依賴軟體,以下是安裝命令供您參考:
- CentOS/RedHat:
yum -y install git python python-pip
- Ubuntu/Debian:
apt-get -y install git python python-pip
- OpenSUSE/SUSE:
zypper -n install git python python-pip
操作步驟
- 登入原始伺服器。
- 使用git下載cloud-init源碼包,並進入cloud-init目錄:
git clone https://git.launchpad.net/cloud-init cd ./cloud-init
- 安裝所有依賴庫:
pip install -r ./requirements.txt
- 安裝cloud-init:
python setup.py install
- 運行
vi /etc/cloud/cloud.cfg
修改設定檔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:
下一步
排查故障
- 不同鏡像缺少的庫可能不同,您都可以通過pip安裝,之後再次安裝cloud-init。
- 如果系統預設軟體包管理器(例如yum)和pip管理器分別安裝過不同版本的依賴庫,可能造成庫版本衝突,導致cloud-init運行異常。建議您根據報錯資訊按需下載依賴庫。
報錯:no setuptools module in python
no setuptools module in python
,表示您需要安裝python setuptools。通過以下方式解決:
- CentOS/RedHat:
yum -y install python-pip
- Ubuntu/Debian:
apt-get -y install python-pip
- OpenSUSE/SUSE:
zypper -n install python-pip
報錯:No module named six
使用pip安裝six庫 pip install six
可以解決以下報錯。
File "/root/cloud-init/cloudinit/log.py", line 19, in <module>
import six
ImportError: No module named six )
報錯:No module named oauthlib.oauth1
使用pip安裝oauthlib庫pip install oauthlib
可以解決以下報錯。
File "/root/cloud-init/cloudinit/url_helper.py", line 20, in <module>
import oauthlib.oauth1 as oauth1
ImportError: No module named oauthlib.oauth1 )
報錯時沒有明確缺少的依賴庫
pip install -r requirements.txt