更新时间:2024-11-05 GMT+08:00
分享

自定义故障

操作场景

通过Cloud Operations Center创建一个攻击场景为自定义故障的演练任务。

注意事项

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

创建自定义故障

通过Cloud Operations Center创建一个自定义故障攻击场景的演练任务。

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

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

  4. 攻击场景选择“自定义故障 > 自定义脚本”。若已有自定义故障脚本,则可以选择已有的;若之前没有创建过自定义故障脚本,则需要创建脚本。

    图2 选择攻击场景为自定义故障

    1. "超时时间":用于限制脚本允许执行的最长时间,超时时间设置需要比脚本执行时间更长,建议设置比脚本执行时间至少超过30秒。

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

    1. 在"inject_fault"函数中,请添加一个故障注入成功的标志,并于"check_fault_status"函数中去检测该标志是否存在。若存在,则"check_fault_status"函数可以正常返回(如exit 0);若不存在,则"check_fault_status"函数可以异常返回(如:exit 1)。

  6. 如果您已有自定义脚本,则可以在下方根据脚本名称选择脚本,就会将脚本内容和参数展示在页签中,填写合适的超时时间后,单击“下一步”。

    图3 选择自定义脚本

  7. 参考演练任务的步骤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

脚本入参如下。

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

参数名称

参数值

参数描述

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}”用于模拟故障持续时间;若成功的标志不存在,则说明故障注入失败。

相关文档