DolphinScheduler中有很多经典的Linux shell用法,掌握好了,可以快速提升自己的shell编写能力,如下为对其安装包下的 scp-hosts.sh 脚本的具体解读。
DS版本:3.1.4
scp-hosts.sh 代码清单:
workDir=`dirname $0`
workDir=`cd ${workDir};pwd`source ${workDir}/env/install_env.shworkersGroup=(${workers//,/ })
for workerGroup in ${workersGroup[@]}
doecho $workerGroup;worker=`echo $workerGroup|awk -F':' '{print $1}'`group=`echo $workerGroup|awk -F':' '{print $2}'`workerNames+=($worker)groupNames+=(${group:-default})
donehostsArr=(${ips//,/ })
for host in ${hostsArr[@]}
doif ! ssh -o StrictHostKeyChecking=no -p $sshPort $host test -e $installPath; thenssh -o StrictHostKeyChecking=no -p $sshPort $host "sudo mkdir -p $installPath; sudo chown -R $deployUser:$deployUser $installPath"fiecho "scp dirs to $host/$installPath starting"for i in ${!workerNames[@]}; doif [[ ${workerNames[$i]} == $host ]]; thenworkerIndex=$ibreakfidone# set worker groups in application.yaml[[ -n ${workerIndex} ]] && sed -i "s/- default/- ${groupNames[$workerIndex]}/" $workDir/../worker-server/conf/application.yamlfor dsDir in bin master-server worker-server alert-server api-server ui toolsdoecho "start to scp $dsDir to $host/$installPath"# Use quiet mode to reduce command line outputscp -q -P $sshPort -r $workDir/../$dsDir $host:$installPathdone# restore worker groups to default[[ -n ${workerIndex} ]] && sed -i "s/- ${groupNames[$workerIndex]}/- default/" $workDir/../worker-server/conf/application.yamlecho "scp dirs to $host/$installPath complete"
done
以下是对这段DolphinScheduler脚本安装代码的逐行解释:
1. 获取脚本所在目录
workDir=`dirname $0`
workDir=`cd ${workDir};pwd`
dirname $0
:$0
代表当前执行的脚本文件名,dirname
命令用于提取文件路径中的目录部分。这行代码获取了当前脚本所在的目录。cd ${workDir};pwd
:进入该目录,然后使用pwd
命令获取该目录的绝对路径,并将其赋值给workDir
变量。
2. 加载安装环境配置文件
source ${workDir}/env/install_env.sh
source
命令用于在当前 shell 环境中执行指定的脚本文件。这里加载了install_env.sh
文件,该文件通常包含了安装过程中需要使用的环境变量等配置信息。
3. 解析 workers 变量并存储 worker 和 group 信息
workersGroup=(${workers//,/ })
for workerGroup in ${workersGroup[@]}
doecho $workerGroup;worker=`echo $workerGroup|awk -F':' '{print $1}'`group=`echo $workerGroup|awk -F':' '{print $2}'`workerNames+=($worker)groupNames+=(${group:-default})
done
workersGroup=(${workers//,/ })
:将workers
变量中的逗号替换为空格,然后将结果存储在数组workersGroup
中。workers
变量可能是一个以逗号分隔的字符串,每个元素格式为worker:group
。for workerGroup in ${workersGroup[@]}
:遍历workersGroup
数组中的每个元素。worker=
echo $workerGroup|awk -F’:’ ‘{print $1}’``:使用awk
命令以冒号为分隔符,提取每个元素的第一部分(即 worker 名称),并将其赋值给worker
变量。group=
echo $workerGroup|awk -F’:’ ‘{print $2}’``:同理,提取每个元素的第二部分(即 group 名称),并将其赋值给group
变量。workerNames+=($worker)
:将提取的 worker 名称添加到workerNames
数组中。groupNames+=(${group:-default})
:将提取的 group 名称添加到groupNames
数组中,如果group
为空,则使用默认值default
。
4. 解析 ips 变量并在远程主机上进行操作
hostsArr=(${ips//,/ })
for host in ${hostsArr[@]}
do
hostsArr=(${ips//,/ })
:将ips
变量中的逗号替换为空格,然后将结果存储在数组hostsArr
中。ips
变量可能是一个以逗号分隔的远程主机 IP 地址或主机名列表。for host in ${hostsArr[@]}
:遍历hostsArr
数组中的每个主机。
5. 检查远程主机上的安装路径是否存在,若不存在则创建
if ! ssh -o StrictHostKeyChecking=no -p $sshPort $host test -e $installPath; thenssh -o StrictHostKeyChecking=no -p $sshPort $host "sudo mkdir -p $installPath; sudo chown -R $deployUser:$deployUser $installPath"fi
ssh -o StrictHostKeyChecking=no -p $sshPort $host test -e $installPath
:使用ssh
命令连接到远程主机,检查$installPath
目录是否存在。-o StrictHostKeyChecking=no
选项用于跳过 SSH 密钥验证,-p $sshPort
指定 SSH 端口号。- 如果目录不存在,则执行
sudo mkdir -p $installPath; sudo chown -R $deployUser:$deployUser $installPath
命令,在远程主机上创建该目录,并将其所有权赋予$deployUser
用户和组。
6. 查找当前主机对应的 worker 索引
echo "scp dirs to $host/$installPath starting"for i in ${!workerNames[@]}; doif [[ ${workerNames[$i]} == $host ]]; thenworkerIndex=$ibreakfidone
echo "scp dirs to $host/$installPath starting"
:输出提示信息,表示开始将目录复制到远程主机的安装路径。for i in ${!workerNames[@]}
:遍历workerNames
数组的索引。if [[ ${workerNames[$i]} == $host ]]
:检查当前索引对应的 worker 名称是否与当前主机名相同,如果相同,则将该索引赋值给workerIndex
变量,并跳出循环。
7. 修改 worker-server 配置文件中的 group 信息
[[ -n ${workerIndex} ]] && sed -i "s/- default/- ${groupNames[$workerIndex]}/" $workDir/../worker-server/conf/application.yaml
[[ -n ${workerIndex} ]]
:检查workerIndex
变量是否为空。- 如果不为空,则使用
sed
命令在$workDir/../worker-server/conf/application.yaml
文件中,将- default
替换为- ${groupNames[$workerIndex]}
。
8. 将目录复制到远程主机
for dsDir in bin master-server worker-server alert-server api-server ui toolsdoecho "start to scp $dsDir to $host/$installPath"# Use quiet mode to reduce command line outputscp -q -P $sshPort -r $workDir/../$dsDir $host:$installPathdone
for dsDir in bin master-server worker-server alert-server api-server ui tools
:遍历需要复制的目录列表。scp -q -P $sshPort -r $workDir/../$dsDir $host:$installPath
:使用scp
命令将本地的$dsDir
目录递归复制到远程主机的$installPath
目录下。-q
选项用于安静模式,减少命令行输出。
9. 恢复 worker-server 配置文件中的 group 信息
[[ -n ${workerIndex} ]] && sed -i "s/- ${groupNames[$workerIndex]}/- default/" $workDir/../worker-server/conf/application.yaml
- 与步骤 7 类似,将
application.yaml
文件中的- ${groupNames[$workerIndex]}
恢复为- default
。
10. 输出复制完成提示信息
echo "scp dirs to $host/$installPath complete"
done
echo "scp dirs to $host/$installPath complete"
:输出提示信息,表示将目录复制到远程主机的安装路径完成。
综上所述,这段脚本的主要功能是将 DolphinScheduler 的相关目录复制到多个远程主机的指定安装路径,并根据配置信息修改 worker-server 的配置文件。