在使用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

  1. 檢查並安裝python-pip依賴庫。
  2. 下載阿里雲版本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
  3. 進入cloud-inittools目錄,執行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
  4. 確認是否成功安裝。若返回"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

操作步驟

  1. 登入原始伺服器。
  2. 使用git下載cloud-init源碼包,並進入cloud-init目錄:
    git clone https://git.launchpad.net/cloud-init
    cd ./cloud-init
  3. 安裝所有依賴庫:
    pip install -r ./requirements.txt
  4. 安裝cloud-init:
    python setup.py install
  5. 運行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:

下一步

  • 對於準備遷移上雲的Linux伺服器:您可以使用遷雲工具遷移匯入自訂鏡像
  • 對於已在阿里雲上啟動並執行Linux自訂鏡像ECS執行個體:您可以重啟系統驗證結果。如果系統自動設定了主機名稱、軟體源和NTP等配置,則表示已成功安裝cloud-init。

排查故障

说明
  • 不同鏡像缺少的庫可能不同,您都可以通過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  )

報錯時沒有明確缺少的依賴庫

如果安裝報錯時,沒有明確提示缺少哪些依賴庫時,您可以根據cloud-init的requirements.txt檔案裡顯示的庫,安裝所有依賴庫:
pip install -r requirements.txt

參考連結

cloud-init官網 - 阿里雲資料來源說明文檔