自定义故障
操作场景
通过Cloud Operations Center创建一个攻击场景为自定义故障的演练任务。
注意事项
由于自定义故障完全由您编写的脚本决定,所以在使用脚本对弹性云服务器 (ECS)进行攻击时,可能会导致资源使用率飙高、网络发生故障等异常现象,从而存在将弹性云服务器 (ECS)上已安装的UniAgent状态变成离线/异常的风险,请悉知。
创建自定义故障
通过Cloud Operations Center创建一个自定义故障攻击场景的演练任务。
- 登录COC。
- 在左侧菜单栏选择“韧性中心 > 混沌演练”页面,选择“演练任务”页签,参考演练任务的步骤2-步骤6,新建攻击任务。
- 先填写攻击任务名称,攻击目标来源选择选择弹性云服务器 (ECS),在下方列表里选择对应的机器,单击“下一步”。
图1 选择攻击目标为弹性云服务器 (ECS)
- 攻击场景选择“自定义故障 > 自定义脚本”。若已有自定义故障脚本,则可以选择已有的;若之前没有创建过自定义故障脚本,则需要创建脚本。
图2 选择攻击场景为自定义故障
1. "超时时间":用于限制脚本允许执行的最长时间,超时时间设置需要比脚本执行时间更长,建议设置比脚本执行时间至少超过30秒。
- 创建自定义故障脚本,可以单击“脚本管理”,会跳转到“自动化运维 > 脚本管理 > 自定义脚本”中。创建脚本的具体步骤可以参考创建自定义脚本章节。脚本规范请参考如下代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#!/bin/bash set +x function usage() { echo "Usage: {inject_fault|check_fault_status|rollback|clean}" exit 2 } function inject_fault() { echo "inject fault" } function check_fault_status() { echo "check fault status" } function rollback() { echo "rollback" } function clean() { echo "clean" } case "$ACTION" in inject_fault) inject_fault ;; check_fault_status) check_fault_status ;; rollback) if [[ X"${CAN_ROLLBACK}" == X"true" ]]; then rollback else echo "not support to rollback" fi ;; clean) clean ;; *) usage ;; esac
建议按照上述脚本规范进行自定义故障定义。在上述规范中,您可以通过在inject_fault()、check_fault_status()、rollback()、clean()函数内编写自定义的内容来自定义故障注入函数、故障检查函数、故障回滚函数、环境清理函数操作。
按照上述规范,还有两个必填的脚本参数,如下。是否有其余脚本参数由您脚本内容决定。
表1 自定义故障脚本必填参数说明 参数名称
参数值
参数描述
ACTION
inject_fault
演练操作动作,系统后台在演练不同阶段会自动设置对应的值。可以选择:
- inject_fault:表示演练处于故障注入阶段
- check_fault_status:表示演练处于故障查询阶段
- rollback:表示演练处于取消正在注入故障的阶段
- clean:表示演练处于清理环境阶段
CAN_ROLLBACK
false
是否支持回滚;可以选择:
- true:表示演练处于取消正在注入故障的阶段时,会执行rollback()回滚函数中的内容
- false:表示演练处于取消正在注入故障的阶段时,不会执行rollback()回滚函数
1. 在"inject_fault"函数中,请添加一个故障注入成功的标志,并于"check_fault_status"函数中去检测该标志是否存在。若存在,则"check_fault_status"函数可以正常返回(如exit 0);若不存在,则"check_fault_status"函数可以异常返回(如:exit 1)。
- 如果您已有自定义脚本,则可以在下方根据脚本名称选择脚本,就会将脚本内容和参数展示在页签中,填写合适的超时时间后,单击“下一步”。
图3 选择自定义脚本
- 参考演练任务的步骤9和步骤17,即可创建完成攻击场景为自定义故障的演练任务。
自定义脚本样例
下面为您介绍一个自定义脚本样例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#!/bin/bash set +x PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH function usage() { echo "Usage: {inject_fault|check_fault_status|rollback|clean}" exit 2 } function inject_fault() { echo "============start inject fault============" if [ ! -d "${SCRIPT_PATH}/${DIR_NAME}" ]; then mkdir -p "${SCRIPT_PATH}/${DIR_NAME}" echo "mkdir ${SCRIPT_PATH}/${DIR_NAME} successfully" fi cd "${SCRIPT_PATH}/${DIR_NAME}" if [ ! -f ${FILE} ]; then touch "${FILE}" echo "create tmp file ${FILE}" touch inject.log chmod u+x "${FILE}" chmod u+x inject.log else echo "append content">${FILE} fi echo "successfully inject">${FILE} echo "============end inject fault============" } function check_fault_status() { echo "============start check fault status============" if [ ! -d "${SCRIPT_PATH}/${DIR_NAME}" ]; then echo "inject has been finished" exit 0 fi cd "${SCRIPT_PATH}/${DIR_NAME}" SUCCESS_FLAG="successfully inject" if [ -f ${FILE} ]; then if [[ "$(sed -n '1p' ${FILE})" = "${SUCCESS_FLAG}" ]]; then echo "fault inject successfully" else echo "fault inject failed" exit 1 fi else echo "inject finished" exit 0 fi sleep ${DURATION} echo "============end check fault status============" } function rollback() { echo "============start rollback============" cd "${SCRIPT_PATH}" if [ -d $DIR_NAME ]; then rm -rf "${SCRIPT_PATH}/${DIR_NAME}" fi echo "============end rollback============" } function clean() { echo "============start clean============" cd "${SCRIPT_PATH}" if [ -d $DIR_NAME ]; then rm -rf "${SCRIPT_PATH}/${DIR_NAME}" fi echo "============end clean============" } case "$ACTION" in inject_fault) inject_fault ;; check_fault_status) check_fault_status ;; rollback) if [[ X"${CAN_ROLLBACK}" == X"true" ]]; then rollback else echo "not support to rollback" fi ;; clean) clean ;; *) usage ;; esac |
脚本入参如下。
参数名称 |
参数值 |
参数描述 |
---|---|---|
ACTION |
inject_fault |
演练操作动作 |
CAN_ROLLBACK |
false |
不支持回滚 |
SCRIPT_PATH |
/tmp |
自定义故障日志所在根目录 |
DIR_NAME |
test_script |
自定义故障日志所在父目录 |
FILE |
test.log |
自定义故障日志名 |
DURATION |
10 |
模拟自定义故障持续时间,单位:秒 (该参数放在inject_fault函数内时不生效) |
1. 在样例的“inject_fault”函数中,注入的故障即是“创建一个{FILE}文件,并在{FILE}文件中新增内容”。故障注入成功的标志即为在{FILE}文件中输入了“successfully inject”内容。
2. 在样例的“check_fault_status”函数中,会检测{FILE}文件是否存在。若不存在,则可能是故障已经被清理结束,此处返回exit 1。若存在,则检测故障注入成功的标志是否存在,若存在该标志,则表示故障注入成功,此处“sleep {DURATION}”用于模拟故障持续时间;若成功的标志不存在,则说明故障注入失败。