CDN加速

文档中心 云服务器 操作指南 cloud-init相关说明

cloud-init相关说明

更新时间:2021-04-26 13:48:57

网宿云的云服务器使用cloud-init进行云服务器的初始化设置。
cloud-init版本过低可能会影响控制台功能,包括:设置密码、设置密钥、设置hostname、自定义数据、系统盘扩容。

以下情况下cloud-init可能会受影响,导致相关功能异常:

  1. 误操作删除了cloud-init相关文件,例如 rm /xxx
  2. 云主机中毒导致cloud-init失效
  3. 云平台旧版本镜像创建的云主机,没有严格按照指导步骤对cloud-init进行升级

针对第三点,请自查cloud-init版本是否满足要求。
Linux操作系统可通过’cloud-init --version’命令查看cloud-init版本
SD-WAN的作用有哪些
Windows操作系统:控制面板 – 程序 – 程序和功能
SD-WAN的作用有哪些

请确保cloud-init升级到适用版本,版本要求如下。

操作系统 Cloud-init版本
Linux 17.1.0及以上
Windows 0.9.11及以上

网宿云的公有镜像默认安装了cloud-init,最新的公有镜像使用社区版cloud-init,而历史公有镜像使用网宿自研版的cloud-init,自研版的cloud-init有多个版本,不同版本间可能有不同的功能限制。下文介绍已知的功能限制及解决方法。

已知功能限制 涉及镜像 解决方法
不支持系统盘扩容 Linux、Windows 联系网宿云技术支持或项目经理协助处理。
不支持绑定多个密钥 Linux 联系网宿云技术支持或项目经理协助处理。
不支持设置/更新hostname Linux、Windows 联系网宿云技术支持或项目经理协助处理。
不支持自定义数据 Linux、Windows 先判断是否支持设置hostname。
如果不支持设置hostname,请联系网宿云技术支持或项目经理协助处理。
如果支持设置hostname,但是不支持自定义数据。请按Linux升级cloudinit到社区版操作,并在控制台重启云服务器;Windows只需要在控制台重启云服务器即可。
支持设置hostname但不支持设置带domain的hostname Linux 请按安装社区版Cloudinit操作,并在控制台重启云服务器。
支持设置hostname但在操作系统内手动设置的hostname会被还原为云平台设置的 Linux 有两种方法:
1. 请按Linux升级cloudinit到社区版操作,并在控制台重启云服务器。
2. 注释掉/etc/cloud/cloud.cfg文件的set_hostname和update_hostname。但操作后不支持通过控制台修改hostname。
手动升级cloud-init后(如yum update -y),设置密码、设置密钥、设置hostname、自定义数据等功能异常。 Linux 先判断是否支持设置hostname。
如果不支持设置hostname,请联系网宿云技术支持或项目经理协助处理。
如果支持设置hostname。请按Linux升级cloudinit到社区版操作,并在控制台重启云服务器。

注意:以上限制是针对历史公有镜像创建出来的云服务器的。对于由这些云服务器创建出来的私有镜像,也由同样的限制。建议使用新的公有镜像重新制作私有镜像或者按照安装社区版cloudinit 进行操作。

Linux升级cloud-init到社区版

  • CentOS 6.X

因为CentOS 6.X官方仓库中最新的cloudinit版本只有0.7.5。所以这里采用python安装的方式安装17.1版本的社区版cloudinit。

# 先卸载已有的 cloud-init
yum -y remove cloud-init
rm -f /etc/cloud/cloud.cfg.rpmsave
# 获取 cloud-init-17.1 源码
wget https://launchpad.net/cloud-init/trunk/17.1/+download/cloud-init-17.1.tar.gz
tar xzf cloud-init-17.1.tar.gz
cd ./cloud-init-17.1
# 安装 python-pip 用于安装 cloud-init 的依赖包
wget https://dl.fedoraproject.org/pub/epel/6/x86_64/Packages/p/python-pip-7.1.0-1.el6.noarch.rpm
which pip2 || rpm -ivh python-pip-7.1.0-1.el6.noarch.rpm
rm -f python-pip-7.1.0-1.el6.noarch.rpm
# 修改 cloud-init 依赖包的版本
# 因为 CentOS 6 默认的 Python 版本为 2.6,部分依赖包的最新版已经放弃支持 Python 2.6,所以,这里将依赖包的版本设置为最后
# 一个支持 Python 2.6 的版本 
sed -i 's/^\(oauthlib\)/\1==2.0.1/g; s/^\(requests\)/\1==2.18.4/g; s/^\(jsonschema\)/\1==2.5.1/g' requirements.txt
sed -i 's/^jinja2.*/jinja2==2.7.2/g' requirements.txt
export pip_options=" -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com --retries 100 -q -U"
pip2 install ${pip_options} --force setuptools==36.8.0
pip2 install ${pip_options} -r requirements.txt
# 安装 cloud-init 17.1
python setup.py install >/dev/null
# 将 sysvinit 启动脚本拷贝到 /etc/rc.d/
\cp sysvinit/redhat/* /etc/rc.d/init.d/
\cp tools/21-cloudinit.conf /etc/rsyslog.d/
# 修改 cloud-init 的配置文件
sed -i 's/^\(disable_root:\).*$/\1 false/g' /etc/cloud/cloud.cfg
sed -i 's/^\(ssh_pwauth:\).*$/\1 true/g' /etc/cloud/cloud.cfg
sed -i "/max_wait/a datasource_list: ['ConfigDrive']\n\nnetwork: {config: disabled}" /etc/cloud/cloud.cfg
sed -i '/keys-to-console/d' /etc/cloud/cloud.cfg
sed -i "s/.*\(update_etc_hosts\).*/ - ['\1', 'once-per-instance']/" /etc/cloud/cloud.cfg
sed -i 's/WARNING/CRITICAL/g' /etc/cloud/cloud.cfg.d/05_logging.cfg
sed -i '/^\s\+-.*\*log_syslog/ s/.*/#&/' /etc/cloud/cloud.cfg.d/05_logging.cfg
# 将 cloud-init 设置为自动启动
chkconfig --add cloud-init-local
chkconfig --add cloud-init
chkconfig --add cloud-config
chkconfig --add cloud-final
chkconfig cloud-init-local on
chkconfig cloud-init on
chkconfig cloud-config on
chkconfig cloud-final on
# 修正 "'datetime.timedelta' object has no attribute 'total_seconds'" 错误
# 否则,执行 cloud-init analyze blame 命令会报错
pyscript=/usr/lib/python2.6/site-packages/cloud_init-17.1-py2.6.egg/cloudinit/analyze/show.py
sed -i '/\.total_seconds()/a \ \ \ \ td = t2 - t1\n    return (td.microseconds + \\\
            (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6' $pyscript
sed -i '/\.total_seconds()/d' $pyscript
find /usr/lib/python2.6/site-packages/cloud_init-17.1-py2.6.egg/cloudinit/ \( -name '*.pyc' -o -name '*.pyo' \) -exec rm -f {} \;
# 将 OpenSSH 的启动顺序调整为在 cloud-init 之后,避免重置密码后,短时间内旧密码仍能登录的问题
grep 'cloud-init' /etc/init.d/sshd || \
sed -i 's/^\(# Should-Start:.*\)$/\1 cloud-init/g' /etc/init.d/sshd
# 创建 sem 文件
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_set_hostname \;
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_set_passwords \;
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_ssh \;
#find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_update_hostname \;
rm -f /var/lib/cloud/instance/{*.txt*,obj*pkl}
  • CentOS 7.X
# 先卸载已有的 cloud-init
yum -y remove cloud-init
rm -f /etc/cloud/cloud.cfg.rpmsave
# 再安装社区版 cloud-init
yum -y install cloud-init
# 修改 cloud-init 的配置文件
sed -i 's/^\(disable_root:\).*$/\1 false/g' /etc/cloud/cloud.cfg
sed -i 's/^\(ssh_pwauth:\).*$/\1 true/g' /etc/cloud/cloud.cfg
sed -i "/mount_default_fields/i datasource_list: ['ConfigDrive']\nnetwork: {config: disabled}" /etc/cloud/cloud.cfg
sed -i '/keys-to-console/d' /etc/cloud/cloud.cfg
sed -i "s/.*\(update_etc_hosts\).*/ - ['\1', 'once-per-instance']/" /etc/cloud/cloud.cfg
sed -i 's/WARNING/CRITICAL/g' /etc/cloud/cloud.cfg.d/05_logging.cfg
sed -i '/^\s\+-.*\*log_syslog/ s/.*/#&/' /etc/cloud/cloud.cfg.d/05_logging.cfg
for item in cloud-init-local cloud-init cloud-config cloud-final; do
    sed -i 's/^\(StandardOutput\)=.*$/\1=journal/' /usr/lib/systemd/system/${item}.service
done
# 将 OpenSSH 的启动顺序调整为在 cloud-init 之后,避免重置密码后,短时间内旧密码仍能登录的问题
sed -i 's/^\(After=.*\)$/\1 cloud-init.service/g' /usr/lib/systemd/system/sshd.service
systemctl daemon-reload
# 创建 sem 文件
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_set_hostname \;
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_set_passwords \;
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_ssh \;
rm -f /var/lib/cloud/instance/{*.txt*,obj*pkl}
#解决系统内设置的hostname被重置为云平台设置的hostname的问题
echo ''  > /var/lib/cloud/data/previous-hostname
  • Ubuntu 14.04

因为Ubuntu14官方仓库中最新的cloudinit版本只有0.7.5。所以这里采用python安装的方式安装17.1版本的社区版cloudinit。

# 先卸载已有的 cloud-init
apt-get -y remove cloud-init
rm -rf /etc/cloud/*
rm -rf /usr/lib/python2.7/dist-packages/cloudinit
# 获取 cloud-init-17.1 源码
wget https://launchpad.net/cloud-init/trunk/17.1/+download/cloud-init-17.1.tar.gz
tar xzf cloud-init-17.1.tar.gz
cd ./cloud-init-17.1
# 安装 python-pip 用于安装 cloud-init 的依赖包
export pip_options=" -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com --retries 100 -q"
wget https://bootstrap.pypa.io/get-pip.py 
python2 get-pip.py ${pip_options}
# 安装 cloud-init 的依赖包
pip2 install ${pip_options} --ignore-installed six
pip2 install ${pip_options} -r requirements.txt
# 安装 cloud-init 17.1
python2 setup.py install --prefix /usr --install-scripts /usr/bin --install-layout deb
# 修改 cloud-init 的配置文件
sed -i 's/^\(disable_root:\).*$/\1 false/g' /etc/cloud/cloud.cfg
sed -i '/^disable_root:/i ssh_pwauth: true' /etc/cloud/cloud.cfg
sed -i "/max_wait/a datasource_list: ['ConfigDrive']\n\nnetwork: {config: disabled}" /etc/cloud/cloud.cfg
sed -i '/apt-configure/d' /etc/cloud/cloud.cfg
sed -i '/keys-to-console/d' /etc/cloud/cloud.cfg
sed -i "s/.*\(update_etc_hosts\).*/ - ['\1', 'once-per-instance']/" /etc/cloud/cloud.cfg
sed -i 's/WARNING/CRITICAL/g' /etc/cloud/cloud.cfg.d/05_logging.cfg
sed -i '/^\s\+-.*\*log_syslog/ s/.*/#&/' /etc/cloud/cloud.cfg.d/05_logging.cfg
find /etc/rc*.d/ -name '*cloud-init-sshkey' -exec rm -f {} \;
# 将 OpenSSH 的启动顺序调整为在 cloud-init 之后,避免重置密码后,短时间内旧密码仍能登录的问题
sed -i 's/^\(start on\).*$/\1 (runlevel [2345] and stopped cloud-init)/g' /etc/init/ssh.conf
# 创建 sem 文件
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_set_hostname \;
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_set_passwords \;
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_ssh \;
rm -f /var/lib/cloud/instance/{*.txt*,obj*pkl}
  • Ubuntu 16.04
# 先卸载已有的 cloud-init
apt-get -y remove cloud-init
rm -rf /etc/cloud/*
rm -rf /usr/lib/python2.7/dist-packages/cloudinit
# 再安装社区版 cloud-init,安装前请确认apt源正确可用
apt-get -y -o Dpkg::Options::="--force-confnew" install cloud-init
# 修改 cloud-init 的配置文件
sed -i 's/^\(disable_root:\).*$/\1 false/g' /etc/cloud/cloud.cfg
sed -i '/^disable_root:/i ssh_pwauth: true' /etc/cloud/cloud.cfg
sed -i "/max_wait/a datasource_list: ['ConfigDrive']\n\nnetwork: {config: disabled}" /etc/cloud/cloud.cfg
sed -i '/apt-configure/d' /etc/cloud/cloud.cfg
sed -i '/keys-to-console/d' /etc/cloud/cloud.cfg
sed -i "s/.*\(update_etc_hosts\).*/ - ['\1', 'once-per-instance']/" /etc/cloud/cloud.cfg
sed -i 's/WARNING/CRITICAL/g' /etc/cloud/cloud.cfg.d/05_logging.cfg
sed -i '/^\s\+-.*\*log_syslog/ s/.*/#&/' /etc/cloud/cloud.cfg.d/05_logging.cfg
# 将 OpenSSH 的启动顺序调整为在 cloud-init 之后,避免重置密码后,短时间内旧密码仍能登录的问题
sed -i 's/^\(After=.*\)$/\1 cloud-init.service/g' /lib/systemd/system/ssh.service
systemctl daemon-reload
# 创建 sem 文件
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_set_hostname \;
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_set_passwords \;
find /var/lib/cloud/instance/sem/ -name 'config_*' -exec cp {} /var/lib/cloud/instance/sem/config_ssh \;
rm -f /var/lib/cloud/instance/{*.txt*,obj*pkl}
#解决系统内设置的hostname被重置为云平台设置的hostname的问题
echo ''  > /var/lib/cloud/data/previous-hostname

Windows升级cloudbase-init到社区版

需要卸载原有的cloudbase-init后重新安装,详细步骤参考安装社区版cloudinit