前言
前文在介绍镜像生态的时候对用户数据即UserData(下文将统一使用UserData)进行了简短对介绍,UserData的价值主要在于ECS启动时做一些个性化配置或者数据下发等。UserData在云产品和终端用户都有着非常广泛的应用场景,同时在实践中也会遇到一些比较棘手的问题,比如UserData数据超过16k怎么办?UserData没有执行或者执行失败了怎么排查?
本文将从两个方面进行讲述:
- UserData典型实践场景,比如执行脚本,Cloud-config等。
- UserData典型问题排查,比如查看UserData内容及UserData执行日志,分析Cloud-Init执行日志等。
术语表
UserData:用户数据,是阿里云 ECS 提供的一种自定义实例启动行为及传入数据的功能。
Cloud-Init:开源项目,本质上是一系列python脚本及组件用来在云主机启动时配置ECS。
一、最佳实践
Script
最典型的使用场景,通常用于在ECS启动时通过UserData来初始化环境。
举个例子,我们通过UserData在ECS启动时配置 DNS、yum、NTP等。
#!/bin/sh
# Modify DNS
echo "nameserver 8.8.8.8" | tee /etc/resolv.conf
# Modify yum repo and update
rm -rf /etc/yum.repos.d/*
touch myrepo.repo
echo "[base]" | tee /etc/yum.repos.d/myrepo.repo
echo "name=myrepo" | tee -a /etc/yum.repos.d/myrepo.repo
echo "baseurl=http://mirror.centos.org/centos" | tee -a /etc/yum.repos.d/myrepo.repo
echo "gpgcheck=0" | tee -a /etc/yum.repos.d/myrepo.repo
echo "enabled=1" | tee -a /etc/yum.repos.d/myrepo.repo
yum update -y
# Modify NTP Server
echo "server ntp1.aliyun.com" | tee /etc/ntp.conf
systemctl restart ntpd.services
登录ecs进行验证:
Cloud Config
是UserData格式里面最简单,最友好的一种,通常我们可以使用它来配置主机名,sshkey,安装软件包等。
举个例子,用Cloud Config配置主机名:
#cloud-config
hostname: yzq
登录ECS,可以看到主机名已经配置成功。
Cloud Config的特性非常丰富,它以一种配置的形式完成非常多实例初始化工作,更多Cloud Config 例子可以参考 Cloud Config Examples。
Include File
上文提到了UserData一种简单常用的方式是直接指定脚本下发,如果有多个脚本已经部署在了公网/局域网这种是不是需要把脚本内容合并后作为整体传入呢?
不用这么麻烦,我们有更优雅的解决方案,这就是Include File的用法,Include File允许指定URL列表,Cloud-Init会获取File列表并且将其作为一个脚本执行,__脚本支持gzip压缩__。
举个例子,将一个经过gzip压缩过的脚本放在oss上,ECS时将下载并解压文件同时执行脚本。
#include
http://yzq-test.oss-cn-shanghai.aliyuncs.com/demo.sh.gz?Expires=1524773334&OSSAccessKeyId=TMP.AQG1m7buBorVTB8qgnhD8L6TI8SQbrZAoQf_OvUGBSb3WxZLO765vZyp-xzuMC4CFQCnLZG0pwrPJiksdtjeUz1vwYIZswIVAMl88BlMJTt0wnQuMeh4iTiRBp84&Signature=cmRTL3LVkPn2FivhwMiK7q34Spk%3D
其它
前文提到的三种是比较常用的格式,同时Cloud-Init还支持 Upstart Job、Cloud Boothook以及自定义格式等多做方式,有兴趣的同学可以直接查看官方社区了解。
实践建议
- 优先使用Cloud Config及Script的方式。
- 不要使用UserData传递敏感数据,如密码,证书等。
二、问题排查
排查流程
- 校验UserData是否与传入的匹配。
curl 100.100.100.200/latest/user-data 将返回Cloud-Init执行的UserData数据。
- 查看机器上UserData数据是否匹配。
/var/lib/cloud/instance 目录时Cloud-Init的应用目录,该目录下有Cloud-Init相关的数据包括UserData。
UserData的目录通常在/var/lib/cloud/instance/user-data.txt
- 机器上执行脚本,判断是否是脚本内容问题。
- 查看Cloud-Init执行日志找问题。
/var/log/cloud-init*log 是Cloud-Init的日志目录,所有Cloud-Init相关的日志包括UserData都可以在里面查到,搜索关键字error/ERROR/userdata等进行过滤。
- 删除/var/lib/cloud目录重启ECS,观察UserData是否配置正常。
排查技巧
- 善用Cloud-Init目录,Cloud-Init文件目录包含了非常多的数据包括user-data、cloud-config等,通过查看该目录下的文件内容可以判断数据是否与预期匹配,做初步判断。
- 善用Cloud-Init日志, 通过分析 /var/log/cloudinit.log 定位问题。
FAQ
UserData超过16k怎么解决?
__Q:__Cloud-Init官方社区闲置了UserData的大小是16k,那么超过16k的数据是不是无法通过UserData方式传入ECS呢?
__A: __上文我们提到了Include File的方式可以从URL执行脚本,同时该脚本是可以通过gzip压缩过的,那么通过这种方式是可以解决大文件传输问题的。
UserData如何重新执行?
Q: UserData执行过下次重启便不会执行,如果在排查问题或者有特殊需求需要再次重启该怎么办?
A: 删除 /var/lib/cloud, 重启机器。