阿里云效,自动构建自动发布,对于1H2G,2H4G这种服务器来说,省了构建空间和内存,吹爆。但是现在新版的服务器,自带的基本都是python3,所以在添加主机的时候,碰到命令执行失败的情况,抓耳挠腮。所以,写下这个踩坑文。

我们先来看看阿里流水线给的一段命令:

bash <(curl -L -k http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-install.sh) 'http://devops.aliyuncs.com/api/getSnByRegion?regionId=e1304adc-6abd-4179-bfde-722f4c5af037&sign=Pns3hrMP8job4GsXfXYVRA%3D%3D&aliyunRegion=default×tamp=1694747865810&scope=flow' http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-agent.tgz http://devops.aliyuncs.com/api/verifySnAndRegionId?sign=xxx xxx xxx default

从示例给的路径来说,可惜看出这段命令分为三个部分。
bash => 脚本的执行命令
curl -L -k => 指向一个远程脚本 http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-install.sh
6个参数 => 在sh脚本中用到
所以我们先直接下载他写的脚本,如下(稍微做了点备注,方便理解)。

# 函数: 检查目录,创建目录,给Agent腾位置.
function init_dir() {
    echo 检查目录
    if [ -d "/home/aol2" ] || [ -d "/home/staragent"]; then
        while true; do
            read -p "目录/home/aol2或者/home/staragent已经存在于您的机器上,有可能是因为您已经安装过RDC的Agent,继续安装,会重置这些目录中的内容。请选择[Y/n]:" answer
            case $answer in
                [Y]* ) break;;
                [n]* ) exit;;
                * ) echo "请选择Y或n.";;
            esac
        done
    fi
    mkdir -p /home/aol2 /home/staragent /usr/sbin
}

# 函数: 检查python。这里有个坑,它校验的是Python2,现在稍微高点的都是Python3,所以这个坑我踩了一次,我一直以为是需要下载指定版本。
function check_python() {
    echo 检查python
    output=`python -V 2>&1`
    if [ $? == 1 ]; then
        echo 请确保您已经安装了Python 2.7,并且确保python可执行文件在您的PATH中。建议您按照 https://help.aliyun.com/document_detail/59302.html#h3--p-id-install-agent-agent- 的提示来安装。
        exit 1
    fi

    if [[ ! $output == *"2.7"* ]]; then
        echo 请确保您已经安装了Python 2.7。建议您按照 https://help.aliyun.com/document_detail/59302.html#h3--p-id-install-agent-agent- 的提示来安装。
        exit 1
    fi
}
# 函数:检查wget,这个一般都有,没有的百度问下如何安装也很简单。
function check_wget() {
    echo 检查wget
    wget -h > /dev/null 2>&1
    if [ $? != 0 ];then
        echo wget未安装,请先安装。
        exit 1
    fi
}
# 函数:检查包缺失。这个是个大坑,Python3和python2的检查语法都不一样。
function check_toolkit(){
    echo 检查zlib-dev openssl-devel bzip2-devel包是否缺失
    MISSING_MSG=""
    python -c 'import zlib'
    if [ $? != 0 ]; then
       MISSING_MSG="${MISSING_MSG}""zlib-dev "
    fi
    python -c 'import ssl'
    if [ $? != 0 ]; then
       MISSING_MSG="${MISSING_MSG}""openssl-devel "
    fi
    python -c 'import bz2'
    if [ $? != 0 ]; then
       MISSING_MSG="${MISSING_MSG}""bzip2-devel "
    fi
    if [ -z "${MISSING_MSG}" ];then
       return
    fi
    echo "${MISSING_MSG}""包缺失,建议您按照 https://help.aliyun.com/document_detail/59302.html 的提示来安装必要工具包"
    exit 1;
}
# 函数: 下载并安装agent,一个运维工具,想了解的可以去了解下。
function install_agent() {
    echo 下载并安装Agent
    AGENT_URL=$1
    wget $AGENT_URL -O /tmp/agent.tgz
    if [ -e /home/staragent/bin/staragentctl ]; then
        /home/staragent/bin/staragentctl stop
        rm -rf /home/staragent
    fi
    echo unzip agent...
    tar zxf /tmp/agent.tgz -C /home
    echo finished unzip agent
}

#函数: 剩下的是一些安装和远程调用的阿里环境和本地环境的方法,不懂的可以查询下对应的命令去了解。
function install_sn() {
    sn_url=$1
    if [ -s "/usr/sbin/staragent_sn" ]; then
        local_sn=`cat /usr/sbin/staragent_sn`
        verify_url=${VERIFY_SN_AND_REGION_URL}"&sn="${local_sn}"×tamp="${TIME_STAMP}"®ionId="${REGION_ID}
        verify_result_str=`curl -L ${verify_url} 2>/dev/null`
        verify_result=`echo ${verify_result_str} | sed 's/[[:space:]]//g'`
        deal_verify_result ${verify_result}
        if [[ "$verify_result" == "0" ]]; then
            while true; do
                read -p "该机器曾经关联过其他企业,如果继续安装,该机器会取消和之前企业的关联关系。是否继续?[Y/n]" answer
                    case $answer in
                    [Y]* ) break;;
                    [n]* ) echo 启用本机已存在SN:`cat /usr/sbin/staragent_sn`;return;;
                    * ) echo "请选择Y或n.";;
                esac
            done
        else
            echo 启用本机已存在SN:`cat /usr/sbin/staragent_sn`;
            return;
        fi
    fi
    SN=$sn_url
    if [ "${SN:0:4}"x = "http"x ]; then
        echo 获取SN。
        STR=`curl -L -k $1 2>/dev/null`
        SN=`echo $STR | sed 's/[[:space:]]//g'`
        deal_verify_result ${SN}
    fi
    echo SN:$SN
    echo 安装SN。
    echo $SN > /usr/sbin/staragent_sn
}

function deal_verify_result(){
    result_num=$1
    if [ "$result_num" == "-1" ]; then
       echo 签名无效。
       exit 1
    fi
    if [ "$result_num" == "-2" ]; then
       echo 安装命令已过期,请到机器管理页面重新生成安装命令。
       exit 1
    fi
}

function start_agent() {
    echo 启动Agent。
    /home/staragent/bin/staragentctl restart
    if [ $? != 0 ]; then
       echo 启动失败
       exit 1
    fi
}

function set_proxy_machine() {
    proxy_machine_ip=$1
    channels_dir="/home/staragent/conf/channels.conf"
    if [ "$proxy_machine_ip" != "default" ]; then
        echo 不能访问公网,使用代理机部署,代理机:${proxy_machine_ip}
        if [ -s "${channels_dir}" ]; then
            echo 已经存在channels.conf:`cat /home/staragent/conf/channels.conf`;
        else
            echo 不存在channels.conf
            touch /home/staragent/conf/channels.conf
        fi 
        `echo -e "${proxy_machine_ip}\t8000" >>/home/staragent/conf/channels.conf`

        echo 修改hosts
        echo 修改houts前:`cat /etc/hosts`;
        `echo ${proxy_machine_ip}   oss-cn-beijing.aliyuncs.com >>/etc/hosts`
        echo 修改hosts后:`cat /etc/hosts`;
    fi
}

SN_URL=$1
AGENT_URL=$2
VERIFY_SN_AND_REGION_URL=$3
REGION_ID=$4
TIME_STAMP=$5
PROXY_MACHINE_IP=$6
# 上面这些比较重要,我们还记得添加云主机,后面带了6个参数,这里就是调用这些参数了。
# 'http://devops.aliyuncs.com/api/getSnByRegion?regionId=e1304adc-6abd-4179-bfde-722f4c5af037&sign=Pns3hrMP8job4GsXfXYVRA%3D%3D&aliyunRegion=default×tamp=1694747865810&scope=flow' 
# http://agent-install-default.oss-cn-hangzhou.aliyuncs.com/production-agent.tgz 
# http://devops.aliyuncs.com/api/verifySnAndRegionId?sign=DwbTWYCNefxCm5ZS1d7mEA%3D%3D # xxx 
# xxx 
# default

#下面这些就是调用上面介绍的那些函数。
init_dir
check_python
check_wget
check_toolkit
install_sn $SN_URL
install_agent $AGENT_URL
set_proxy_machine $PROXY_MACHINE_IP
start_agent
echo 安装成功

大致了解添加云主机的sh脚本后,我们就可以知道,这段命令无非就是校验运维工具需求的环境,没有就给你报错,然后下载agent运维工具,打通和阿里服务的一个通道。
拿我这次安装的环境 contOs 系统gcc 8.1来说,python2安装的时候已经会报各种不兼容,所以这段命令肯定是执行不成功的。那么直接采用python3, 在保证自己环境的python3安装健全和wget命令正常使用情况下,直接注释掉
# check_python # check_wget # check_toolkit 然后保存这个sh脚本丢到服务器上
执行 sh xxx.sh 后面接上你的云效主机给的6个参数,参数注意间隔空格不要换行 就OK了
如果用的python2,那没事了,您随意执行。