ECS镜像(三)UserData最佳实践及Troubleshooting

前言

前文在介绍镜像生态的时候对用户数据即UserData(下文将统一使用UserData)进行了简短对介绍,UserData的价值主要在于ECS启动时做一些个性化配置或者数据下发等。UserData在云产品和终端用户都有着非常广泛的应用场景,同时在实践中也会遇到一些比较棘手的问题,比如UserData数据超过16k怎么办?UserData没有执行或者执行失败了怎么排查?
本文将从两个方面进行讲述:

  1. UserData典型实践场景,比如执行脚本,Cloud-config等。
  2. 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进行验证:

ECS镜像(三)UserData最佳实践及Troubleshooting

Cloud Config

是UserData格式里面最简单,最友好的一种,通常我们可以使用它来配置主机名,sshkey,安装软件包等。
举个例子,用Cloud Config配置主机名:

#cloud-config
hostname: yzq

登录ECS,可以看到主机名已经配置成功。

ECS镜像(三)UserData最佳实践及Troubleshooting

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传递敏感数据,如密码,证书等。

二、问题排查

排查流程

  1. 校验UserData是否与传入的匹配。

curl 100.100.100.200/latest/user-data 将返回Cloud-Init执行的UserData数据。

  1. 查看机器上UserData数据是否匹配。

/var/lib/cloud/instance 目录时Cloud-Init的应用目录,该目录下有Cloud-Init相关的数据包括UserData。
UserData的目录通常在/var/lib/cloud/instance/user-data.txt

  1. 机器上执行脚本,判断是否是脚本内容问题。
  2. 查看Cloud-Init执行日志找问题。

/var/log/cloud-init*log 是Cloud-Init的日志目录,所有Cloud-Init相关的日志包括UserData都可以在里面查到,搜索关键字error/ERROR/userdata等进行过滤。

  1. 删除/var/lib/cloud目录重启ECS,观察UserData是否配置正常。

排查技巧

  • 善用Cloud-Init目录,Cloud-Init文件目录包含了非常多的数据包括user-data、cloud-config等,通过查看该目录下的文件内容可以判断数据是否与预期匹配,做初步判断。

ECS镜像(三)UserData最佳实践及Troubleshooting

  • 善用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, 重启机器。

参考文献

上一篇:Mac 神兵利器(二) 极简软件清单


下一篇:The Tour of Go(一) 初始化Go开发环境