shell脚本如何执行指定函数(ansbile任务脚本及ansbile_script模块脚本合成)
由于工作中经常需要使用ansible去批量执行脚本,再对ansible返回的结果进行过滤统计入库,为了实现自动化采集,设置定时任务执行ansible采集及过滤脚本
举例说明:
#定时任务脚本内容
#!/bin/bash #调用ansible script模块执行本地脚本,获取所有被管理主机的磁盘信息 ansible all -m script -a "采集脚本路径" -b > 临时文件 #根据成功返回内容过滤出有效信息 for info in $(awk '过滤规则' 临时文件) do #将成功信息insert入数据库 done #根据错误返回内容过滤出有效信息 for err_info in $(awk '过滤规则' 临时文件) do #将错误信息insert入数据库 done
#采集脚本内容 #!/bin/bash #采集内容略
采集逻辑是,通过执行定时任务脚本,调用ansbile管理机上的采集脚本,获取所有被管理机器的数据信息。
此脚本的缺陷是,移植性极差,并且强依赖采集脚本(若采集脚本丢失,则导致定时任务执行失败),随着脚本增加会导致脚本管理不方便,因此考虑将两个脚本合成一个脚本,做到一个脚本实现全功能。
合成脚本的实现想法:
根据传入的参数决定执行的函数,样例:
#!/bin/bash #数据采集函数 function info_collect() { #采集内容 } #定时任务函数 function cron_script() {
ansible all -m script -a "$0 info_collect" -b
}
#主函数,传入$1变量,根据变量内容决定执行的函数
function main() {
case $1 in
"info_collect")
info_collect
;;
"cron_script")
cron_script
;;
*)
echo "error"
exit 1
;;
esac
}
func_select=${1:-cron_script} #脚本默认执行cron_script这个函数
main $func_select
脚本逻辑:脚本执行时根据位置变量$1(若没有传入参数,则默认值为cron_script)选择执行对应的函数,此函数使用ansible的script模块调用同个脚本自身,根据传入新位置变量info_collect调用数据采集函数执行相关操作。
至此,实现脚本二合一。