@wenshizhang
2016-10-10T10:51:53.000000Z
字数 4764
阅读 467
suse实习
周报
shell
crmsh
hb_report
前面大概分析了crmsh的源码,后面我的工作就是把crmsh中的hb_report
改称用python实现,现在使用的hb_report
是用shell实现的,很有挑战性,因为bash和python都不熟悉。
这个问题,我刚开始也很迷惑。因为目前hb_report
可以完成期待的工作。而且hb_report
并不是任何一个产品的feature。我去问crmsh的作者,他具体说了三点:
* 为了减少产生bug的风险,crmsh和hb_report
工作起来有点类似(因为都是去读集群的状态吗?)
* 目前的hb_report
结构杂乱无章,可能因为不停的打patch然后导致的,也会出现一些新的bug,如果使用更加结构话的语言实现更方便调试
* 用python重写方便未来添加一些新的feature
根据man手册,hb_report是一个Pacemaker或者Heartbeat错误报告工具。它负责收集指定时间内集群相关的信息(包括日志、集群配置文件和系统信息等和),然后压缩成bz2和tar压缩包(也可以选择不压缩)。当集群中的某些节点以某些不知名错误被fence,这个工具可以用来收集出错时刻节点的信息。
其他的详细的信息参见传送门:hb_report man手册
为了更好的理解hb_report
的执行逻辑,调试了hb_report
,调试真的是一个很好用的工具,代码运行起来更容易理解了。
crmsh是用python实现,调试器使用pdb,使用命令和gdb差不多吧。
python -m pdb *.py
pdb调试器详细用法及命令参见传送门:pdb官方手册
打开man手册得到hb_report
的用法,hb_report -f 3:00 -t 4:00 -n "node1 node2 node3" report
表示收集从3:00开始到4:00,node1、node2和node3上的infomation,并命名为report存储在当前工作目录。
打印出当前系统环境变量的PATH变量,然后找到hb_report可执行文件的路径。
# echo $PATH
>>>/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
# find / -name hb_report
>>>/usr/share/crmsh/hb_report
>>>/usr/share/crmsh/hb_report/hb_report
>>>/usr/sbin/hb_report
>>>/usr/src/crmsh/hb_report
这样就得到了hb_report
的入口在/usr/sbin/hb_report
,并且该文件是用shell
实现的,先打开bash
调试参数,输出脚本的执行过程。
# bash -x /usr/sbin/hb_report -f 3:00 -t 4:00 -n "node1 node2 node3" report
>>>++ ps -o comm= 6091
>>>+ PARENT_COMMAND=bash
...
>>>+ crm report -f 3:00 -t 4:00 -n 'shiwen1 shiwen2 ' report
最后一行表示hb_report
实际上就是crm report,而且crm是用python实现的,bash不能调试这部分。
使用find
命令找到crm的路径
find / -name crm
>>>/usr/sbin/crm
>>>/usr/src/crmsh/crm
>>>/var/cache/crm
>>>/etc/crm
>>>/run/crm
得到crm的路径是/usr/sbin/crm
,启动pdb调试器。
python -m pdb /usr/sbin/crm report -f 3:00 -t 4:00 -n "node1 node2 node3" report
crm
的执行流程参见传送门:crmsh阅读笔记, 此处不再赘述。在前面crm分析中提到,crm每一个命令的实现使用command_info.function
方法封装,report
命令的command_info.function
创建子进程执行/usr/share/crmsh/hb_report/hb_report
,父进程等待子进程退出。
/usr/share/crmsh/hb_report/
目录下的文件就是hb_report
的源码实现,用shell实现。调试这个shell脚本。
bash -x /usr/share/crmsh/hb_report/hb_report -f 3:00 -t 4:00 -n "node1 node2 node3" report
utillib.sh
模块中的findlogdcf
函数查找logd.cf文件utillib.sh
模块中的init_tmpfiles
函数创建temp files,如果创建不成功打印错误信息并退出(执行EXIT信号)。__slave
,如果是,激活SLAVE参数。.hb_report.workdir.XXXXX
,后面是随机生成WORKDIR
变量中hb_report
使用示例,这里解析参数分别是-f
、-t
和-n
。-f
表示开始时间,调用str2time
函数,传入参数3:00执行了一些没看懂的工作,给FROM_TIME
赋值。-t
表示结束时间,调用str2time
函数传入参数4:00执行了一些工作,给TO_TIME
赋值。-n
表示节点列表,把解析出来的节点参数赋值给USER_NODES
。解析参数结束。dest
参数用来指明存储生成文件的位置,缺省表示当前目录。.env
文件。crm daemon
、pacemaker
和crm configure
文件的目录cluster
的类型(openAIS
或者Heartbeat
),或者是用户指定类型,根据不同的类型执行不同的support
脚本。、cluster node list
,并且判断输入的node name
是否合法master
到slave
ssh服务是否可用,如果不可用打印信息退出(hb_report
认为运行hb_report
脚本的cluster node是master node,其他的是slave node)现在是2016年09月28日14:51分,hb_report
源码第一遍大概读完了,值得纪念一下。
hb_report
目录下有四个脚本,hb_report
脚本、utillib.sh
脚本、ha_cf_support.sh
脚本和openais_conf_support.sh
脚本,都是shell实现。其中hb_report
脚本是入口脚本,他负责整个hb_report
的逻辑调用,其他脚本都是各种各样的函数实现。
前面说了,hb_report
是入口脚本,负责hb_report
的全部逻辑。这个脚本中也实现了一些函数,下面是实现的大部分函数的分析。
/usr/share/crmsh/hb_report/hb_report __slave
脚本负责收集信息;如果node是slave,打印提示信息,ssh到node上并运行/usr/share/crmsh/hb_report/hb_report __slave
脚本。hb_report
允许用户指定ssh用户,此函数测试master使用指定的用户或者默认用户能否远程连接到slave上。try_user_list
赋值,用户指定的ssh_user
或者默认user(缺省值是root和hacluster)。for循环调用testsshconn函数测试master到每一个slave是否可以建立远程连接。get_crm_daemon_dir
函数得到pacemaker 的daemon目录,错误判断。调用get_pe_state_dir
得到pacemaker的位置,,调用get_cib_dir
得到crm的configure文件。测试集群使用ptest
或者crm_simulate
来管理pacemaker资源的,导出上面得到的这些数据。hb_report
命令的节点认为是master节点,其他的节点都是slave节点。不明白是怎么区分的,也不明白为什么要一直test。utillib.sh
脚本中没有可以直接执行的语句,全部是函数的实现。下面是函数的具体解释。
/etc
和/etc/ha.d
/usr/lib64/heartbeat/ha_logd
是否存在并且执行位是否已打开,测试strings
命令是否存在,。/tmp
目录下创建一个temp文件,文件名随机。如果用户输入了ctrl+c
或者ctrl+d
,删除创建的文件。如果创建过程出错,打印错误信息并退出。做一些环境初始化的工作,比如先测试相关的命令,相关函数是否存在,配置文件是否存在等等。