
# 通过实例自定义数据配置ECS实例
#### 使用场景
当您有如下需求时，可以考虑使用实例自定义数据注入功能来配置弹性云服务器：
- 需要通过脚本简化弹性云服务器配置
- 通过脚本初始化系统
- 已有脚本，在创建弹性云服务器的时候一并上传到服务器
- 其他可以使用脚本完成的功能
 
#### 背景知识
实例自定义数据是指通过"实例自定义数据注入"方式上传至弹性云服务器的脚本、指令或配置文件等数据，通常用于进行完成弹性云服务器的初始化系统或简化他配置。例如，在首次启动弹性云服务器时，自动运行服务启动脚本、安装软件、打印日志等。
实例自定义数据支持在弹性云服务器首次启动时自动运行，部分自定义数据格式还支持在Linux系统弹性云服务器每次启动时自动运行。
#### 使用限制
- Linux：
  - 用于创建弹性云服务器的镜像安装了Cloud-init组件。 安装Cloud-init的详细操作，请参见[（可选）安装和配置Cloud-Init工具](https://support.huaweicloud.com/usermanual-ims/zh-cn_topic_0030730603.html)。
    
  
  
  
  - 实例自定义数据大小限制：小于等于32KB。
  
  - 如果通过文本方式上传实例自定义数据，数据只能包含ASCII码字符；如果通过文件方式上传实例自定义数据，可以包含任意字符，同时，要求文件大小小于等于32KB。
  
  - 必须是公共镜像，或继承于公共镜像的私有镜像，或自行安装了Cloud-init组件的私有镜像。
  
  - 必须满足相应Linux弹性云服务器自定义脚本类型的格式要求。
  
  - 使用的VPC网络必须开启DHCP，安全组出方向规则保证80端口开放。
  
  - 选择"密码"登录方式时，不支持实例自定义数据注入功能。
   
- Windows
  - 用于创建弹性云服务器的镜像安装了Cloudbase-init组件。 安装Cloudbase-init的详细操作，请参见[（可选）安装并配置Cloudbase-Init工具](https://support.huaweicloud.com/usermanual-ims/zh-cn_topic_0030730602.html)。
    
  
  - 实例自定义数据大小限制：小于等于32KB。
  
  - 如果通过文本方式上传实例自定义数据，数据只能包含ASCII码字符；如果通过文件方式上传实例自定义数据，可以包含任意字符，同时，要求文件大小小于等于32KB。
  
  - 必须是公共镜像，或继承于公共镜像的私有镜像，或自行安装了Cloudbase-init组件的私有镜像。
  
  - 使用 VPC网络必须开启DHCP，安全组出方向规则保证80端口开放。
   
 
#### 使用方法
1. 根据实际需要写User-Data脚本，脚本格式必须符合User-Data脚本，详细规范请参见[相关链接]。
2. 创建弹性云服务器时，需将实例自定义数据脚本内容粘贴到"高级选项 \> 现在配置 \> 实例自定义数据注入"的文本框，或选择实例自定义数据文件上传。
   ![](https://support.huaweicloud.com/usermanual-ecs/public_sys-resources/note_3.0-zh-cn.png)
   实例自定义数据注入支持使用文件和文本两种方式：
   文本：将实例自定义数据脚本内容粘贴到文本框中。
   文件：将实例自定义数据脚本内容保存至文本文件后再将上传。
   图1实例自定义数据注入   
   ![](https://support.huaweicloud.com/usermanual-ecs/zh-cn_image_0000001883614190.png "点击放大") 
3. 系统创建弹性云服务器，弹性云服务器启动后自动执行Cloud-init或Cloudbase-init组件，读取实例自定义数据脚本。
 
#### 关于Linux云服务器的实例自定义数据脚本
Linux弹性云服务器的自定义实例自定义数据脚本（简称"脚本"）采用开源的Cloud-init架构实现，该架构以云服务器的元数据为数据来源，对弹性云服务器进行各项自动化配置。自定义脚本类型兼容开源Cloud-init，详情请参考Cloud-init开源说明：<https://cloudinit.readthedocs.io/en/latest/explanation/format.html>。
- 脚本的执行时间：弹性云服务器的状态变为"running"之后，执行文件/etc/init之前。
  ![](https://support.huaweicloud.com/usermanual-ecs/public_sys-resources/note_3.0-zh-cn.png)
  脚本默认以root用户权限执行。
  

- 脚本类型：包括"User-Data Script"和"Cloud-Config Data"。
  表1Linux云服务器脚本类型介绍 
  | -  | User-Data Script                                                                                                                                             | Cloud-Config Data                             |
  |:---|:---|:---|
  | 描述 | 以脚本作为自定义配置的手段，如shell和python脚本。                                                                                                                               | Cloud-init中预定义的对云服务器部分服务进行配置的手段，如yum源、SSH 密钥。 |
  | 格式 | 首行必须是"#!"（如"#!/bin/bash和#!/usr/bin/env python"），且前面不能有空格。 首次启动时，将在rc.local-like级别上执行，rc.local-like意味着"在启动序列中非常靠后"。 | 首行必须是"#cloud-config"，且前面不能有空格。                |
  | 限制 | 在采用Base64编码前，脚本内容（包括首行在内）不能超过32KB。                                                                                                                           | 在采用Base64编码前，脚本内容（包括首行在内）不能超过32KB。            |
  | 频率 | 仅在首次启动弹性云服务器时执行一次。                                                                                                                                           | 配置的服务不同，执行频率也会不同。                             |
     
  
- 如何查看注入Linux弹性云服务器的自定义数据？
  1. 登录弹性云服务器。
  
  2. 执行以下命令，以root用户权限查看实例自定义数据。 **curl http://169.254.169.254/openstack/latest/user_data**
     
   
- 脚本使用示例： 该示例介绍如何以不同格式输入Linux弹性云服务器的脚本，并查看脚本的运行结果。
  **示例一：脚本类型为User-Data Script**
  创建弹性云服务器时，选择"文本"形式并输入实例自定义数据脚本，脚本如下：
  ```
  #!/bin/bash
  echo "Hello, the time is now $(date -R)" | tee /root/output.txt
  ```
  创建成功后，连接并启动弹性云服务器，执行命令**cat *\[file\]***，查看脚本的运行结果。
  ```
  [root@XXXXXXXX ~]# cat /root/output.txt
  Hello, the time is now Mon, 16 Jul 2016 16:03:18+0800
  ```
  **示例二：脚本类型为Cloud-Config Data**
  创建弹性云服务器时，选择"文本"形式并输入实例自定义数据脚本，脚本如下：
  ```
  #cloud-config
  bootcmd:
  - echo 192.168.1.130 us.archive.ubuntu.com >> /etc/hosts
  ```
  创建成功后，连接并启动弹性云服务器，执行命令**cat /etc/hosts**查看脚本的运行结果。
  图2查看运行结果   
  ![](https://support.huaweicloud.com/usermanual-ecs/zh-cn_image_0115931570.png "点击放大") 
 
#### 关于Windows弹性云服务器的实例自定义数据脚本
Windows弹性云服务器的实例自定义数据脚本（简称"脚本"）采用开源的cloudbase-init架构实现，该架构以弹性云服务器的元数据为数据来源，对弹性云服务器进行各项自动化配置，为Windows弹性云服务器提供执行初始化脚本的能力。自定义脚本类型兼容开源Cloudbase-init，详情请参考Cloudbase-init开源说明：<https://cloudbase-init.readthedocs.io/en/latest/userdata.html>。
- 脚本类型：包括"Batch批处理程序"和"PowerShell脚本"。
  表2Windows云服务器脚本类型介绍 
  | -  | Batch批处理程序                         | PowerShell脚本                       |
  |:---|:---|:---|
  | 格式 | 以"rem cmd"开头且作为首行，且前面不能有空格。        | 以"#ps1"开头且作为首行，且前面不能有空格。           |
  | 限制 | 在采用Base64编码前，脚本内容（包括首行在内）不能超过32KB。 | 在采用Base64编码前，脚本内容（包括首行在内）不能超过32KB。 |
     
  
- 如何查看注入Windows弹性云服务器的实例自定义数据？
  1. 登录弹性云服务器。
  
  2. 在浏览器栏访问如下地址，查看注入的实例自定义数据。 **http://169.254.169.254/openstack/latest/user_data**
     
   
- 脚本使用示例 该示例介绍如何以不同格式输入Windows弹性云服务器的脚本，并查看脚本的运行结果。
  **示例一：Batch批处理程序**
  创建弹性云服务器时，选择"文本"形式并输入实例自定义数据，脚本如下：
  ```
  rem cmd
  echo "Hello, BAT Test" > C:\1111.txt
  ```
  创建成功后，连接并启动弹性云服务器，查看脚本的运行结果：在C:\\盘添加了一个名称为 "1111" 的文本文档，如[图3]所示。
  图3新建文本文档_Batch   
  ![](https://support.huaweicloud.com/usermanual-ecs/zh-cn_image_0115932123.png "点击放大")
  如需查看注入Windows弹性云服务器的实例自定义数据，可以在浏览器访问：http://169.254.169.254/openstack/latest/user_data，如[图4]所示。
  图4查看实例自定义数据_Batch   
  ![](https://support.huaweicloud.com/usermanual-ecs/zh-cn_image_0115932873.png "点击放大")
  **示例二：PowerShell脚本**
  创建弹性云服务器时，选择"文本"形式并输入实例自定义数据，脚本如下：
  ```
  #ps1
  echo "Hello, Powershell Test" > C:\aaaa.txt
  ```
  创建成功后，连接并启动弹性云服务器，查看脚本的运行结果：在C:\\盘添加了一个名称为 "aaaa" 的文本文档。
  图5新建文本文档_PowerShell   
  ![](https://support.huaweicloud.com/usermanual-ecs/zh-cn_image_0115933029.png "点击放大")
  如需查看注入Windows弹性云服务器的实例自定义数据，可以在浏览器访问：http://169.254.169.254/openstack/latest/user_data，如[图6]所示。
  图6查看实例自定义数据_PowerShell   
  ![](https://support.huaweicloud.com/usermanual-ecs/zh-cn_image_0115934291.jpg "点击放大") 
 
#### 案例1
该样例介绍如何通过实例自定义数据注入，为Linux弹性云服务器简化云服务器配置。
当您需要设置vim的"语法高亮显示"、"制表符占用4个空格"和"显示行数"属性时，就可以写一个脚本.vimrc，并将其注入到"/root/.vimrc"。在您创建完云服务器时，您的vim配置便完成了。这样做可以大幅提高系统配置的效率，特别是在您一次性创建多台弹性云服务器时。
实例自定义数据注入示例：
```
#cloud-config
write_files:
  - path: /root/.vimrc
    content: |
      syntax on
      set tabstop=4
      set number
```
#### 案例2
该样例介绍如何通过实例自定义数据注入，设置Linux弹性云服务器密码。
![](https://support.huaweicloud.com/usermanual-ecs/public_sys-resources/note_3.0-zh-cn.png)
新密码必须符合密码复杂度要求，密码规则如[表3]所示。
 表3密码设置规则 
| 参数 | 规则                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
|:---|:---|
| 密码 | - 密码长度范围为8到26位。  - 密码至少包含以下4种字符中的3种： - 大写字母  - 小写字母  - 数字  - Linux操作系统云服务器支持的特殊字符：!@$%\^-_=+\[{}\]:,./?\~#\*    - 密码不能包含用户名或用户名的逆序。   |
   
实例自定义数据注入示例:
使用密文密码（推荐使用）：
```
#!/bin/bash 
echo 'root:$6$V6azyeLwcD3CHlpY$BN3VVq18fmCkj66B4zdHLWevqcxlig' | chpasswd -e;
```
其中，$6$V6azyeLwcD3CHlpY$BN3VVq18fmCkj66B4zdHLWevqcxlig为密文密码，生成方法如下：
1. 执行以下命令，生成加密盐值 **python -c "import crypt, getpass, pwd;print crypt.mksalt()"**
   回显信息如下：
   ```
   $6$V6azyeLwcD3CHlpY
   ```
   
2. 执行以下命令，根据盐值生成密文密码 **python -c "import crypt, getpass, pwd;print crypt.crypt('Cloud.1234','\\$6\\$V6azyeLwcD3CHlpY')"**
   回显信息如下：
   ```
   $6$V6azyeLwcD3CHlpY$BN3VVq18fmCkj66B4zdHLWevqcxlig
   ```
   
弹性云服务器创建成功后，您可以使用该密码登录。
![](https://support.huaweicloud.com/usermanual-ecs/public_sys-resources/note_3.0-zh-cn.png)
当用户在创建Linux系统弹性云服务器指定adminPass字段时，可参考当前示例转换为实例自定义数据实现密码注入。
#### 案例3
该样例介绍如何通过实例自定义数据注入，重置Linux弹性云服务器密码。
假设您需要将root用户密码重置为"\*\*\*\*\*\*"。
![](https://support.huaweicloud.com/usermanual-ecs/public_sys-resources/note_3.0-zh-cn.png)
新密码必须符合密码复杂度要求，密码规则如[表4]所示。
 表4密码设置规则 
| 参数 | 规则                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
|:---|:---|
| 密码 | - 密码长度范围为8到26位。  - 密码至少包含以下4种字符中的3种： - 大写字母  - 小写字母  - 数字  - Linux操作系统云服务器支持的特殊字符：!@$%\^-_=+\[{}\]:,./?\~#\*    - 密码不能包含用户名或用户名的逆序。   |
   
实例自定义数据注入示例（请严格遵守下面示例中的缩进标准）:
```
#cloud-config
chpasswd:
  list: |
    root:******
  expire: False
```
弹性云服务器创建成功后，您可以使用重置的密码登录弹性云服务器。为了保证密码安全，建议您在第一次登录弹性云服务器后，修改root用户密码。
#### 案例4
该样例介绍如何通过实例自定义数据注入，为Windows弹性云服务器新增用户并设置密码。
假设您要创建的用户名为abc、密码为"\*\*\*\*\*\*"的普通用户，并将其添加至administrators用户组。
![](https://support.huaweicloud.com/usermanual-ecs/public_sys-resources/note_3.0-zh-cn.png)
新密码必须符合密码复杂度要求，密码规则如[表4]所示。
实例自定义数据注入示例：
```
rem cmd
net user abc ****** /add
net localgroup administrators abc /add
```
弹性云服务器创建成功后，您可以使用新创建的用户名和密码登录弹性云服务器。
#### 案例5
该样例介绍如何通过实例自定义数据注入，为Linux弹性云服务器更新系统软件包，并且开启httpd相关服务。注入成功后，您的弹性云服务器就可以使用httpd服务了。
实例自定义数据注入示例：
```
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```
#### 案例6
该样例介绍如何通过实例自定义数据注入，激活Linux弹性云服务器的root用户远程登录权限。注入成功后，您可以使用SSH密钥方式，以root账户登录弹性云服务器。
实例自定义数据注入示例：
```
#cloud-config
disable_root: false
runcmd:
- sed -i 's/^PermitRootLogin.*$/PermitRootLogin without-password/' /etc/ssh/sshd_config
- sed -i '/^KexAlgorithms.*$/d' /etc/ssh/sshd_config
- service sshd restart
```
 #### 相关链接
更多关于实例自定义数据注入案例的介绍，请参见Cloud-init/Cloudbase-init官网：
- <https://cloudinit.readthedocs.io/en/latest/>
 
- <https://cloudbase-init.readthedocs.io/en/latest/>
 
