更新时间:2025-08-20 GMT+08:00
分享

创建自定义故障

操作场景

创建故障模式,可以针对潜在的故障进行日常演练,验证故障恢复措施和故障影响是否符合预期,为更好地应对各种挑战做好准备

注意事项

由于自定义故障完全由您编写的脚本决定,所以在使用脚本对弹性云服务器 (ECS)进行攻击时,可能会导致资源使用率飙高、网络发生故障等异常现象,从而存在将弹性云服务器 (ECS)上已安装的UniAgent状态变成离线/异常的风险,请悉知。

创建自定义故障

通过云运维中心创建一个自定义故障攻击场景的演练任务。

  1. 登录云运维中心控制台。
  2. 在左侧菜单栏选择“韧性中心 > 混沌演练”页面,选择“演练任务”页签,参考演练任务,新建攻击任务。
  3. 先填写攻击任务名称,攻击目标来源选择弹性云服务器 (ECS),在下方列表里选择对应的机器,单击“下一步”。

    图1 选择攻击目标为弹性云服务器 (ECS)

  4. 攻击场景选择“自定义故障 > 自定义脚本”。

    • 若已有自定义故障脚本,则可以选择已有的脚本,请执行步骤6
    • 若此前未创建过自定义故障脚本,或已有脚本不适用于当前场景使用,则需要创建新脚本,请执行步骤5
    图2 选择攻击场景为自定义故障

  5. 创建自定义故障脚本,可以单击“脚本管理”,会跳转到“自动化运维 > 脚本管理 > 自定义脚本”中。创建脚本的具体步骤可以参考创建自定义脚本章节。脚本规范请参考如下代码。

     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()回滚函数。

    在"inject_fault"函数中,请添加一个故障注入成功的标志,并于"check_fault_status"函数中去检测该标志是否存在。

    • 若存在,则"check_fault_status"函数可以正常返回(如exit 0);
    • 若不存在,则"check_fault_status"函数可以异常返回(如:exit 1)。

  6. 如果您已有自定义脚本,可以在下拉框通过脚本名称进行选择,选中后,对应的脚本内容及参数将自动展示在页签中。

    图3 选择自定义脚本

  7. 填写合适的超时时间后,单击“下一步”。

    超时时间:该参数用于限制脚本允许执行的最长时间。注意:超时时间需设置为长于脚本实际执行时间,建议至少比脚本执行时间多出30秒

  8. 参考演练任务完成剩余步骤,即可创建完成攻击场景为自定义故障的演练任务。

自定义脚本样例

下面为您介绍一个自定义脚本样例。

脚本内容如下
  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

脚本入参如下

表2 自定义脚本样例的脚本入参

参数名称

参数值

参数描述

ACTION

inject_fault

演练操作动作

CAN_ROLLBACK

false

不支持回滚

SCRIPT_PATH

/tmp

自定义故障日志所在根目录

DIR_NAME

test_script

自定义故障日志所在父目录

FILE

test.log

自定义故障日志名

DURATION

10

模拟自定义故障持续时间,单位:秒

(该参数放在inject_fault函数内时不生效)

  • 在样例的“inject_fault”函数中,注入的故障即是“创建一个{FILE}文件,并在{FILE}文件中新增内容”。故障注入成功的标志即为在{FILE}文件中输入了“successfully inject”内容。
  • 在样例的“check_fault_status”函数中,会检测{FILE}文件是否存在。若不存在,则可能是故障已经被清理结束,此处返回exit 1。若存在,则检测故障注入成功的标志是否存在,若存在该标志,则表示故障注入成功,此处“sleep {DURATION}”用于模拟故障持续时间;若成功的标志不存在,则说明故障注入失败。

相关文档