
国企运维
1、mkdir /puppet mkdir /puppet/soft 2、服务端安装dnsmasq:yum install -y dnsmasq cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak echo "">/etc/dnsmasq.conf 3、配置dnsmasq:vi /etc/dnsmasq.conf resolv-file=/etc/resolv.confstrict-orderlisten-address=192.169.50.25,127.0.0.1addn-hosts=/etc/dnsmasq.hostscache-size=100bogus-nxdomain=114.114.114.1144、vi /etc/dnsmasq.hosts192.169.50.25 yourhostname5、 firewall-cmd --add-port=53/tcp --permanent firewall-cmd --reload service dnsmasq start 6、服务端安装puppet-serverrpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpmyum install -y puppet-server openssl*service puppetmaster startchkconfig puppetmaster onfirewall-cmd --add-port=8140/tcp --permanentfirewall-cmd --reload7、客户端安装puppet:rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpmyum install -y puppet openssl*service puppet startchkconfig puppet onfirewall-cmd --add-port=8140/tcp --permanentfirewall-cmd --reload设置DNS为puppetmaster的地址echo "192.168.50.25 puppetmaster">>/etc/hosts签发证书: puppet agent --server puppetmaster --test8、windows安装 安装ruby rubyinstaller-1.9.3-p551.exe 安装mcollective_2_3_2_Setup.exe 设置DNS为puppetmaster的地址 192.168.50.25 puppetmaster 写到 C:\Windows\System32\drivers\etc 签发证书: puppet agent --server puppetmaster --test 9、在puppetmaster上添加/etc/dnsmasq.hosts,新的两台客户端记录 添加puppetmaster和两台客户端的地址到/etc/hosts 签发证书:puppet cert --sign --all 10、服务端设置自动签发证书 vi /etc/puppet/autosign.conf * 11、服务端安装svn:yum install -y zlib expat-devel cd /puppet/softwget http://openssl.org/source/openssl-1.0.1c.tar.gzwget https://archive.apache.org/dist/subversion/subversion-1.7.7.tar.gzwget http://sqlite.org/sqlite-autoconf-3071401.tar.gzwget http://www.webdav.org/neon/neon-0.29.6.tar.gzwget https://sourceforge.net/projects/pcre/files/pcre/8.42/pcre-8.42.tar.gz/download -O pcre-8.42.tar.gzwget http://archive.apache.org/dist/httpd/httpd-2.2.23.tar.gzwget http://mirror.bit.edu.cn/apache//apr/apr-1.6.5.tar.gzwget http://mirror.bit.edu.cn/apache//apr/apr-util-1.6.1.tar.gztar zxvf openssl-1.0.1c.tar.gz tar zxvf subversion-1.7.7.tar.gz tar zxvf sqlite-autoconf-3071401.tar.gz tar zxvf neon-0.29.6.tar.gztar zxvf pcre-8.42.tar.gz tar zxvf httpd-2.2.23.tar.gz tar zxvf apr-1.6.5.tar.gztar zxvf apr-util-1.6.1.tar.gz cd openssl-1.0.1cmv /usr/bin/pod2man /usr/bin/pod2manbak ./config --prefix=/usr/local/openssl enable-shared&&make&&make install&&cd ..cd sqlite-autoconf-3071401./configure --prefix=/usr/local/sqlite&&make && make install&&cd ..cd apr-1.6.5./configure --prefix=/usr/local/apr&&make&&make install&&cd ..cd apr-util-1.6.1./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-util&&make&&make install&&cd .. cd neon-0.29.6/ ./configure --prefix=/usr/local/neon --with-ssl --with-libs=/usr/local/openssl --enable-shared&&make && make install && cd ..cd pcre-8.42 ./configure --prefix=/usr/local/pcre&&make&&make install&&cd ..cd httpd-2.2.23./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-ssl=/usr/local/openssl --enable-dav --enable-so --enable-ssl --enable-rewrite&&make&&make install&&cd ..cd subversion-1.7.7echo "/usr/local/openssl/lib">>/etc/ld.so.confldconfig -v./configure --with-apxs=/usr/local/httpd/bin/apxs --with-ssl=/usr/local/openssl --with-sqlite=/usr/local/sqlite --prefix=/usr/local/subversion --with-openssl --with-neon=/usr/local/neon --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util&&make&&make install&&cd .. cd /usr/local/subversion/bin./svnadmin create /puppet/svn chown -R apache /puppet/svnchmod -R 755 /puppet/svnln -s /usr/local/subversion/bin/{svn,svnserve} /usr/local/bin svnserve -d -r /puppet/svn 添加SVN账号密码,检测 vi /puppet/svn/conf/passwdsvnadmin = yourpasswordsvn co svn://localhost/ --username svnadmin --password yourpassword /puppet/svn 修改httpd.conf端口81,因为和nginx冲突 /usr/local/httpd/bin/httpd -f /usr/local/httpd/conf/httpd.conf echo "/usr/local/httpd/bin/httpd -f /usr/local/httpd/conf/httpd.conf ">>/etc/rc.local/usr/local/httpd/bin/htpasswd -bc /puppet/svn_passwd puppet yourpassword 在httpd.conf中添加 LoadModule dav_svn_module /usr/local/httpd/modules/mod_dav_svn.so LoadModule authz_svn_module /usr/local/httpd/modules/mod_authz_svn.so Listen 8080 <Location /svn> DAV svn SVNPath /puppet/svn AuthType Basic AuthName "Subversion repository" AuthUserFile /puppet/svn_passwd Require valid-user AuthzSVNAccessFile /puppet/svn_access </Location> </VirtualHost> 重启httpd chmod 777 /puppet/svn_passwdchmod -r 777 /puppet/svn /usr/local/httpd/bin/httpd -f /usr/local/httpd/conf/httpd.conf -k restart 添加权限 vi /puppet/svn_access[groups]admins=puppet [/] @admins=rw *= 关闭svnserve pkill svnserve rm -fr /etc/puppet svn co http://172.16.50.25:8080/svn /etc/puppet --username puppet --password yourpassword --no-auth-cache cd /puppet/svn/hooks/cp post-commit.tmpl post-commitchmod -R 777 /etc/puppet 设置钩子 vi post-commitexport LANG=en_US.UTF-8 SVN=/usr/local/subversion/bin/svn PUPPET_DIR=/etc/puppet $SVN update $PUPPET_DIR --username puppet --password yourpassword --no-auth-cache service puppetmaster restart dnsmasq速度有点慢 证书的注销 puppet cert revoke zabbix.ewin.compuppet cert revoke --allservice puppetmaster restart证书删除: puppet cert --clean zabbix.ewin.com #单个删除 puppet cert --clean --all #全部删除
1、Elasticsearch的堆栈内存设置建议  2、elasticsearch.yml设置中文分词器: /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/elasticsearch-analysis-ik-6.5.4.zip //安装完,在elasticsearch.yml中添加配置 index.analysis.analyzer.default.type: ik 3、关闭elasticsearch curl -XPOST http://localhost:9200/_cluster/nodes/_shutdown   4、监控客户端状态的插件head; http://localhost:9200/_plugin/head  5、Marvel 图形化监控客户端 http://lcalhost:9200/_plugin/marvel/  6、Health 查看集群状态  7、架构  8、http://ip:9200/index/type/id index: dbname type: dbtable GET/POST/PUT/DELETE ?pretty 增强可读性 9、mapping 映像,相当于数据类型 10、搜索参数:_search?q=location:Shanghai 11、实例 创建索引文件test,用PUT方法创建 创建mapping文件,//不是elasticsearch的注释,mapping相当于对象   创建检索表达式      12、用XPUT方式创建索引  用_settings修改索引  索引属性:number_of_replicas 索引的副本数量 blocks.read_only 只读 blocks.read 禁止读取 blocks.write blocks.metadata 调取索引的配置:curl -XGET http://ip:port/weibo/_settings http://xx/weibo1,weibo2/_settings _all/_settings 所有索引 mar*/_settings 13、插入数据  String,Integer,Long,Float,Double,Boolean,Null,Date 14、_stats 索引状态   15、配置mapping PUT /{index}/_mapping/{type} PUT /index/type/_mapping -d '{ "wb":{ "properties": { "mymessage":{ "type":"String", "store": true } } } }' 获取get /index/_mapping/type _all/_mapping 获取索引某个字段 get /index/_mapping/type/field/user 删除DELETE 16、打开关闭索引文件 curl -XPOST /myindex/_open curl -XPOST /myindex/_close 检索 curl -XHEAD /myindex -v XDELETE 清空索引缓存 curl -XPOST /myindex/_cache/clear 刷新索引数据 curl -XPOST /myindex/_refresh 优化索引数据 curl -XPOST /myindex/_optimize flush /myindex/_flush 给索引配置分析器  临时使用分词器  获取文档指定信息  ?pretty&fields=user 只显示user字段  删除 curl -XDELETE /// 数据更新 xput     xpost + _mget? 批量获取  _source 获取数据 _query?q=user:xxx -------------------------------------------------------------------------------------- 信息检索:curl -XGET ip/_search?q=hello&pretty=true terms查询:不作分词 match_all:{} 查询所有 常规查询:+ -
[2014-07-23 14:03:41](javascript:;) kernel.shmmax = 2147483648 // 该参数定义了共享内存段的最大尺寸(以字节为单位)。 其值应>=sag_max_size初始化参数的大小,否则SAG由多个内存段构成,效率降低, 还要不小于物理内存的一半,默认情况下在32位x86系统中,Oracle SGA最大不能超过1.7GB. 缺省为32M,对于oracle来说,该缺省值太低了,通常将其设置为2G kernel.shmmni = 4096 // 这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096. 此值也是在系统中可以启动的Oracle实例的最大数量,通常不需要更改, 因为显然在生产环境下,一个服务器上同时启动的实例个数达不到这个数量. kernel.shmall = 2097152 // 该参数表示系统任意时刻可以分配的所有共享内存段的总和的最大值(以页为单位). 其值应不小于shmmax/page_size.缺省值就是2097152,如果服务器上运行的所有实例的 SGA总和不超过8GB(通常系统可分配的共享内存的和最大值为8GB),通常不需要修改. kernel.sem = 250 32000 100 128 // 表示设置的信号量 fs.file-max = 65536 // 表示一个进程可以打开的文件句柄的最大数量. net.ipv4.ip_local_port_range = 1024 65000 //专用服务器模式下与用户进程通信时分配给用户的端口区间 net.core.rmem_default=262144 // 默认接收缓冲区大小 net.core.rmem_max=262144 // 接收缓冲区最大值 net.core.wmem_default=262144 // 默认的发送缓冲区大小 net.core.wmem_max=262144 // 发送缓冲区最大值 以上四个值的设置是Oracle安装时推荐的.(应在安装完后把最大值改为524288) 修改好内核参数后,执行如下命令使新的设置生效 /sbin/sysctl -p
echo a|awk '{print substr(,1,8)}' {string##string}{string%string} {string/a/b} ${string//a/b} {string:3} [[]]
命令模式、插入模式 :wq u 回退 :q! :w /root/file 保存到别的地方 执行系统指令 :!rm xxxx :!df -h :!ls /tmp 移动:hjkl 4l 设置行距::set wm=10 :0 :$ :set nu 显示行号 i,a d,p y,p c替换 dd 2dd x删除字符 yy,p S 替换 滚动屏幕:^F ^B ^D ^U前滚动,后滚动,半 z. 移动到屏幕中间 ctrl+l 刷新屏幕 H M L head,middle,last / ? vi + file 打开文件到最后一行 vi +n file vi +/hehe file 到第一次hehe的地方 vi -R file 只读 vi -r xx 恢复到奔溃的 保存部分 :230,w filename 当前行到末尾保存 :230,$w >>file 追加 :r filename 复制另外文件 :110r filename 复制到110行 :0r :$r :e filename 编辑另一个文件 :w %.new %代表当前文件名 :s/old/new/ :s/old/new/g :10,100s/old/new/g :1,$s/old/new/g :%s/old/new/g 替换时确认 :$s/old/new/gc [[:alpha:]] [[:alnum:]] [[:blank:]] [[:digit:]] :%S/[ABC]/[abc]/g :%S/ */ /g :%S/^/\L&/100 #将100行内的小写转换成大写 vi/vim 中可以使用 :s 命令来替换字符串。 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky n 为数字,若 n 为 .,表示从当前行开始到最后一行 :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/ :%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/ 删除文本中的^M 问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。 · 使用命令:cat filename1 | tr -d “VM” > newfile; · 使用命令:sed -e “s/VM//” filename > outputfilename。需要注意的是在1、2两种方法中,V和M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。 · 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/VM//。 · :%s/^M$//g 如果上述方法无用,则正确的解决办法是: · tr -d "\r" < src >dest · tr -d "\015" <src >dest · strings A>B 其它 利用 :s 命令可以实现字符串的替换。具体的用法包括: :s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1 :s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1 :., s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1 :g/str1/s//str2/g 功能同上 从上述替换命令可以看到:g放在命令末尾,表示对搜索字符串的每次出现进行替换;不加g表示只对搜索字符串的首次出现进行替换;g放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。 -- 搜索时忽略大小写 :set ic :set noic :set all 查看变量 :r !date 追加当前日期 :10,100!sort 排序 :!tr [a-z] [A-Z] 在命令模式下,可以输入如下命令: i:在当前光标的前面插入一个字符 I:移动光标到行首 a:在当前光标的后面插入一个字符 A:移动到行末 o:移动到下一行 O:移动到上一行 yy:复制光标所在的这一行 4yy:复制 光标所在行开始向下的4行 p:粘贴 dd:剪切 光标所在的这一行 2dd:剪切 光标所在的行向下2行 D:从当前的光标开始剪切,一直到行末 d0:从当前的光标开始剪切,一直到行首 x:删除当前的光标,每次只会删除一个 X:删除当前的光标前面的那个,每次只会删除一个 h:向左移动 j:向下移动 k:向上移动 l:向右移动 H:移动到当前屏幕的上方 M:移动到当前屏幕的中间 L:移动到当前屏幕的下方 ctrl+f:向下翻一页代码 ctrl+b:向上翻一页代码 ctrl+d:向下翻半页代码 ctrl+u:向上翻半页代码 20G:快速的定位到第二十行代码 gg:快速回到整个代码的第一行 G:快速的定位到整个代码的最后一行 w:向后跳一个单词的长度,即跳到下一个单词的开始处 b:向前跳一个单词的长度,即跳到上一个单词的开始处 u:撤销刚刚的操作 ctrl+r:反撤销 选中一片代码使用下列2个命令 v:从当前光标开始向后选择,需要继续按上下左右方向键 V:选中一行,需要继续按上下左右方向键 >>:向右移动代码 <<:向左移动代码 . :重复执行上一次的命令 { :按段移动,上移 }:按段移动,下移 dw:删除光标开始位置的字(一个单词),包含光标所在字符 r:替换一个字符 R:替换光标以及后面的字符 /要查找的内容:搜索(需要按回车) n:下一个 N:上一个 shift+zz:相当于wq 在末行模式下,如下: :%s/abc/123/g :末行模式下,吧当前文件的abc替换成123 :1,10s/abc/123/g:吧第一行到第十行之间的abc替换成123 w:保存 q:退出 wq:保存并退出 q!:强制退出,不保存 vi(vim)可以说是linux中用得最多的工具了,不管你配置服务也好,写脚本也好,总会用到它。但是,vim作为一个“纯字符”模式下的工具,它的操作和WINDOWS中的文本编辑工具相比多少有些复杂。这里,我根据自己个人的使用经验,整理了一套vim的操作以及记忆的方法,希望对大家的学习有所帮助。 VI的三种模式 1,命令模式 2,输入模式 3,末行模式 命令 执行的操作 记忆方法 :q 退出 quit :w 存盘 write :e 打开新文件 :r 读取文件到VI read :! 强行 :set nu 显示行号 number :set nonu 隐藏行号 no number h j k l 左 下 上 右 Ctrl + f 翻到下一页(向前翻页) front Ctrl + b 翻到上一页(向后翻页) back Ctrl + u 向前翻半页 Ctrl + d 向后翻半页 ^ 移到行头 往上就到行头了(象形) $ 移到行尾 写完一行就要给一行的钱 w 下一个单词 word b 前一个单词 behind(在。。。后面) e 下一单词尾 end G 跳到某一行 大哥(G)说到哪就到哪 i 光标前插入 insert a 光标后加入 add A 在行末加入 在一个词后是小a,一个行后就是大A o 另起一行加入 一个小鸡蛋(小o)掉下来了摔开了花 O 上一行加入 吐一个大泡泡(大O)飞上去破了 ---------- c(吃掉)代表行内删除-------- cw 删除一个单词(一部分不包括空格) 吃掉一个 word c$ 删除一行到行尾 刚写的一行被删了,钱也拿不到了 c^ 删除一行到行头 往上吃,一直吃到头 x 删除一个字符 看你不爽就打上“x” ---------- d 代表删除-------------- dd 删除一行 del dir dw 删除单词到尾部(包括空格) del word de 删除单词到尾部(不包括尾部空格) del end d(代表尾部) d^ 删除当前到行首的所有字符 del ^(代表行首) J 合并当前行 一个大钩子(J)把下面的一行拉到自己行尾 u 撤销上次操作 undo U 撤销当前行所有操作 事情闹大了,得有个更大的UNDO才能恢复 Ctrl + r 恢复undo 前 recover VI中的多行删除 单行删除:1(待删除行)d 多行删除:1,10d 光标所在行,dd 光标所在行以下的N行,Ndd --------- y 代表复制到缓存中----------- yy 复制当前行整行的内容到vi缓冲区 yw 复制当前光标到单词尾字符的内容到vi缓冲区 y$ 复制当前光标到行尾的内容到vi缓冲区 y^ 复制当前光标到行首的内容到vi缓冲区 p 读取vi缓冲区中的内容,并粘贴到光标当前的位置(不覆盖文件已有的内容) /word 从上而下查 /是从上而下写的吧 ?word 从下而上查找 字符在哪儿呢(?)回头找找吧 n 定位下一个匹配的 相当于向下查找下一个 next N 定位上一个匹配的 相当于向上查找上一个 :s/1/2 搜索当前行第一个1并用2代替 search :s/1/2/g 搜索当前行所有的1并用2代替 global :#,#s/1/2/g 在#,#间搜索所有1并用2替换 :%s/1/2/g 在整个文档中将1替换为2 100%(全部) :s/1/2/c 每次替换都给出提示确认 cue提示 vim 1.txt 2.txt 3.txt 同时打开多个文档 :args 显示多文件信息(会在末行提示当前打开了哪些档) are globals :next 切换到下一个文件 :prev 切换到上一个文件 :first 定位首文件 :last 定位尾文件 Ctrl + ^ 快速切换到编辑器中切换前的文件 vi的基本概念 基本上vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),各模式的功能区分如下: 1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。 2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。 3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。 不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,把vi分成Command 和Insert mode。 vi的基本操作 进入vi 在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面: $ vi testfile 有一点要特别注意,就是您进入vi之后是处于“Command mode”下,您要切换到Insert mode才能输入文字。初次用vi的用户都会想先用上下左右键移动光标,结果电脑一直叫,把自己气个半死,所以进入vi后,先不要乱动,转换入Insert后再说。 切换至Insert mode编辑文件 在Command mode下按‘i’、‘a’或‘o’三键就可进入Insert mode。这时候您就可以开始输入文字了。 i: 插入,从目前光标所在之处插入所输入的文字。 a: 增加,目前光标所在的下一个字开始输入文字。 o: 插入新的一行,从行首开始输入文字。 Insert的切换→Command mode,按Esc键 您目前处于Insert mode,您就只能一直打字。假如您发现打错字了,想用光标键往回移动,将该字删除,就要按ESC键转换回Command mode,再删除文字。 离开vi及存文件 在Command mode下,可按冒号“:”键入入Last line mode,例如: :w filename (输入“w filename”,将文章存入指定的文件名filename) :wq (输入“wq”,因为进入之时已经指定文件名testfile,所以会写入testfile并离开vi) :q! (输入“q!”,强制离开并放弃编辑的文件) Command mode功能键列表 在介绍command mode指令的时后,指令后面加上“常用”字眼的功能键,表示比较常用的vi指令,请读者您一定要学会、记住。 (1)I、a、o切换进入Insert mode。[超级常用] (2)移动光标 vi可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母 h、j、k、l,分别控制光标左、下、上、右移一格。 按Ctrl+B:屏幕往后移动一页。[常用] 按Ctrl+F:屏幕往前移动一页。[常用] 按Ctrl+U:屏幕往后移动半页。 按Ctrl+D:屏幕往前移动半页。 按 0 (数字零):移动文章的开头。[常用] 按 G:移动到文章的最后。[常用] 按 w:光标跳到下个word的开头。[常用] 按 e:光标跳到下个word的字尾。 按 b:光标回到上个word的开头。 按 $:移到光标所在行的行尾。[常用] 按 ^:移到该行第一个非空白的字符。 按 0:移到该行的开头位置。[常用] 按 #:移到该行的第#个位置,例:51、121。[常用] (3)删除文字 x:每按一次删除光标所在位置的后面一个字符。[超常用] x:例如,6x 表删除光标所在位置的后面6个字符。[常用] X:大字的X,每按一次删除光标所在位置的前面一个字符。 X:例如,20X 表删除光标所在位置的前面20个字符。 dd:删除光标所在行。[超常用] dd:例如,6dd表删除从光标所在的该行往下数6行之文字。[常用] (4)复制 yw:将光标所在处到字尾的字符复制到缓冲区中。 (想在和#x、#X的功能相反) p:将缓冲区内的字符粘贴到光标所在位置(指令‘yw’与‘p必须搭配使用)。 yy:复制光标所在行。[超常用] p:复制单行到您想粘贴之处。(指令‘yy’与‘p’必须搭配使用) yy:如:6yy表示拷贝从光标所在的该行往下数6行之文字。[常用] p:复制多行到您想粘贴之处。(指令‘#yy’与‘p’必须搭配使用) “ayy:将复制行放入buffer a, vi提供buffer功能,可将常用的数据存在buffer “ap:将放在buffer a的数据粘贴。 “b3yy:将三行数据存入buffer b。 “b3p:将存在buffer b的资料粘贴 (5)取代 r: 取代光标所在处的字符:[常用] R:取代字符直到按Esc为止。 (6)复原(undo)上一个指令 u:假如您误操作一个指令,可以马上按u,回复到上一个操作。[超常用] .: .可以重复执行上一次的指令。 (7)更改 cw:更改光标所在处的字到字尾$处。 c#w:例如,c3w代表更改3个字。 (8)跳至指定行 Ctrl+G:列出光标所在行的行号。 G:例如,15G,表示移动光标至文章的第15行行首。[常用] Last line mode下指令简介 读者您要使用Last line mode之前,请记得先按Esc键确定您已经处于Command mode下后,再按冒号“:”或“/”或“?”三键的其中一键进入Last line mode。 1.列出行号 set nu: 输入“set nu”后,会在文章的每一行前面列出行号。 2.跳到文章的某一行 :井号代表一个数字,在Last line mode提示符号“:”前输入数字,再按Enter就会跳到该行了,如:15[Enter]就会跳到文章的第15行。[常用] 3.寻找字符串 /关键字:先按/,再输入您想寻找的字,如果第一次找的关键字不是您相尽可能的,可以一直按n会往下寻找到您要的关键字为止。 ?关键字:先按?,再输入您想寻找的字,如果第一次找的关键字不是您想要的,可以按n会往前寻找到您要的关键字为止。 4.取代字符串 1,s/string/replace/g”会将全文的string字符串取代为replace字符串,其中1,s是相同的功能,c则是表示要替代之前必须再次确认是否取代。 1,20s/string/replace/g:将1至20行间的string替代为relpace字符串。 5.存文件 w:在last line mode提示符号“:”前按w即可将文件存起来。[超常用] ,# w filename:如果您想摘取文章的某一段,存成另一个文件,可用这个指令#代表行号,例如30,50 w nice,将您正在编辑文章的第30~50行存成nice这个文件。 6.离开 q:按q就离开,有时如果无法离开vi,可搭配“!:强置离开vi,如“q!” qw:一般建议离开时,搭配w一起使用,如此离开时还可存文件。[常用] 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后一行首 vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处 vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename vi filename....filename :打开多个文件,依次进行编辑 移动光标类命令 h :光标左移一个字符 l :光标右移一个字符 space:光标右移一个字符 Backspace:光标左移一个字符 k或Ctrl+p:光标上移一行 j或Ctrl+n :光标下移一行 Enter :光标下移一行 w或W :光标右移一个字至字首 b或B :光标左移一个字至字首 e或E :光标右移一个字至字尾 ) :光标移至句尾 ( :光标移至句首 }:光标移至段落开头 {:光标移至段落结尾 nG:光标移至第n行首 n+:光标下移n行 n-:光标上移n行 n:光标移至当前行尾 屏幕翻滚类命令 Ctrl+u:向文件首翻半屏 Ctrl+d:向文件尾翻半屏 Ctrl+f:向文件尾翻一屏 Ctrl+b;向文件首翻一屏 nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。 插入文本类命令 i :在光标前 I :在当前行首 a:光标后 A:在当前行尾 o:在当前行之下新开一行 O:在当前行之上新开一行 r:替换当前字符 R:替换当前字符及其后的字符,直至按ESC键 s:从当前光标位置处开始,以输入的文本替代指定数目的字符 S:删除指定数目的行,并以所输入文本代替之 ncw或nCW:修改指定数目的字 nCC:修改指定数目的行 删除命令 ndw或ndW:删除光标处开始及其后的n-1个字 do:删至行首 d$:删至行尾 ndd:删除当前行及其后n-1行 x或X:删除一个字符,x删除光标后的,而X删除光标前的 Ctrl+u:删除输入方式下所输入的文本 搜索及替换命令 /pattern:从光标开始处向文件尾搜索pattern ?pattern:从光标开始处向文件首搜索pattern n:在同一方向重复上一次搜索命令 N:在反方向上重复上一次搜索命令 :s/p1/p2/g:将当前行中所有p1均用p2替代 :n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代 :g/p1/s//p2/g:将文件中所有p1均用p2替换 选项设置 all:列出所有选项设置情况 term:设置终端类型 ignorance:在搜索中忽略大小写 list:显示制表位(Ctrl+I)和行尾标志($) number:显示行号 report:显示由面向行的命令修改过的数目 terse:显示简短的警告信息 warn:在转到别的文件时若没保存当前文件则显示NO write信息 nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符 nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始 mesg:允许vi显示其他用户用write写到自己终端上的信息 最后行方式命令 :n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下 :n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下 :n1,n2 d :将n1行到n2行之间的内容删除 :w :保存当前文件 :e filename:打开文件filename进行编辑 :x:保存当前文件并退出 :q:退出vi :q!:不保存文件并退出vi :!command:执行shell命令command :n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入 :r!command:将命令command的输出结果放到当前行 寄存器操作 "?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字 "?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字 "?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字 "?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字 ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。 VI的使用 一、插入文本 ┌──┬────────────┐ │命令│描述 │ ├──┼────────────┤ │i │在当前字符前插入文本 │ ├──┼────────────┤ │I │在行首插入文本 │ ├──┼────────────┤ │a │在当前字符后添加文本 │ ├──┼────────────┤ │A │在行末添加文本 │ ├──┼────────────┤ │o │在当前行后面插入一空行 │ ├──┼────────────┤ │O │在当前行前面插入一空行 │ ├──┼────────────┤ │R │以改写方式输入文本 │ └──┴────────────┘ 二、移动光标 ┌─────┬───────────┐ │命令 │描述 │ ├─────┼───────────┤ │j或下箭头 │向下移动一行 │ ├─────┼───────────┤ │k或上箭头 │向上移动一行 │ ├─────┼───────────┤ │h或左箭头 │左移一个字符 │ ├─────┼───────────┤ │l或右箭头 │右移一个字符 │ ├─────┼───────────┤ │w │右移一个词 │ ├─────┼───────────┤ │W │右移一个以空格分隔的词│ ├─────┼───────────┤ │b │左移一个词 │ ├─────┼───────────┤ │B │左移一个以空格分隔的词│ ├─────┼───────────┤ │0 │移到行首 │ │Ctrl-F │向前翻页 │ ├─────┼───────────┤ │Ctrl-B │向后翻页 │ ├─────┼───────────┤ │nG │到第n行 │ ├─────┼───────────┤ │G │到最后一行 │ └─────┴───────────┘ 三、替换文本 ┌─────┬──────┐ │命令 │描述 │ ├─────┼──────┤ │$ │到行尾 │ ├─────┼──────┤ │( │到句子的开头│ ├─────┼──────┤ │) │到句子的末尾│ ├─────┼──────┤ │{ │到段落的开头│ ├─────┼──────┤ │} │到段落的末尾│ └─────┴──────┘ 四、删除文本 ┌───┬───────────┐ │命令 │描述 │ ├───┼───────────┤ │r │替换一个字符 │ ├───┼───────────┤ │c │修改文本直到按下Esc健 │ ├───┼───────────┤ │cw │修改下一个词 │ ├───┼───────────┤ │cnw │修改接下来的n个词 │ └───┴───────────┘ 五、文本编辑 ┌──┬──────────────────────┐ │命寺│描述 │ ├──┼──────────────────────┤ │yy │将一行文本移到缺省缓冲区中 │ ├──┼──────────────────────┤ │yn │将下一个词移到缺省缓冲区中 │ ├──┼──────────────────────┤ │ynw │将后面的n个词移到缺省缓冲区中 │ ├──┼──────────────────────┤ │p │如果缺省缓冲区中包含一行文本,则在当前 │ │ │行后面插入一个空行井将缺省缓冲区中的声 │ │ │容粘贴到这一行中;如果缺省缓冲区中包含 │ │ │多个词,把这些词粘贴到光标的右边. │ ├──┼──────────────────────┤ │P │如果缺省缓冲区中包含一行文本,则正当前 │ │ │行前面插入一个空行井将缺省缓冲区中的内 │ │ │容粘贴到这一行中;如果缺省缓冲区中包含 │ │ │多个词,把这些词粘贴到光标的左边 │ └──┴──────────────────────┘ 六、保存退出 ┌───────────┬───────────────┐ │命令 │描述 │ ├───────────┼───────────────┤ │zz │保存并退出 │ ├───────────┼───────────────┤ │:w filename │写入文件 │ ├───────────┼───────────────┤ │:W │写入文件 │ ├───────────┼───────────────┤ │:x │保存(如果当前文件修改过)并退出│ ├───────────┼───────────────┤ │:q! │不保存文件,直接退出 │ ├───────────┼───────────────┤ │:q │退出vi │ VI常用技巧VI命令可以说是Unix/Linux世界里最常用的编辑文件的命令了,但是因为它的命令集众多,很多人都不习惯使用它,其实您只需要掌握基本命令,然后加以灵活运用,就会发现它的优势,并会逐渐喜欢使用这种方法。本文旨在介绍VI的一些最常用命令和高级应用技巧。 一、基本命令介绍 ---- 1.光标命令 k、j、h、l——上、下、左、右光标移动命令。虽然您可以在Linux中使用键盘右边的4个光标键,但是记住这4个命令还是非常有用的。这4个键正是右手在键盘上放置的基本位置。 nG——跳转命令。n为行数,该命令立即使光标跳到指定行。 Ctrl+G——光标所在位置的行数和列数报告。 w、b——使光标向前或向后跳过一个单词。 ---- 2.编辑命令 i、a、r——在光标的前、后以及所在处插入字符命令(i=insert、a=append、r=replace)。 cw、dw——改变(置换)/删除光标所在处的单词的命令 (c=change、d=delete)。 x、d | grep -v ^# ---- 2.在打开一个文件编辑后才知道登录的用户对该文件没有写的权限,不能存盘,需要将所做修改存入临时文件。 ---- vi file ---- :w /tmp/1 保存所做的所有修改,也可以将其中的某一部分修改保存到临时文件,例如仅仅把第20~59行之间的内容存盘成文件/tmp/1,我们可以键入如下命令。 ---- vi file ---- :20,59w /tmp/1 ---- 3.用VI编辑一个文件,但需要删除大段的内容。 ---- 首先利用编辑命令“vi file”打开文件,然后将光标移到需要删除的行处按Ctrl+G显示行号,再到结尾处再按Ctrl+G,显示文件结尾的行号。 ---- :23,1045d 假定2次得到的行号为23和1045,则把这期间的内容全删除,也可以在要删除的开始行和结束行中用ma、mb命令标记,然后利用“:a,bd”命令删除。 ---- 4.在整个文件的各行或某几行的行首或行尾加一些字符串。 ---- vi file ---- :3,/some string/g 在整个文件每一行的行尾添加“some string”。 ---- :%s/string1/string2/g 在整个文件中替换“string1”成“string2”。 ---- :3,7s/string1/string2/ 仅替换文件中的第3行到第7行中的“string1”成“string2”。 ---- 注意: 其中s为substitute,%表示所有行,g表示global。 ---- 5.同时编辑2个文件,拷贝一个文件中的文本并粘贴到另一个文件中。 ---- vi file1 file2 ---- yy 在文件1的光标处拷贝所在行 ---- :n 切换到文件2 (n=next) ---- p 在文件2的光标所在处粘贴所拷贝的行 ---- :n 切换回文件1 ---- 6.替换文件中的路径。 ---- 使用命令“:%s#/usr/bin#/bin#g”可以把文件中所有路径/usr/bin换成/bin。也可以使用命令“:%s//usr/bin//bin/g”实现,其中“”是转义字符,表明其后的“/”字符是
没有该主机组的时候要先添加主机组:./python_zabbix_host.py -A yourname vi python_zabbix_host.py !/usr/bin/python coding:utf-8 import json import urllib2 from urllib2 import URLError import sys, argparse import xlrd import socket import os os.chdir('/usr/local/src') os.system('yum install -y unzip') if os.path.exists('setuptools-38.2.4') == False: os.system( 'wget https://pypi.python.org/packages/69/56/f0f52281b5175e3d9ca8623dadbc3b684e66350ea9e0006736194b265e99/setuptools-38.2.4.zip#md5=e8e05d4f8162c9341e1089c80f742f64 --no-check-certificate') os.system('unzip setuptools-38.2.4.zip') os.chdir('/usr/local/src/setuptools-38.2.4') os.system('python setup.py build') os.system('python setup.py install') os.chdir('/usr/local/src') if os.path.exists('pip-9.0.1') == False: os.system( 'wget --no-check-certificate https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9') os.system('tar -xzvf pip-9.0.1.tar.gz') os.chdir('/usr/local/src/pip-9.0.1') os.system('python setup.py build') os.system('python setup.py install') os.system('pip install xlrd') else: os.chdir('/usr/local/src/pip-9.0.1') os.system('pip install xlrd') defaultencoding = 'utf-8' if sys.getdefaultencoding() != defaultencoding: reload(sys) sys.setdefaultencoding(defaultencoding) def get_host_ip(): """ 查询本机ip地址 :return: ip """ try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] finally: s.close() return ip a = get_host_ip() class zabbix_api: def init(self): self.url = 'http://' + a + '/zabbix/api_jsonrpc.php' # 修改URL self.header = {"Content-Type": "application/json"} def user_login(self): data = json.dumps({ "jsonrpc": "2.0", "method": "user.login", "params": { "user": "admin", # web页面登录用户名 "password": "zabbix" # web页面登录密码 }, "id": 0 }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except URLError as e: print "\033[041m 用户认证失败,请检查 !\033[0m", e.code else: response = json.loads(result.read()) result.close() # print response['result'] self.authID = response['result'] return self.authID def host_get(self, hostName=''): data = json.dumps({ "jsonrpc": "2.0", "method": "host.get", "params": { "output": "extend", "filter": {"host": hostName} }, "auth": self.user_login(), "id": 1 }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except URLError as e: if hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason elif hasattr(e, 'code'): print 'The server could not fulfill the request.' print 'Error code: ', e.code else: response = json.loads(result.read()) # print response result.close() print "主机数量: \033[31m%s\033[0m" % (len(response['result'])) for host in response['result']: status = {"0": "OK", "1": "Disabled"} available = {"0": "Unknown", "1": "available", "2": "Unavailable"} # print host if len(hostName) == 0: print "HostID : %s\t HostName : %s\t Status :\033[32m%s\033[0m \t Available :\033[31m%s\033[0m" % ( host['hostid'], host['name'], status[host['status']], available[host['available']]) else: print "HostID : %s\t HostName : %s\t Status :\033[32m%s\033[0m \t Available :\033[31m%s\033[0m" % ( host['hostid'], host['name'], status[host['status']], available[host['available']]) return host['hostid'] def hostgroup_get(self, hostgroupName=''): data = json.dumps({ "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend", "filter": { "name": hostgroupName } }, "auth": self.user_login(), "id": 1, }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except URLError as e: print "Error as ", e else: # print result.read() response = json.loads(result.read()) result.close() # print response() for group in response['result']: if len(hostgroupName) == 0: print "hostgroup: \033[31m%s\033[0m \tgroupid : %s" % (group['name'], group['groupid']) else: print "hostgroup: \033[31m%s\033[0m\tgroupid : %s" % (group['name'], group['groupid']) self.hostgroupID = group['groupid'] return group['groupid'] def template_get(self, templateName=''): data = json.dumps({ "jsonrpc": "2.0", "method": "template.get", "params": { "output": "extend", "filter": { "name": templateName } }, "auth": self.user_login(), "id": 1, }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except URLError as e: print "Error as ", e else: response = json.loads(result.read()) result.close() # print response for template in response['result']: if len(templateName) == 0: print "template : \033[31m%s\033[0m\t id : %s" % (template['name'], template['templateid']) else: self.templateID = response['result'][0]['templateid'] print "Template Name : \033[31m%s\033[0m " % templateName return response['result'][0]['templateid'] def hostgroup_create(self, hostgroupName): if self.hostgroup_get(hostgroupName): print "hostgroup \033[42m%s\033[0m is exist !" % hostgroupName sys.exit(1) data = json.dumps({ "jsonrpc": "2.0", "method": "hostgroup.create", "params": { "name": hostgroupName }, "auth": self.user_login(), "id": 1 }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except URLError as e: print "Error as ", e else: response = json.loads(result.read()) result.close() print "\033[042m 添加主机组:%s\033[0m hostgroupID : %s" % (hostgroupName, response['result']['groupids']) def host_create_andy(self, hostName, visibleName, hostip, hostgroupName, templateName): if self.host_get(hostip): print "\033[041m该主机已经添加!\033[0m" sys.exit(1) group_list = [] template_list = [] for i in hostgroupName.split(','): var = {} var['groupid'] = self.hostgroup_get(i) group_list.append(var) for i in templateName.split(','): var = {} var['templateid'] = self.template_get(i) template_list.append(var) data = json.dumps({ "jsonrpc": "2.0", "method": "host.create", "params": { "host": hostName, "name": visibleName, "interfaces": [ { "type": 1, # 1:表示IP;2表示SNMP "main": 1, "useip": 1, "ip": hostip, "dns": "", "port": "10050" # IP端口10050;SNMP端口161 } ], "groups": group_list, "templates": template_list, }, "auth": self.user_login(), "id": 1 }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except URLError as e: print "Error as ", e else: response = json.loads(result.read()) print "添加主机 : \033[42m%s\031[0m \tid :\033[31m%s\033[0m" % (hostip, response['result']['hostids']) result.close() def host_create(self, hostip, hostgroupName, templateName): if self.host_get(hostip): print "\033[041m该主机已经添加!\033[0m" sys.exit(1) group_list = [] template_list = [] for i in hostgroupName.split(','): var = {} var['groupid'] = self.hostgroup_get(i) group_list.append(var) for i in templateName.split(','): var = {} var['templateid'] = self.template_get(i) template_list.append(var) data = json.dumps({ "jsonrpc": "2.0", "method": "host.create", "params": { "host": hostip, "interfaces": [ { "type": 2, "main": 1, "useip": 1, "ip": hostip, "dns": "", "port": "161" } ], "groups": group_list, "templates": template_list, }, "auth": self.user_login(), "id": 1 }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except URLError as e: print "Error as ", e else: response = json.loads(result.read()) result.close() print "添加主机 : \033[42m%s\031[0m \tid :\033[31m%s\033[0m" % (hostip, response['result']['hostids']) def host_disable(self, hostip): data = json.dumps({ "jsonrpc": "2.0", "method": "host.update", "params": { "hostid": self.host_get(hostip), "status": 1 }, "auth": self.user_login(), "id": 1 }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except URLError as e: print "Error as ", e else: response = json.loads(result.read()) result.close() print '----主机现在状态------------' print self.host_get(hostip) def host_delete(self, hostid): hostid_list = [] # print type(hostid) for i in hostid.split(','): var = {} var['hostid'] = self.host_get(i) hostid_list.append(var) data = json.dumps({ "jsonrpc": "2.0", "method": "host.delete", "params": hostid_list, "auth": self.user_login(), "id": 1 }) request = urllib2.Request(self.url, data) for key in self.header: request.add_header(key, self.header[key]) try: result = urllib2.urlopen(request) except Exception, e: print e else: result.close() print "主机 \033[041m %s\033[0m 已经删除 !" % hostid if name == "main": zabbix = zabbix_api() parser = argparse.ArgumentParser(description='zabbix api ', usage='%(prog)s [options]') parser.add_argument('-H', '--host', nargs='?', dest='listhost', default='host', help='查询主机') parser.add_argument('-G', '--group', nargs='?', dest='listgroup', default='group', help='查询主机组') parser.add_argument('-T', '--template', nargs='?', dest='listtemp', default='template', help='查询模板信息') parser.add_argument('-A', '--add-group', nargs=1, dest='addgroup', help='添加主机组') parser.add_argument('-C', '--add-host', dest='addhost', nargs=3, metavar=('192.168.2.1', 'test01,test02', 'Template01,Template02'), help='添加主机,多个主机组或模板使用分号') parser.add_argument('-d', '--disable', dest='disablehost', nargs=1, metavar=('192.168.2.1'), help='禁用主机') parser.add_argument('-L', '--allin', dest='allin', nargs='?', default='allin', help='从Excel批量导入主机') parser.add_argument('-D', '--delete', dest='deletehost', nargs='+', metavar=('192.168.2.1'), help='删除主机,多个主机之间用分号') parser.add_argument('-v', '--version', action='version', version='%(prog)s 1.0') if len(sys.argv) == 1: print parser.print_help() else: args = parser.parse_args() if args.listhost != 'host': if args.listhost: zabbix.host_get(args.listhost) else: zabbix.host_get() if args.listgroup != 'group': if args.listgroup: zabbix.hostgroup_get(args.listgroup) else: zabbix.hostgroup_get() if args.listtemp != 'template': if args.listtemp: zabbix.template_get(args.listtemp) else: zabbix.template_get() if args.addgroup: zabbix.hostgroup_create(args.addgroup[0]) if args.addhost: zabbix.host_create(args.addhost[0], args.addhost[1], args.addhost[2]) if args.disablehost: zabbix.host_disable(args.disablehost) if args.deletehost: zabbix.host_delete(args.deletehost[0]) if args.allin != 'allin': workbook = xlrd.open_workbook('zabbix_host_add.xlsx') # Excel名,表格列 主机名、显示名、IP、主机组、模板 for row in xrange(workbook.sheets()[0].nrows): hostname = workbook.sheets()[0].cell(row, 0).value visible = workbook.sheets()[0].cell(row, 1).value hostip = workbook.sheets()[0].cell(row, 2).value hostgroup = workbook.sheets()[0].cell(row, 3).value hosttemp = workbook.sheets()[0].cell(row, 4).value zabbix.host_create_andy(hostname, visible, hostip, hostgroup, hosttemp)
/etc/zabbix/zabbix_agentd.conf UnsafeUserParameters=1 UserParameter=ipvsadm.activeconn[],/etc/zabbix/ipvsadm.py active 2 1 3 UserParameter=ipvsadm.weight[],/etc/zabbix/ipvsadm.py weight 2 $3 UserParameter=ipvsadm.discovery,/etc/zabbix/ipvsadm_discover.sh vi /etc/zabbix/ipvsadm_discover.sh !/bin/bash SVC_FLG=1 END_FLG=0 IFS=$'\n' echo '{"data":[' for LINE in sudo /usr/sbin/ipvsadm -Ln do echo ${LINE} TYPE=`echo ${LINE} | awk '{print $1}'` IP_INFO=`echo ${LINE} | awk '{print $2}'` if [ ${END_FLG} != 0 ] ; then echo ", " END_FLG=0 fi if [ "${TYPE}" = "TCP" -o "${TYPE}" = "UDP" ] ; then CUR_TYPE=${TYPE} CUR_IP_INFO=${IP_INFO} SVC_FLG=0 elif [ "${TYPE}" = "->" -a ${SVC_FLG} = 0 ] ; then echo -n "{\"{#VTYPE}\":\"${CUR_TYPE}\",\"{#VIPINFO}\":\"${CUR_IP_INFO}\",\"{#RIPINFO}\":\"${IP_INFO}\"}" END_FLG=1 fi done echo "]}" vi /etc/zabbix/ipvaadm.py !/bin/env python -- coding: utf-8 -- usage: ipvsadm.py acctiveconn tcp 172.18.0.12:80 172.17.0.22:80 import sys def parserArgs(args): p = dict() if args[1] not in ('active', 'inactive', 'weight') : print 'type error' sys.exit(1) p['type'] = args[1] p['proto'] = args[2].upper() vip = args[3].split(':') p['vipHex'] = ipToHexStr(vip[0]) p['vipPort'] = '%04X' % int(vip[1]) rip = args[4].split(':') p['ripHex'] = ipToHexStr(rip[0]) p['ripPort'] = '%04X' % int(rip[1]) #print p return p def ipToHexStr(ip): buf=list() for i in ip.split('.'): buf.append('%02X' % int(i)) return "".join(buf) def findData(args): vip = "%s %s:%s" % (args['proto'], args['vipHex'], args['vipPort']) rip = " -> %s:%s" % (args['ripHex'], args['ripPort']) vipStr = None result = None for line in file("/proc/net/ip_vs"): if line.startswith(vip): vipStr = True continue if vipStr is True and line.startswith(rip): break # -> AC110016:0050 Masq 1 10 157 import re values = re.split('\s+', line) #print values # ['', '->', 'AC110016:0050', 'Masq', '1', '0', '0', ''] result = dict() result['weight'] = values[4] result['active'] = values[5] result['inactive'] = values[6] return result[args['type']] if name == "main": args = parserArgs(sys.argv) print findData(args) 导入模板 zb_template.xml <?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.2</version> <date>2018-12-21T02:33:10Z</date> <groups> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>Template App LVS</template> <name>Template App LVS</name> <description/> <groups> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>LVS</name> </application> </applications> <items/> <discovery_rules> <discovery_rule> <name>ipvsadm Service</name> <type>0</type> <snmp_community/> <snmp_oid/> <key>ipvsadm.discovery</key> <delay>30</delay> <status>0</status> <allowed_hosts/> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <delay_flex/> <params/> <ipmi_sensor/> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <filter> <evaltype>0</evaltype> <formula/> <conditions/> </filter> <lifetime>30</lifetime> <description/> <item_prototypes> <item_prototype> <name>Active Connections on {#RIPINFO} for {#VIPINFO} {#VTYPE}</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>ipvsadm.activeconn[{#VTYPE},{#VIPINFO},{#RIPINFO}]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>LVS</name> </application> </applications> <valuemap/> <logtimefmt/> <application_prototypes/> </item_prototype> <item_prototype> <name>InActive Connections on {#RIPINFO} for {#VIPINFO} {#VTYPE}</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>ipvsadm.inactconn[{#VTYPE},{#VIPINFO},{#RIPINFO}]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>LVS</name> </application> </applications> <valuemap/> <logtimefmt/> <application_prototypes/> </item_prototype> <item_prototype> <name>Balance Weight on {#RIPINFO} for {#VIPINFO} {#VTYPE}</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>ipvsadm.weight[{#VTYPE},{#VIPINFO},{#RIPINFO}]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>LVS</name> </application> </applications> <valuemap/> <logtimefmt/> <application_prototypes/> </item_prototype> </item_prototypes> <trigger_prototypes> <trigger_prototype> <expression>{Template App LVS:ipvsadm.weight[{#VTYPE},{#VIPINFO},{#RIPINFO}].last()}<1</expression> <recovery_mode>0</recovery_mode> <recovery_expression/> <name>No Weight to {#RIPINFO}</name> <correlation_mode>0</correlation_mode> <correlation_tag/> <url/> <status>0</status> <priority>2</priority> <description/> <type>0</type> <manual_close>0</manual_close> <dependencies/> <tags/> </trigger_prototype> </trigger_prototypes> <graph_prototypes> <graph_prototype> <name>Balance Weight {#RIPINFO} for {#VIPINFO} {#VTYPE}</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App LVS</host> <key>ipvsadm.weight[{#VTYPE},{#VIPINFO},{#RIPINFO}]</key> </item> </graph_item> </graph_items> </graph_prototype> <graph_prototype> <name>Connections Statictics on {#RIPINFO} for {#VIPINFO} {#VTYPE}</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App LVS</host> <key>ipvsadm.activeconn[{#VTYPE},{#VIPINFO},{#RIPINFO}]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>2774A4</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App LVS</host> <key>ipvsadm.inactconn[{#VTYPE},{#VIPINFO},{#RIPINFO}]</key> </item> </graph_item> </graph_items> </graph_prototype> </graph_prototypes> <host_prototypes/> </discovery_rule> </discovery_rules> <httptests/> <macros/> <templates/> <screens/> </template> </templates> </zabbix_export>
修改zabbix_agentd.conf UnsafeUserParameters=1 UserParameter=mysql.version,mysql -V UserParameter=mysql.status[*],/usr/local/zabbix/share/zabbix/alertscripts/chk_mysql.sh $1 UserParameter=mysql.ping,mysqladmin ping | grep -c alive 设置mysql的链接 ln -s /data/mysql/bin/mysql /usr/bin ln -s /data/mysql/bin/mysqladmin /usr/bin 在数据库中添加新账号mysqlcheck GRANT USAGE ON . TO 'mysqlcheck'@'localhost' IDENTIFIED BY 'mysqlcheck'; FLUSH PRIVILEGES; 将mysql账号密码添加进my.cnf [mysql] host = localhost user = mysqlcheck password = mysqlcheck socket = /var/run/mysqld/mysqld.sock [mysqladmin] host = localhost user = mysqlcheck password = mysqlchechk socket = /var/run/mysqld/mysqld.sock 检测文件, vi /usr/local/zabbix/share/zabbix/alertscripts/chk_mysql.sh !/bin/bash MYSQL_CONN="mysqladmin" if [ $# -ne "1" ];then echo "arg error!" fi case {MYSQL_CONN} status|cut -f2 -d":"|cut -f1 -d"T"echo $result ;; Com_update) result=result ;; Slow_queries) result=${MYSQL_CONN} status |cut -f5 -d":"|cut -f1 -d"O" echo {MYSQL_CONN} extended-status |grep -w "Com_select"|cut -d"|" -f3echo $result ;; Com_rollback) result=result ;; Questions) result=${MYSQL_CONN} status|cut -f4 -d":"|cut -f1 -d"S" echo {MYSQL_CONN} extended-status |grep -w "Com_insert"|cut -d"|" -f3echo $result ;; Com_delete) result=result ;; Com_commit) result=${MYSQL_CONN} extended-status |grep -w "Com_commit"|cut -d"|" -f3 echo {MYSQL_CONN} extended-status |grep -w "Bytes_sent" |cut -d"|" -f3echo $result ;; Bytes_received) result=result ;; Com_begin) result=${MYSQL_CONN} extended-status |grep -w "Com_begin"|cut -d"|" -f3 echo $result ;; *) echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)" ;; esac chmod +x /usr/local/zabbix/share/zabbix/alertscripts/chk_mysql.sh 重启zabbix_agentd 在zabbix页面添加模板链接 以下几个参数对Myisam 和Innodb 存储引擎都计数: 1. Com_select 执行select 操作的次数,一次查询只累加1; 2. Com_insert 执行insert 操作的次数,对于批量插入的insert 操作,只累加一次; 3. Com_update 执行update 操作的次数; 4. Com_delete 执行delete 操作的次数; 以下几个参数是针对Innodb 存储引擎计数的: 1. Innodb_rows_read select 查询返回的行数; 2. Innodb_rows_inserted 执行Insert 操作插入的行数; 3. Innodb_rows_updated 执行update 操作更新的行数; 4. Innodb_rows_deleted 执行delete 操作删除的行数; 通过以上几个参数,可以很容易的了解当前数据库的应用是以插入更新为主还是以查询操作为主,以及各种类型的SQL 大致的执行比例是多少。对于更新操作的计数,是对执行次数的计数,不论提交还是回滚都会累加。对于事务型的应用,通过Com_commit 和Com_rollback 可以了解事务提交和回滚的情况,对于回滚操作非常频繁的数据库,可能应用编写存在问题。 另外还有几个参数可以了解数据库的基本信息: Connections 试图连接Mysql 服务器的次数 Uptime 服务器工作时间 Slow_queries 慢查询的次数 参数介绍 image.png
yum install -y expect mkpasswd -l 8 -c 4 -C 0 -s 0
anonymous_enable=NO local_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES listen_ipv6=NO write_enable=YES chroot_local_user=YES local_root=/data/ftp allow_writeable_chroot=YES pam_service_name=vsftpd userlist_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd/ftpusers tcp_wrappers=YES chroot_list_enable=YES (default follows) chroot_list_file=/etc/vsftpd/user_list pasv_enable=YES pasv_min_port=10000 pasv_max_port=10030 ftp_username=nobody
https://monitoringartist.github.io/zabbix-searcher/
zabbix 监控zookeeper篇 安装依赖包 <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">yum install -y nc yum install -y zabbix-sender</pre> nc 命令 [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">echo ruok|nc 127.0.0.1 2181 imok echo mntr|nc 127.0.0.1 2181 zk_version 3.4.6-1569965, built on 02/20/2014 09:09 GMT zk_avg_latency 0 zk_max_latency 6 zk_min_latency 0 zk_packets_received 93114 zk_packets_sent 93113 zk_num_alive_connections 4 zk_outstanding_requests 0 zk_server_state leader zk_znode_count 29 zk_watch_count 0 zk_ephemerals_count 14 zk_approximate_data_size 1087 zk_open_file_descriptor_count 39 zk_max_file_descriptor_count 1000000 zk_followers 4 zk_synced_followers 4 zk_pending_syncs 0 echo srvr|nc 127.0.0.1 2181 Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT Latency min/avg/max: 0/0/6 Received: 93121 Sent: 93120 Connections: 4 Outstanding: 0 Zxid: 0x900000020 Mode: leader Node count: 29</pre> [ 复制代码 ](javascript:void(0); "复制代码") ZooKeeper监控项 [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">zk_avg/min/max_latency 响应一个客户端请求的时间,建议这个时间大于10个Tick就报警 zk_outstanding_requests 排队请求的数量,当ZooKeeper超过了它的处理能力时,这个值会增大,建议设置报警阀值为10 zk_packets_received 接收到客户端请求的包数量 zk_packets_sent 发送给客户单的包数量,主要是响应和通知 zk_max_file_descriptor_count 最大允许打开的文件数,由ulimit控制 zk_open_file_descriptor_count 打开文件数量,当这个值大于允许值得85%时报警 Mode 运行的角色,如果没有加入集群就是standalone,加入集群式follower或者leader zk_followers leader角色才会有这个输出,集合中follower的个数。正常的值应该是集合成员的数量减1 zk_pending_syncs leader角色才会有这个输出,pending syncs的数量 zk_znode_count znodes的数量 zk_watch_count watches的数量 Java Heap Size ZooKeeper Java进程的</pre> [ 复制代码 ](javascript:void(0); "复制代码") 编写Zabbix监控ZooKeeper的脚本和配置文件 将这些监控数据一次性使用zabbix_sender全部发送给zabbix。采用zabbix_sender一z部监控数据的脚本,首先想办法将监控项目汇集成一个字典,然后遍历这个字典,将字典中的key:value对通过zabbix_sender的-k和-o参数指定发送出去 vim zookeeper.py [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">#!/usr/bin/python """{'zk_followers': 0, 'zk_outstanding_requests': 0, 'zk_approximate_data_size': 890971, 'zk_packets_sent': 5818488, 'zk_pending_syncs': 0, 'zk_avg_latency': 0, 'zk_version': '3.4.6-1569965, built on 02/20/2014 09:09 GMT', 'zk_watch_count': 1364, 'zk_packets_received': 5797681, 'zk_open_file_descriptor_count': 46, 'zk_server_ruok': 'imok', 'zk_server_state': 'follower', 'zk_synced_followers': 0, 'zk_max_latency': 400, 'zk_num_alive_connections': 18, 'zk_min_latency': 0, 'zk_ephemerals_count': 1112, 'zk_znode_count': 2207, 'zk_max_file_descriptor_count': 4096} 31022 """ import sys import socket import re import subprocess from StringIO import StringIO import os zabbix_sender = '/usr/bin/zabbix_sender' zabbix_conf = '/etc/zabbix/zabbix_agentd.conf' send_to_zabbix = 1 get zookeeper server status class ZooKeeperServer(object): def init(self, host='localhost', port='2181', timeout=1): self._address = (host, int(port)) self._timeout = timeout self._result = {} def _create_socket(self): return socket.socket() def _send_cmd(self, cmd): """ Send a 4letter word command to the server """ s = self._create_socket() s.settimeout(self._timeout) s.connect(self._address) s.send(cmd) data = s.recv(2048) s.close() return data def get_stats(self): """ Get ZooKeeper server stats as a map """ """zk_version 3.4.6-1569965, built on 02/20/2014 09:09 GMT zk_avg_latency 0 zk_max_latency 94 zk_min_latency 0 zk_packets_received 1267904 zk_packets_sent 1317835 zk_num_alive_connections 12 zk_outstanding_requests 0 zk_server_state follower zk_znode_count 1684 zk_watch_count 2757 zk_ephemerals_count 899 zk_approximate_data_size 728074 zk_open_file_descriptor_count 41 zk_max_file_descriptor_count 4096 """ data_mntr = self._send_cmd('mntr') data_ruok = self._send_cmd('ruok') if data_mntr: result_mntr = self._parse(data_mntr) if data_ruok: # {'zk_server_ruok': 'imok'} result_ruok = self._parse_ruok(data_ruok) self._result = dict(result_mntr.items() + result_ruok.items()) if not self._result.has_key('zk_followers') and not self._result.has_key('zk_synced_followers') and not self._result.has_key('zk_pending_syncs'): # #### the tree metrics only exposed on leader role zookeeper server, we just set the followers' to 0 leader_only = {'zk_followers':0,'zk_synced_followers':0,'zk_pending_syncs':0} self._result = dict(result_mntr.items() + result_ruok.items() + leader_only.items()) return self._result def _parse(self, data): """ :param data: zk_outstanding_requests 0 zk_approximate_data_size 653931 :return: {'zk_outstanding_requests': '0', 'zk_approximate_data_size': '653931',} """ """ Parse the output from the 'mntr' 4letter word command """ h = StringIO(data) result = {} for line in h.readlines(): try: key, value = self._parse_line(line) result[key] = value except ValueError: pass # ignore broken lines return result def _parse_ruok(self, data): """ :param data: imok :return: {'zk_server_ruok': 'imok'} """ """ Parse the output from the 'ruok' 4letter word command """ h = StringIO(data) result = {} ruok = h.readline() if ruok: result['zk_server_ruok'] = ruok return result def _parse_line(self, line): # zk_watch_count 1482 try: # zk_max_file_descriptor_count 65535 key, value = map(str.strip, line.split('\t')) except ValueError: raise ValueError('Found invalid line: %s' % line) if not key: raise ValueError('The key is mandatory and should not be empty') try: value = int(value) except (TypeError, ValueError): pass return key, value def get_pid(self): # ps -ef|grep java|grep zookeeper|awk '{print $2}' pidarg = '''ps -ef|grep java|grep zookeeper|grep -v grep|awk '{print $2}' ''' # 31022 pidout = subprocess.Popen(pidarg, shell=True, stdout=subprocess.PIPE) pid = pidout.stdout.readline().strip('\n') return pid def send_to_zabbix(self, metric): # key = zookeeper.status[zk_max_file_descriptor_count] key = "zookeeper.status[" + metric + "]" if send_to_zabbix > 0: # print key + ":" + str(self._result[metric]) try: subprocess.call([zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", str(self._result[metric])], stdout=FNULL, stderr=FNULL, shell=False) #print "send zabbix success" except OSError, detail: print "Something went wrong while exectuting zabbix_sender : ", detail else: print "Simulation: the following command would be execucted :\n", zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", self._result[metric], "\n" def usage(): """Display program usage""" print "\nUsage : ", sys.argv[0], " alive|all" print "Modes : \n\talive : Return pid of running zookeeper\n\tall : Send zookeeper stats as well" sys.exit(1) accepted_modes = ['alive', 'all'] if len(sys.argv) == 2 and sys.argv[1] in accepted_modes: mode = sys.argv[1] else: usage() zk = ZooKeeperServer() # print zk.get_stats() pid = zk.get_pid() if pid != "" and mode == 'all': zk.get_stats() print zk._result FNULL = open(os.devnull, 'w') for key in zk._result: zk.send_to_zabbix(key) FNULL.close() print pid elif pid != "" and mode == "alive": print pid else: print 0</pre> [ 复制代码 ](javascript:void(0); "复制代码") 增加脚本可执行权限 chmod +x /etc/zabbix/scripts/zookeeper.py zabbix配置文件 vim /etc/zabbix/zabbix_agentd.d/check_zookeeper.conf <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">UserParameter=zookeeper.status[*],/usr/bin/python /usr/local/zabbix-agent/scripts/check_zookeeper.py $1</pre> 重新启动zabbix-agent服务 service zabbix-agent restart 制作Zabbix监控ZooKeeper的模板并设置报警阀值 zookeeper.xml(一定是zabbix采集器的方式) [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"><?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.0</version> <date>2017-12-11T08:02:58Z</date> <groups> <group> <name>Zabbix servers</name> </group> </groups> <templates> <template> <template>Zookeeper</template> <name>Zookeeper</name> <description/> <groups> <group> <name>Zabbix servers</name> </group> </groups> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <items> <item> <name>zookeeper pid</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[alive]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper approximate data size</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_approximate_data_size]</key> <delay>0</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper average latency</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_avg_latency]</key> <delay>0</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper ephemerals count</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_ephemerals_count]</key> <delay>0</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper leader's followers</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_followers]</key> <delay>0</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper max file descriptor count</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_max_file_descriptor_count]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper max latency</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_max_latency]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper min latency</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_min_latency]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper alive connections</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_num_alive_connections]</key> <delay>0</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper opened file descriptor count</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_open_file_descriptor_count]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper outstanding requests</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_outstanding_requests]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper packages received</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_packets_received]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>收包数量</description> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper packages sent</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_packets_sent]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>发包数据量</description> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper leader's pending syncs</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_pending_syncs]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper response checking</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_server_ruok]</key> <delay>10</delay> <history>90</history> <trends>0</trends> <status>0</status> <value_type>1</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper state role</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_server_state]</key> <delay>10</delay> <history>90</history> <trends>0</trends> <status>0</status> <value_type>1</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper leader's synced followers</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_synced_followers]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper version</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_version]</key> <delay>10</delay> <history>90</history> <trends>0</trends> <status>0</status> <value_type>1</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper watches count</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_watch_count]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>zookeeper znodes count</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>zookeeper.status[zk_znode_count]</key> <delay>10</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>ZooKeeper Status</name> </application> </applications> <valuemap/> <logtimefmt/> </item> </items> <discovery_rules/> <macros/> <templates/> <screens/> </template> </templates> <triggers> <trigger> <expression>{Zookeeper:zookeeper.status[zk_outstanding_requests].last()}>10</expression> <name>big outstanding requests number</name> <url/> <status>0</status> <priority>0</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Zookeeper:zookeeper.status[zk_pending_syncs].last()}>10</expression> <name>big pending syncs</name> <url/> <status>0</status> <priority>0</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Zookeeper:zookeeper.status[zk_avg_latency].last()}>10</expression> <name>large average latency</name> <url/> <status>0</status> <priority>0</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Zookeeper:zookeeper.status[zk_open_file_descriptor_count].last()} > {Zookeeper:zookeeper.status[zk_max_file_descriptor_count].last()}*0.85</expression> <name>large file descriptor used</name> <url/> <status>0</status> <priority>0</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Zookeeper:zookeeper.status[zk_server_ruok].str(imok)}<>1</expression> <name>zookeeper is abnormal</name> <url/> <status>0</status> <priority>4</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Zookeeper:zookeeper.status[alive].last()}=0</expression> <name>zookeeper is not running</name> <url/> <status>0</status> <priority>4</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Zookeeper:zookeeper.status[zk_server_state].abschange()}>0</expression> <name>zookeeper state role has been changed</name> <url/> <status>0</status> <priority>1</priority> <description/> <type>0</type> <dependencies/> </trigger> </triggers> <graphs> <graph> <name>ZooKeeper Alive Connections</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Zookeeper</host> <key>zookeeper.status[zk_num_alive_connections]</key> </item> </graph_item> </graph_items> </graph> <graph> <name>ZooKeeper Latency</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Zookeeper</host> <key>zookeeper.status[zk_avg_latency]</key> </item> </graph_item> </graph_items> </graph> </graphs> </zabbix_export></pre> [ 复制代码 ](javascript:void(0); "复制代码") 导入zabbix image image
zabbix提供了一个java gateway的应用去监控jmx(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。 下面为部署步凑: 1、zabbix server安装java gateway [root@localhost ~]# yum install -y java java-devel zabbix-java-gateway [root@localhost ~]# java -version openjdk version ``"1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode) [root@localhost ~]# service zabbix-java-gateway status Redirecting to /bin/systemctl status zabbix-java-gateway.service ● zabbix-java-gateway.service - Zabbix Java Gateway Loaded: loaded (/usr/lib/systemd/system/zabbix-java-gateway.service; disabled; vendor preset: disabled) Active: inactive (dead) | 2、添加java环境 | 1 2 3 4 5 6 7 8 9 10 11 | [root@localhost ~]# vim /etc/profile JAVA_HOME=/usr/java/jdk1.8.0_161 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH #加载环境 [root@localhost ~]# source /etc/profile | 3、修改java-gateway配置文件 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@localhost ~]# grep ^[a-Z] /etc/zabbix/zabbix_java_gateway.conf #监控地址 LISTEN_IP=``"0.0.0.0" #监听端口 LISTEN_PORT=10052 #进程文件路径 PID_FILE=``"/var/run/zabbix/zabbix_java.pid" #开启的工作线程数 START_POLLERS=5 #超时 TIMEOUT=3 | 4、重启java-gateway服务 | 1 | [root@localhost ~]# systemctl restart zabbix-java-gateway | 5、修改zabbix_server配置文件 | 1 2 3 4 5 6 7 8 | [root@localhost ~]# vim /etc/zabbix/zabbix_java_gateway # JavaGateway的服务器IP地址 JavaGateway=192.168.247.133<br> # JavaGateway的服务端口 JavaGatewayPort=10052<br> # 从javaGateway采集数据的进程数 StartJavaPollers=5 | 6、重启zabbix_server服务 | 1 | [root@localhost ~]# systemctl restart zabbix-server | 7、客户端配置 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 在tomcat下的/bin/catalina.sh文件中添加以下内容: CATALINA_OPTS="$CATALINA_OPTS -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=``true -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=``false -Dcom.sun.management.jmxremote.ssl=``false -Djava.rmi.server.hostname=192.168.247.132" ``//tomcat客户端ip 重启tomcat进程: [root@localhost bin]# ./shutdown.sh [root@localhost bin]# ./startup.sh | 下面添加到zabbix监控中 选择配置:主机-模板-选择-模板-: Template APP Apache Tomcat JMX Template APP Generic Java JMX image 主机--JMX接口 image 查看图形 image
这是一个HAProxy的zabbix监控模板,HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy本身提供一个web页面可以显示haproxy的各种信息,方便管理员查看系统状态等。此次我采用socat(socat是netcat的扩展实现)这款开源软件通过haproxy的socks配合zabbix实现haproxy系统的状态监控。 一、安装socat [root@haproxy01 ~]# wget http://www.dest-unreach.org/socat/download/socat-1.7.3.0.tar.bz2 [root@haproxy01 ~]# tar xzf socat-1.7.3.0.tar.gz [root@haproxy01 ~]# cd socat-1.7.3.0 [root@haproxy01 ~]# ./configure [root@haproxy01 ~]# make [root@haproxy01 ~]# make install [root@haproxy01 ~]# which socat ###安装完自动会在/usr/local/bin 创建执行程序。 /usr/local/bin/socat 二、开启haproxy sock 编辑haproxy配置文件在global下添加如下: global stats socket /usr/local/haproxy/haproxy.sock 重启haproxy Haproxy 信息 [root@haproxy01 ~]# echo "show info" |socat /usr/local/haproxy/haproxy.sock stdio Name: HAProxy Version: 1.4.24 Release_date: 2013/06/17 Nbproc: 1 Process_num: 1 Pid: 3499 Uptime: 2d 1h00m47s Uptime_sec: 176447 Memmax_MB: 0 Ulimit-n: 131102 Maxsock: 131102 Maxconn: 65535 Maxpipes: 0 CurrConns: 18 PipesUsed: 0 PipesFree: 0 Tasks: 34 Run_queue: 1 node: HAProxy01 description: haproxy server 01 Haproxy 状态 [root@CMHAProxy01 ~]# echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,admin_stats,FRONTEND,,,0,1,2000,2918,1779980,133971311,0,0,0,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,1,,,,0,2918,0,0,0,0,,0,1,2918,,, admin_stats,BACKEND,0,0,0,0,2000,0,1779980,133971311,0,0,,0,0,0,0,UP,0,0,0,,0,176433,0,,1,1,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0, test,FRONTEND,,,0,2,2000,5402,1267880,26563174,0,0,0,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,3,,,,0,5402,0,0,0,0,,0,3,5402,,, test,test1,0,0,0,1,,2701,632860,13110551,,0,,0,0,0,0,UP,3,1,0,1,0,176433,0,,1,2,1,,2701,,2,0,,2,L7OK,200,3,0,2701,0,0,0,0,0,,,,0,1, test,test2,0,0,0,1,,2701,635020,13452623,,0,,0,0,0,0,UP,3,1,0,0,0,176433,0,,1,2,2,,2700,,2,0,,2,L7OK,200,3,0,2701,0,0,0,0,0,,,,0,0, test,BACKEND,0,0,0,2,2000,5402,1267880,26563174,0,0,,0,0,0,0,UP,6,2,0,,0,176433,0,,1,2,0,,5401,,1,0,,3,,,,0,5402,0,0,0,0,,,,,0,1, 看到这里大家都明白了,我们可以通过“show stat”返回的信息,过滤出我们想要得到的监控字段数据。这里我们主要取qcur(queue数量)、scur(session数量)、bin(入站流量)、bout(出站流量)、status(后端服务器状态)、downtime(宕机总时长)、check_status(健康检测状态),自定义key收集这些数据制作相应的item,如果你想监控更多信息可以取更多的字段数据。 大家看到这些字段数据使用”,”分隔,非常方便我们用awk来过滤数据,具体自定义key见代码。首先,我们需要建立一个HAProxy模版,然后建立发现规则,来发现这些后端服务器,这样每次haproxy添加服务的时候,zabbix就会自动发现这些后端服务器、自动建立item、自动建立Graph、自动建立Trigger,一切全部自动完成。 三、Step by Step 1、建立一个haproxy模版 2、建立发现规则 key shell如下:(这里有一点需要注意,就是haproxy.sock这个文件的权限问题,默认是644,单纯执行这个shell没问题,但如果需要zabbix用户去获取返回值的时候就会提示权限不足,所以我直接将haproxy.sock设置成了666,也可以设置visudo,我为了方便直接修改了这个文件权限) [root@haproxy01 ~]# cat /usr/bin/has.discovery.sh !/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin printf '{\n' printf '\t"data":[\n' export LINE=2}'|grep -v "^FRONTEND"|grep -v "^BACKEND"|grep -v "^$"|wc -l) ##(这里我过滤调admin_stats web管理台、FRONTEND前端、BACKEND后端 得到的是所有后端服务器的列表) export N=0 printf '\t\t{\n' for i in 2}'|grep -v "^FRONTEND"|grep -v "^BACKEND"); do printf "\t\t\t{"{#SNAME}":"((N -eq $LINE ]; ## 最后一行是不能加","的,所以需要if判断一下是否到了最后一行。 then printf '\n' else printf ',\n' fi done; printf ']}\n' 执行结果如下:(zabbix的发现规则就是要返回json格式的数据) [root@haproxy01 haproxy]# sh /usr/bin/has.discovery.sh { "data":[ {"{#SNAME}":"test1"}, {"{#SNAME}":"test2"}, {"{#SNAME}":"testapi1"}, {"{#SNAME}":"test51"}, {"{#SNAME}":"test52"}, {"{#SNAME}":"testclient1"}, {"{#SNAME}":"testclient2"}, {"{#SNAME}":"testmobile1"}, {"{#SNAME}":"testmobile2"} ]} 3、建立自定义key Queue数量[qcur] key shell如下: [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.queue.sh !/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "<3}' ## 重点就是通过awk取哪个字段的数据 Session数量[scur] [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.session.sh !/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "<5}' 虚拟服务器入站流量[bin] [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.bin.sh !/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "<9}' 虚拟服务器出站流量[bout] [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.bout.sh !/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "<10}' 后端服务器状态[status] [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.status.sh !/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "<18}' 宕机总时长[downtime] [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.downtime.sh !/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "<25}' 健康检测状态[check_status] [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.lastchk.sh !/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "<38}' 定义key [root@haproxy01 haproxy]# cat /etc/zabbix/zabbix_agentd.d/HaProxy_status.conf UserParameter=has.discovery,/usr/bin/has.discovery.sh UserParameter=ckey.ha.bin[],/usr/bin/ckey.ha.bin.sh 1 UserParameter=ckey.ha.downtime[],/usr/bin/ckey.ha.downtime.sh 1 UserParameter=ckey.ha.queue[],/usr/bin/ckey.ha.queue.sh 1 UserParameter=ckey.ha.status[],/usr/bin/ckey.ha.status.sh $1 重启zabbix-agent 验证一下: [root@zabbixproxy01 ~]# zabbix_get -s 192.168.1.100 -k has.discovery { "data":[ {"{#SNAME}":"test1"}, {"{#SNAME}":"test2"}, {"{#SNAME}":"testapi1"}, {"{#SNAME}":"test51"}, {"{#SNAME}":"test52"}, {"{#SNAME}":"testclient1"}, {"{#SNAME}":"testclient2"}, {"{#SNAME}":"testmobile1"}, {"{#SNAME}":"testmobile2"} ]} [root@zabbixproxy01 ~]# zabbix_get -s 192.168.1.100 -k ckey.ha.status[test1] UP 其余的key验证效果大同小异,这里就不浪费篇幅一一列举了。 4、创建Graph prototypes 网络流量图 Session 健康检测状态 宕机总时间 生成的Graphs效果图 5、创建Trigger prototypes inbound网络流量最近5分钟内超过2Mbps outbound网络流量最近5分钟内超过2Mbps 后端服务器健康检测异常 后端服务器宕机 这里设置一下依赖,因为服务器是否宕机依赖于健康检测状态 自定义key shellhttp://opensgalaxy.oss-cn-beijing.aliyuncs.com/images/zabbix_haproxy/zabbix_haproxy.tar.gz 导出的haproxy模版http://opensgalaxy.oss-cn-beijing.aliyuncs.com/images/zabbix_haproxy/zbx_export_templates.xml 作者:ASIH 来源:CSDN 原文:https://blog.csdn.net/hanzheng260561728/article/details/52819253 版权声明:本文为博主原创文章,转载请附上博文链接!
Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabbix/ [图片上传中...(image-fbffb1-1545190409993-6)] 从部署架构图上可以看出,orabbix是通过JDBC去连接被监控数据库的,其实不是必须在数据库主机上安装Agent,而运行orabbix的主机,可以是Zabbix Server,也可以是数据库主机和zabbix server之外的任意一台主机,为了测试方便,我们将orabbix安装在Zabbix Server上。 下载软件及安装服务 Ø 下载 Orabbix ,上传到你的 Zabbix Server Ø unzip 软件到这个目录: /opt/orabbix Ø 安装服务: Ø 复制启动脚本 cp /opt/orabbix/init.d/orabbix /etc/init.d/orabbix Ø 运行权限: chmod +x /etc/init.d/orabbix chmod +x /opt/orabbix/run.sh Ø #chkconfig --add orabbix 建立监控用户及授权 CREATE USER ZABBIX IDENTIFIED BY welcome1 DEFAULT TABLESPACE SYSTEM TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK; REM 2 Roles for ZABBIX GRANT CONNECT TO ZABBIX; GRANT RESOURCE TO ZABBIX; ALTER USER ZABBIX DEFAULT ROLE ALL; REM 5 System Privileges for ZABBIX GRANT SELECT ANY TABLE TO ZABBIX; GRANT CREATE SESSION TO ZABBIX; GRANT SELECT ANY DICTIONARY TO ZABBIX; GRANT UNLIMITED TABLESPACE TO ZABBIX; GRANT SELECT ANY DICTIONARY TO ZABBIX; 如果是11g数据库,执行下列语句: exec dbms_network_acl_admin.create_acl(acl => 'resolve.xml',description => 'resolve acl', principal =>'ZABBIX', is_grant => true, privilege => 'resolve'); exec dbms_network_acl_admin.assign_acl(acl => 'resolve.xml', host =>'*'); commit; 修改orabbix配置文件 cd /opt/orabbix/conf cp config.props.sample config.props 根据实际的部署情况修改文件,比如: comma separed list of Zabbix servers ZabbixServerList=ZabbixServer1 ZabbixServer1.Address=192.168.0.41 ##Zabbix服务器地址 ZabbixServer1.Port=10051 ##Zabbix服务器端口 pidFile OrabbixDaemon.PidFile=./logs/orabbix.pid frequency of item's refresh OrabbixDaemon.Sleep=300 MaxThreadNumber should be >= than the number of your databases OrabbixDaemon.MaxThreadNumber=100 put here your databases in a comma separated list DatabaseList=DB1,DB2,DB3 ##数据库列表,名称随便起 Configuration of Connection pool if not specified Orabbis is going to use default values (hardcoded) Maximum number of active connection inside pool DatabaseList.MaxActive=10 The maximum number of milliseconds that the pool will wait (when there are no available connections) for a connection to be returned before throwing an exception, or <= 0 to wait indefinitely. DatabaseList.MaxWait=100 DatabaseList.MaxIdle=1 define here your connection string for each database DB1.Url=jdbc:oracle:thin:@192.168.0.31:1521:test1 ##数据库连接串 DB1.User=zabbix ##监控数据库用户名 DB1.Password=welcome1 ##监控数据库口令 保存配置文件,然后重启orabbix。 导入模板 在orabbix的软件包里面有4各模板文件,导入下面途中这个模板文件就可以了,包含了其他所有模板文件的内容。 [图片上传中...(image-44c3c2-1545190409993-5)] 适用Orabbix 在zabbix界面上配置数据库监控时,要注意,orabbix是把每个数据库都配置成一个“主机”的,这块看着有点别扭,而且,注意在配置主机时,名称一定要和config.props文件中配置的数据库名称一样,比如我这里就是DB1: clip_image003 前面说了,这个“主机”的地址可以随便写,因为被监控的主机端不需要一定有agent,但是为了方便管理,我觉得还是写上Oracle主机的地址比较好。 定义了主机后,就可以适用模板中预定义的监控项、触发器和图表了。 比如图表: [图片上传中...(image-1b104b-1545190409993-3)] clip_image005 比如最简单的检查数据库适用可用的触发器: clip_image006 当然,对应触发器的动作还是需要自己配置。 自定义SQL检查 Orabbix提供了表空间的监控,监控项对应的SQL: tbl_space.Query=SELECT * FROM ( \ select '- Tablespace ->',t.tablespace_name ktablespace, \ '- Type->',substr(t.contents, 1, 1) tipo, \ '- Used(MB)->',trunc((d.tbs_size-nvl(s.free_space, 0))/1024/1024) ktbs_em_uso, \ '- ActualSize(MB)->',trunc(d.tbs_size/1024/1024) ktbs_size, \ '- MaxSize(MB)->',trunc(d.tbs_maxsize/1024/1024) ktbs_maxsize, \ '- FreeSpace(MB)->',trunc(nvl(s.free_space, 0)/1024/1024) kfree_space, \ '- Space->',trunc((d.tbs_maxsize - d.tbs_size + nvl(s.free_space, 0))/1024/1024) kspace, \ '- Perc->',decode(d.tbs_maxsize, 0, 0, trunc((d.tbs_size-nvl(s.free_space, 0))*100/d.tbs_maxsize)) kperc \ from \ ( select SUM(bytes) tbs_size, \ SUM(decode(sign(maxbytes - bytes), -1, bytes, maxbytes)) tbs_maxsize, tablespace_name tablespace \ from ( select nvl(bytes, 0) bytes, nvl(maxbytes, 0) maxbytes, tablespace_name \ from dba_data_files \ union all \ select nvl(bytes, 0) bytes, nvl(maxbytes, 0) maxbytes, tablespace_name \ from dba_temp_files \ ) \ group by tablespace_name \ ) d, \ ( select SUM(bytes) free_space, \ tablespace_name tablespace \ from dba_free_space \ group by tablespace_name \ ) s, \ dba_tablespaces t \ where t.tablespace_name = d.tablespace(+) and \ t.tablespace_name = s.tablespace(+) \ order by 8) \ where kperc > 93 \ and tipo <>'T' \ and tipo <>'U' tbl_space.NoDataFound=none 这个SQL会返回93%满的表空间信息,而对应这个监控项,orabbix也定义了触发器,因为监控项的返回值是文本,而没有满足条件的记录时返回字符串“none“,所以监控项对应的触发器会检查返回值开头是不是none,如果不是,就报警,这样,用户除了收到预警信息,还能从返回值的具体值中看到具体时哪个表空间快满了。 当然,大部分时间监控项会返回none,所以我们无法画出正常未满的表空间的空间占用时间曲线。只有超过93%慢时,我们才知道具体的占用情况。 如果想收集并保留更多信息,就需要使用自定义查询,方法就是在query.props文件中加入你想检查的SQL,比如我们想了解表空间信息,就加以下SQL: customtbl.Query=select 'TBL:'||a.tablespace_name||',' TBL, \ 'Total Size:'||trunc(sum(a.tots) / 1024 / 1024, 2)||',' Tot_Size_mb, \ 'Free MB:'||round(sum(a.sumb) / 1024 / 1024, 2)||',' Tot_Free_mb, \ 'PCT Free:'||round(sum(a.sumb) * 100 / sum(a.tots), 2)||',' Pct_Free, \ 'Max Free MB:'||round(sum(a.largest) / 1024 / 1024, 2)||',' Max_Free_mb, \ 'Chunks Free:'||sum(a.chunks)||',' Chunks_Free \ from (select tablespace_name, \ 0 tots, \ sum(bytes) sumb, \ max(bytes) largest, \ count(*) chunks \ from dba_free_space a \ group by tablespace_name \ union \ select tablespace_name, sum(bytes) tots, 0, 0, 0 \ from dba_data_files \ group by tablespace_name) a \ group by a.tablespace_name customtbl.NoDataFound=none 然后在orabbix对应的模板中添加这个监控项customtbl就可以了,下面时从最新数据菜单查看的SQL的返回结果: [图片上传中...(image-de51d8-1545190409993-0)] 当然,我们要做进一步的分析和展示,就需要使用别的工具或者开发工具来做了,这个就不是这篇文章讨论的范围了。 Orabbix不足 初步测试,感觉orabbix有2点明显缺陷: 1. 被监控数据库信息要逐个写进配置文件,如果数据库个数比较多,管理会比较麻烦 2. 被监控数据库的账号信息是写在配置文件中,而且口令是明文存储,有很大的安全隐患 3. 对RAC的支持还是很初级 zabbix
本案例以Zabbix-2.2.2为监控平台进行创建,该方法对于zabbix 2.X以及3.X的方法也是一样可以使用,只不过zabbix 2.x平台导入模板的时候,需要编辑模板xml文件将version 3.0改成2.0才可以导入,否则出错。如zabbix V3.X,则可以直接导入并按照如下方法配置使用。这里只是一个通用操作,如需更加完善功能可以自己添加监控项以及触发器等。1,导入模板 下载链接: http://download.21yunwei.com/zabbix/redis/zbx_template_redis.tar.gz 导入模板成功以后,将需要监控redis的主机添加这个模板。 注意:需 确认监控平台版本,低于3.0的需要编辑xml改成2.0后再去导入。 2,创建采集脚本 我的监控采集脚本都放到了/home/yunwei/redis_zbx.sh,在这里创建脚本保存shell脚本: vim redis_zbx.sh <pre class="wp-code-highlight prettyprint linenums:1 prettyprinted" style="padding: 2px 7px; font: 400 12px/16px "courier new"; color: rgb(248, 248, 212); border-radius: 0px; display: block; margin: 6px 0px; word-break: break-all; overflow-wrap: normal; white-space: pre-wrap; background: rgb(0, 0, 0); border: 1px solid rgb(39, 40, 34); overflow: auto; width: 891.797px; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> !/bin/bash REDISPATH="/usr/bin/redis-cli" HOST="127.0.0.1" PORT="6379" REDIS_INFO="HOST -p $PORT info" if [[ $# == 1 ]];then case $1 in cluster) result=$REDIS_INFO|/bin/grep cluster|awk -F":" '{print $NF}' echo $result ;; uptime_in_seconds) result=$REDIS_INFO|/bin/grep uptime_in_seconds|awk -F":" '{print $NF}' echo $result ;; connected_clients) result=$REDIS_INFO|/bin/grep connected_clients|awk -F":" '{print $NF}' echo $result ;; client_longest_output_list) result=$REDIS_INFO|/bin/grep client_longest_output_list|awk -F":" '{print $NF}' echo $result ;; client_biggest_input_buf) result=$REDIS_INFO|/bin/grep client_biggest_input_buf|awk -F":" '{print $NF}' echo $result ;; blocked_clients) result=$REDIS_INFO|/bin/grep blocked_clients|awk -F":" '{print $NF}' echo $result ;; 内存 used_memory) result=$REDIS_INFO|/bin/grep used_memory|awk -F":" '{print $NF}'|awk 'NR==1' echo $result ;; used_memory_human) result=$REDIS_INFO|/bin/grep used_memory_human|awk -F":" '{print $NF}'|awk -F'K' '{print $1}' echo $result ;; used_memory_rss) result=$REDIS_INFO|/bin/grep used_memory_rss|awk -F":" '{print $NF}' echo $result ;; used_memory_peak) result=$REDIS_INFO|/bin/grep used_memory_peak|awk -F":" '{print $NF}'|awk 'NR==1' echo $result ;; used_memory_peak_human) result=$REDIS_INFO|/bin/grep used_memory_peak_human|awk -F":" '{print $NF}'|awk -F'K' '{print $1}' echo $result ;; used_memory_lua) result=$REDIS_INFO|/bin/grep used_memory_lua|awk -F":" '{print $NF}' echo $result ;; mem_fragmentation_ratio) result=$REDIS_INFO|/bin/grep mem_fragmentation_ratio|awk -F":" '{print $NF}' echo $result ;; rdb rdb_changes_since_last_save) result=$REDIS_INFO|/bin/grep rdb_changes_since_last_save|awk -F":" '{print $NF}' echo $result ;; rdb_bgsave_in_progress) result=$REDIS_INFO|/bin/grep rdb_bgsave_in_progress|awk -F":" '{print $NF}' echo $result ;; rdb_last_save_time) result=$REDIS_INFO|/bin/grep rdb_last_save_time|awk -F":" '{print $NF}' echo $result ;; rdb_last_bgsave_status) result=$REDIS_INFO|/bin/grep -w "rdb_last_bgsave_status" | awk -F':' '{print $2}' | /bin/grep -c ok echo $result ;; rdb_current_bgsave_time_sec) result=$REDIS_INFO|/bin/grep -w "rdb_current_bgsave_time_sec" | awk -F':' '{print $2}' echo $result ;; rdbinfo aof_enabled) result=$REDIS_INFO|/bin/grep -w "aof_enabled" | awk -F':' '{print $2}' echo $result ;; aof_rewrite_scheduled) result=$REDIS_INFO|/bin/grep -w "aof_rewrite_scheduled" | awk -F':' '{print $2}' echo $result ;; aof_last_rewrite_time_sec) result=$REDIS_INFO|/bin/grep -w "aof_last_rewrite_time_sec" | awk -F':' '{print $2}' echo $result ;; aof_current_rewrite_time_sec) result=$REDIS_INFO|/bin/grep -w "aof_current_rewrite_time_sec" | awk -F':' '{print $2}' echo $result ;; aof_last_bgrewrite_status) result=$REDIS_INFO|/bin/grep -w "aof_last_bgrewrite_status" | awk -F':' '{print $2}' | /bin/grep -c ok echo $result ;; aofinfo aof_current_size) result=$REDIS_INFO|/bin/grep -w "aof_current_size" | awk -F':' '{print $2}' echo $result ;; aof_base_size) result=$REDIS_INFO|/bin/grep -w "aof_base_size" | awk -F':' '{print $2}' echo $result ;; aof_pending_rewrite) result=$REDIS_INFO|/bin/grep -w "aof_pending_rewrite" | awk -F':' '{print $2}' echo $result ;; aof_buffer_length) result=$REDIS_INFO|/bin/grep -w "aof_buffer_length" | awk -F':' '{print $2}' echo $result ;; aof_rewrite_buffer_length) result=$REDIS_INFO|/bin/grep -w "aof_rewrite_buffer_length" | awk -F':' '{print $2}' echo $result ;; aof_pending_bio_fsync) result=$REDIS_INFO|/bin/grep -w "aof_pending_bio_fsync" | awk -F':' '{print $2}' echo $result ;; aof_delayed_fsync) result=$REDIS_INFO|/bin/grep -w "aof_delayed_fsync" | awk -F':' '{print $2}' echo $result ;; stats total_connections_received) result=$REDIS_INFO|/bin/grep -w "total_connections_received" | awk -F':' '{print $2}' echo $result ;; total_commands_processed) result=$REDIS_INFO|/bin/grep -w "total_commands_processed" | awk -F':' '{print $2}' echo $result ;; instantaneous_ops_per_sec) result=$REDIS_INFO|/bin/grep -w "instantaneous_ops_per_sec" | awk -F':' '{print $2}' echo $result ;; rejected_connections) result=$REDIS_INFO|/bin/grep -w "rejected_connections" | awk -F':' '{print $2}' echo $result ;; expired_keys) result=$REDIS_INFO|/bin/grep -w "expired_keys" | awk -F':' '{print $2}' echo $result ;; evicted_keys) result=$REDIS_INFO|/bin/grep -w "evicted_keys" | awk -F':' '{print $2}' echo $result ;; keyspace_hits) result=$REDIS_INFO|/bin/grep -w "keyspace_hits" | awk -F':' '{print $2}' echo $result ;; keyspace_misses) result=$REDIS_INFO|/bin/grep -w "keyspace_misses" | awk -F':' '{print $2}' echo $result ;; pubsub_channels) result=$REDIS_INFO|/bin/grep -w "pubsub_channels" | awk -F':' '{print $2}' echo $result ;; pubsub_channels) result=$REDIS_INFO|/bin/grep -w "pubsub_channels" | awk -F':' '{print $2}' echo $result ;; pubsub_patterns) result=$REDIS_INFO|/bin/grep -w "pubsub_patterns" | awk -F':' '{print $2}' echo $result ;; latest_fork_usec) result=$REDIS_INFO|/bin/grep -w "latest_fork_usec" | awk -F':' '{print $2}' echo $result ;; connected_slaves) result=$REDIS_INFO|/bin/grep -w "connected_slaves" | awk -F':' '{print $2}' echo $result ;; master_link_status) result=$REDIS_INFO|/bin/grep -w "master_link_status"|awk -F':' '{print $2}'|/bin/grep -c up echo $result ;; master_last_io_seconds_ago) result=$REDIS_INFO|/bin/grep -w "master_last_io_seconds_ago"|awk -F':' '{print $2}' echo $result ;; master_sync_in_progress) result=$REDIS_INFO|/bin/grep -w "master_sync_in_progress"|awk -F':' '{print $2}' echo $result ;; slave_priority) result=$REDIS_INFO|/bin/grep -w "slave_priority"|awk -F':' '{print $2}' echo $result ;; cpu used_cpu_sys) result=$REDIS_INFO|/bin/grep -w "used_cpu_sys"|awk -F':' '{print $2}' echo $result ;; used_cpu_user) result=$REDIS_INFO|/bin/grep -w "used_cpu_user"|awk -F':' '{print $2}' echo $result ;; used_cpu_sys_children) result=$REDIS_INFO|/bin/grep -w "used_cpu_sys_children"|awk -F':' '{print $2}' echo $result ;; used_cpu_user_children) result=$REDIS_INFO|/bin/grep -w "used_cpu_user_children"|awk -F':' '{print $2}' echo $result ;; *) echo "argu error" ;; esac db0:key elif [[ $# == 2 ]];then case $2 in keys) result=$REDIS_INFO| /bin/grep -w "db0"| /bin/grep -w "$1" | /bin/grep -w "keys" | awk -F'=|,' '{print $2}' echo $result ;; expires) result=$REDIS_INFO| /bin/grep -w "db0"| /bin/grep -w "$1" | /bin/grep -w "expires" | awk -F'=|,' '{print $4}' echo $result ;; avg_ttl) result=$REDIS_INFO|/bin/grep -w "db0"| /bin/grep -w "$1" | /bin/grep -w "avg_ttl" | awk -F'=|,' '{print $6}' echo $result ;; *) echo "argu error" ;; esac fi </pre> 赋予权限:chmod +x redis_zbx.sh 3,编辑agentd配置文件 <pre class="wp-code-highlight prettyprint linenums:1 prettyprinted" style="padding: 2px 7px; font: 400 12px/16px "courier new"; color: rgb(248, 248, 212); border-radius: 0px; display: block; margin: 6px 0px; word-break: break-all; overflow-wrap: normal; white-space: pre-wrap; background: rgb(0, 0, 0); border: 1px solid rgb(39, 40, 34); overflow: auto; width: 891.797px; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 监控redis状态,我们可以根据这个参数对应的监控项创建redis状态触发器。 redis monitor UserParameter=redis.status,/usr/bin/redis-cli -h 127.0.0.1 -p 6379 ping |grep -c PONG UserParameter=redis_info[*],/home/yunwei/redis_zbx.sh 2 </pre> 重启agentd服务,使之生效。 好了,我们到administraton-general-other刷新下被监控主机不支持的监控项,使之生效后测试看下效果(太多数据了,这里只举例几个): 内存使用情况: e redis status状态信息: 1 说明: 1,这个模板redis监控的参数比较多,具体根据自己的实际情况启用redis里边的应用集或者监控项,也可以自己再添加,。 2,默认aof未开启 以及slave这里都有监控,用不到的就停掉,这个模板。当前模板四个触发器,其中关于aof和主从的关了,只保留了redis存活状态和redis磁盘回写失败与否两个触发器。
一、在客户端 1、到/usr/loca/zabbix/conf/zabbix_agentd.conf里添加 UserParameter=memcached_stats[*],(echo stats; sleep 1) | telnet 127.0.0.1 2 / {print $NF}' 如果你的memcache绑定了ip,请自行修改 2、重启zabbix agent服务 1 2 ps -ef|grep zabbix|grep -v grep|awk '{print $2}'|xargs kill -9 /usr/local/zabbix/sbin/zabbix_agentd -c /usr/local/zabbix/conf/zabbix_agentd.conf 二、服务端 1、在zabbix的web界面里连接监控memcache模板 () 在web里选择配置-模板 然后选择导入 然后把之前下载的memcache.xml文档导入。 然后在选择主机加入这个模板即可。 2.以上是面对memcache端口不修改,正常为11211端口。 如果是多端口或者不为11211端口的话,可以对模板进行修改, 可以sed -i ‘s/11211/你修改的端口/g’memcache.xml 然后在重新导入到zabbix就可以监控多端口或非11211端口 同时在zabbix_agentd.conf里把UserParameter里的11211改成你需要的端口 模板添加完后添加相应的主机就可以了。 模板附件: http://pan.baidu.com/s/1mik9jMK 作者:wangdaoge 来源:CSDN 原文:https://blog.csdn.net/wangdaoge/article/details/53422518 版权声明:本文为博主原创文章,转载请附上博文链接!
zabbix 监控lvs 我想像中比较好弄,但是实际中遇到了权限的问题。记下,供有需要的朋友参考。 一、环境说明 zabbix:2.0.6 ipvsadm:1.24 OS:CentOS 5.4 x86 dip:192.168.100.14 rip:192.168.100.22 rip:192.168.100.24 rip:192.168.100.76 rip:192.168.100.101 二、新建脚本 点击(此处)折叠或打开 [root@lvs-master zabbix]# pwd /etc/zabbix [root@lvs-master zabbix]# cat lvs-status.sh !/bin/bash get lvs connection @2013/09/12 by v1 author:lizonggang function AllConn { sudo /sbin/ipvsadm -L -n |awk '{print 1}END{print sum}' } function 101Conn { sudo /sbin/ipvsadm -L -n | grep 100.101|awk '{print $5}' } function 22Conn { sudo /sbin/ipvsadm -L -n | grep 100.22|awk '{print $5}' } function 24Conn { sudo /sbin/ipvsadm -L -n | grep 100.24|awk '{print $5}' } function 76Conn { sudo /sbin/ipvsadm -L -n | grep 100.76|awk '{print $5}' } function AllInConn { sudo /sbin/ipvsadm -L -n |awk '{print 1}END{print sum}' } function 101InConn { sudo /sbin/ipvsadm -L -n | grep 100.101|awk '{print $6}' } function 22InConn { sudo /sbin/ipvsadm -L -n | grep 100.22|awk '{print $6}' } function 24InConn { sudo /sbin/ipvsadm -L -n | grep 100.24|awk '{print $6}' } function 76InConn { sudo /sbin/ipvsadm -L -n | grep 100.76|awk '{print $6}' } Run the requested function $1 **三、修改配置文件 点击(此处)折叠或打开 zabbix agent 添加如下,并重启agent. [root@lvs-master zabbix]# vim zabbix_agentd.conf ipvsadm Active UserParameter=lvs.AllConn[*],/etc/zabbix/lvs-status.sh AllConn UserParameter=lvs.101Conn[*],/etc/zabbix/lvs-status.sh 101Conn UserParameter=lvs.22Conn,/etc/zabbix/lvs-status.sh 22Conn UserParameter=lvs.24Conn,/etc/zabbix/lvs-status.sh 24Conn UserParameter=lvs.76Conn,/etc/zabbix/lvs-status.sh 76Conn ipvsadm InActive UserParameter=lvs.AllInConn,/etc/zabbix/lvs-status.sh AllInConn UserParameter=lvs.101InConn,/etc/zabbix/lvs-status.sh 101InConn UserParameter=lvs.22InConn,/etc/zabbix/lvs-status.sh 22InConn UserParameter=lvs.24InConn,/etc/zabbix/lvs-status.sh 24InConn UserParameter=lvs.76InConn,/etc/zabbix/lvs-status.sh 76InConn** [root@lvs-master zabbix]# chmod +x lvs-status.sh 四、排错 由于之前lvs-status.sh 脚本没有加入sudo ,所以看agent日志报如下: [root@lvs-master zabbix]# tail -f /tmp/zabbix_agentd.log Can't initialize ipvs: Permission denied (you must be root) Are you sure that IP Virtual Server is built in the kernel or as module? 但是加入sudo 又报如下: sudo: sorry, you must have a tty to run sudo 最终解决办法是visudo 修改如下: 点击(此处)折叠或打开 [root@lvs-master ~]# visudo Defaults requiretty 添加 zabbix ALL=(ALL) NOPASSWD:/sbin/ipvsadm 问题是解决了,但是不知道#Defaults requiretty 这样会不会有其它的问题?? 五、****zabbix server 测试 点击(此处)折叠或打开 [root@jumper ~]# zabbix_get -s 192.168.100.14 -p 10050 -k "lvs.AllConn" 2326 六、****导入模板(请根据自己的需要,添加/修改/删除) 点击(此处)折叠或打开 <?xml version="1.0" encoding="UTF-8"?> <zabbix_export version="1.0" date="26.12.12" time="12.00"> <hosts> <host name="LVS Status"> <proxy_hostid>0</proxy_hostid> <useip>1</useip> <dns></dns> <ip>127.0.0.1</ip> <port>10050</port> <status>3</status> <useipmi>0</useipmi> <ipmi_ip>127.0.0.1</ipmi_ip> <ipmi_port>623</ipmi_port> <ipmi_authtype>0</ipmi_authtype> <ipmi_privilege>2</ipmi_privilege> <ipmi_username></ipmi_username> <ipmi_password></ipmi_password> <groups> <group>Freetrade</group> </groups> <triggers/> <items> <item type="7" key="lvs.AllConn" value_type="3"> <description>lvs.AllConn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.101Conn" value_type="3"> <description>lvs.101Conn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.22Conn" value_type="3"> <description>lvs.22Conn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.24Conn" value_type="3"> <description>lvs.24Conn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.76Conn" value_type="3"> <description>lvs.76Conn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.AllInConn" value_type="3"> <description>lvs.AllInConn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.101InConn" value_type="3"> <description>lvs.101InConn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.22InConn" value_type="3"> <description>lvs.22InConn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.24InConn" value_type="3"> <description>lvs.24InConn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> <item type="7" key="lvs.76InConn" value_type="3"> <description>lvs.76InConn connections</description> <ipmi_sensor></ipmi_sensor> <delay>30</delay> <history>365</history> <trends>365</trends> <status>0</status> <data_type>0</data_type> <units></units> <multiplier>0</multiplier> <delta>0</delta> <formula>0</formula> <lastlogsize>0</lastlogsize> <logtimefmt></logtimefmt> <delay_flex></delay_flex> <authtype>0</authtype> <username></username> <password></password> <publickey></publickey> <privatekey></privatekey> <params></params> <trapper_hosts>localhost</trapper_hosts> <snmp_community></snmp_community> <snmp_oid></snmp_oid> <snmp_port>161</snmp_port> <snmpv3_securityname></snmpv3_securityname> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase></snmpv3_authpassphrase> <snmpv3_privpassphrase></snmpv3_privpassphrase> <applications> <application>LVS</application> </applications> </item> </items> </host> </hosts> <dependencies/> </zabbix_export> 七、****添加图型 web界面添加图型。 image
启用php-fpm状态功能 [root@node1:~]# vim /usr/local/php-7.0.12_fpm/etc/php-fpm.conf pm.status_path = /status [root@node1:~]# cat /usr/local/php-7.0.12_fpm/etc/php-fpm.conf |grep status_path pm.status_path = /status 默认情况下为/status,当然也可以改成其他的,例如/chinasoft_status等等。 nginx配置 在默认主机里面加上location或者你希望能访问到的主机里面。 使用socket的方式进行通讯(推荐) server { listen 80 default_server; server_name 10.11.0.210; location ~ ^/(status|ping)fastcgi_script_name; } } 对应php-fpm.conf配置 listen = /tmp/php-cgi.sock 使用fastcgi的方式进行通讯 server { listen 80 default_server; server_name 10.11.0.210; location ~ ^/(status|ping)fastcgi_script_name; } } 对应php-fpm.conf配置 listen = 127.0.0.1:9000 重启nginx/php-fpm 请依照你的环境重启你的nginx和php-fpm service nginx restart service php-fpm restart 启动php-7.0.12_fpm报错 [root@node1:/usr/local/tengine-2.2.0/conf]# /etc/init.d/php-fpm restart Gracefully shutting down php-fpm /etc/init.d/php-fpm: line 82: kill: (9316) - No such process ................................... failed. Use force-quit Starting php-fpm /usr/local/php/sbin/php-fpm: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory failed 解决办法: [root@node1:/usr/local/tengine-2.2.0/conf]# yum install -y libpng 打开status页面 [root@node1:/usr/local/php/etc]# curl http://10.11.0.210/status pool: www process manager: dynamic start time: 13/Jun/2018:10:17:39 +0800 start since: 482 accepted conn: 2 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 63 active processes: 1 total processes: 64 max active processes: 1 max children reached: 0 slow requests: 0 php-fpm status详解 pool – fpm池子名称,大多数为www process manager – 进程管理方式,值:static, dynamic or ondemand. dynamic start time – 启动日期,如果reload了php-fpm,时间会更新 start since – 运行时长 accepted conn – 当前池子接受的请求数 listen queue – 请求等待队列,如果这个值不为0,那么要增加FPM的进程数量 max listen queue – 请求等待队列最高的数量 listen queue len – socket等待队列长度 idle processes – 空闲进程数量 active processes – 活跃进程数量 total processes – 总进程数量 max active processes – 最大的活跃进程数量(FPM启动开始算) max children reached - 大道进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。 slow requests – 启用了php-fpm slow-log,缓慢请求的数量 php-fpm其他参数 php-fpm状态页比较个性化的一个地方是它可以带参数,可以带参数json、xml、html并且前面三个参数可以分别和full做一个组合。 json [root@node1:/usr/local/php/etc]# curl http://10.11.0.210/status?json {"pool":"www","process manager":"dynamic","start time":1528856259,"start since":566,"accepted conn":3,"listen queue":0,"max listen queue":0,"listen queue len":0,"idle processes":63,"active processes":1,"total processes":64,"max active processes":1,"max children reached":0,"slow requests":0} xml curl http://127.0.0.1/status?xml html curl http://127.0.0.1/status?html full curl http://127.0.0.1/status?full pool: www process manager: dynamic start time: 13/Jun/2018:10:39:54 +0800 start since: 43 accepted conn: 46 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 15 active processes: 1 total processes: 16 max active processes: 1 max children reached: 0 slow requests: 0 pid: 5262 state: Idle start time: 13/Jun/2018:10:39:54 +0800 start since: 43 requests: 3 request duration: 203 request method: GET request URI: /status content length: 0 user: - script: - last request cpu: 0.00 last request memory: 2097152 pid: 5263 state: Idle start time: 13/Jun/2018:10:39:54 +0800 start since: 43 requests: 3 request duration: 130 request method: GET request URI: /status content length: 0 user: - script: - last request cpu: 0.00 last request memory: 2097152 pid: 5264 state: Idle start time: 13/Jun/2018:10:39:54 +0800 start since: 43 requests: 3 request duration: 129 request method: GET request URI: /status content length: 0 user: - script: - last request cpu: 0.00 last request memory: 2097152 pid: 5265 state: Idle start time: 13/Jun/2018:10:39:54 +0800 start since: 43 requests: 3 request duration: 154 request method: GET request URI: /status content length: 0 user: - script: - last request cpu: 0.00 last request memory: 2097152 ...... 6.5 full详解 pid – 进程PID,可以单独kill这个进程. You can use this PID to kill a long running process. state – 当前进程的状态 (Idle, Running, …) start time – 进程启动的日期 start since – 当前进程运行时长 requests – 当前进程处理了多少个请求 request duration – 请求时长(微妙) request method – 请求方法 (GET, POST, …) request URI – 请求URI content length – 请求内容长度 (仅用于 POST) user – 用户 (PHP_AUTH_USER) (or ‘-’ 如果没设置) script – PHP脚本 (or ‘-’ if not set) last request cpu – 最后一个请求CPU使用率。 last request memorythe - 上一个请求使用的内存 二、服务端的操作 导入php-fpm的监控模板 template php-fpm 1.添加监控脚本 vim /usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh !/bin/bash listenqueue(){ curl -m 10 -s http://127.0.0.1:80/status?auto |grep "listen queue:"|grep -vE "len|max"|awk '{print$3}' } listenqueuelen(){ curl -m 10 -s http://127.0.0.1:80/status?auto |grep "listen queue len" |awk '{print$4}' } idle(){ curl -m 10 -s http://127.0.0.1:80/status?auto |grep "idle processes" |awk '{print3}'|grep -v "process" } total(){ curl -m 10 -s http://127.0.0.1:80/status?auto |grep "total processes" |awk '{print$3}' } mactive(){ curl -m 10 -s http://127.0.0.1:80/status?auto |grep "max active processes:" |awk '{print$4}' } since(){ curl -m 10 -s http://127.0.0.1:80/status?auto |grep "start since: " |awk '{print$3}' } conn(){ curl -m 10 -s http://127.0.0.1:80/status?auto |grep "accepted conn" |awk '{print$3}' } reached(){ curl -m 10 -s http://127.0.0.1:80/status?auto |grep "max children reached" |awk '{print3}' } $1 给脚本添加执行权限 chmod +x /usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh 2.增加配置文件 [root@node1:/usr/local/php/etc]# vim /usr/local/zabbix_agents_3.2.0/conf/zabbix_agentd/php-fpm_status.conf UserParameter=idle.processe,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh idle UserParameter=total.processes,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh total UserParameter=active.processes,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh active UserParameter=max.active.processes,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh mactive UserParameter=listen.queue.len,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh listenqueuelen UserParameter=listen.queue,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh listenqueue UserParameter=start.since,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh since UserParameter=accepted.conn,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh conn UserParameter=max.children.reached,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh reached UserParameter=slow.requests,/usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh requests 3.重启客户端,并测试 [root@node1:~]# /usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh idle 15 [root@node1:~]# /usr/local/zabbix_agents_3.2.0/scripts/php-fpm_status.sh total 16 服务端测试 [root@node5 ~]# zabbix_get -s 10.11.0.210 -p 10050 -k "active.processes" 1 [root@node5 ~]# zabbix_get -s 10.11.0.210 -p 10050 -k "slow.requests" 0 [root@node5 ~]# zabbix_get -s 10.11.0.210 -p 10050 -k "total.processes" 16 zabbix监控php-fpm模板 <?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.2</version> <date>2018-06-27T12:26:33Z</date> <groups> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>Template php-fpm</template> <name>Template php-fpm</name> <description/> <groups> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>php-fpm</name> </application> </applications> <items> <item> <name>accepted conn</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>accepted.conn</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units>k</units> <delta>1</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>active processes</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>active.processes</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>php-fpm_idle_processes</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>idle.processe</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>listen queue</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>listen.queue</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>listen queue len</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>listen.queue.len</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>max active processes</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>max.active.processes</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>max children reached</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>max.children.reached</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>1</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>2</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>slow requests</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>slow.requests</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>1</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>2</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>start since</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>start.since</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>1</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>2</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>total processes</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>total.processes</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>up</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>up</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>php-fpm</name> </application> </applications> <valuemap/> <logtimefmt/> </item> </items> <discovery_rules/> <httptests/> <macros> <macro> <macro>{$PHP_FPM_STATUS_URL}</macro> <value>http://127.0.0.1:10061/php-fpm_status</value> </macro> </macros> <templates/> <screens/> </template> </templates> <triggers> <trigger> <expression>{Template php-fpm:up.last()}=0</expression> <recovery_mode>0</recovery_mode> <recovery_expression/> <name>php-fpm was down</name> <correlation_mode>0</correlation_mode> <correlation_tag/> <url/> <status>0</status> <priority>0</priority> <description/> <type>0</type> <manual_close>0</manual_close> <dependencies/> <tags/> </trigger> </triggers> <graphs> <graph> <name>php-fpm_status</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>C800C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template php-fpm</host> <key>active.processes</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>00C8C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template php-fpm</host> <key>listen.queue</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>C8C800</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template php-fpm</host> <key>listen.queue.len</key> </item> </graph_item> <graph_item> <sortorder>3</sortorder> <drawtype>0</drawtype> <color>C8C8C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template php-fpm</host> <key>max.active.processes</key> </item> </graph_item> <graph_item> <sortorder>4</sortorder> <drawtype>0</drawtype> <color>960000</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template php-fpm</host> <key>idle.processe</key> </item> </graph_item> <graph_item> <sortorder>5</sortorder> <drawtype>0</drawtype> <color>000096</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template php-fpm</host> <key>total.processes</key> </item> </graph_item> </graph_items> </graph> </graphs> </zabbix_export> 作者:郑子明 来源:CSDN 原文:https://blog.csdn.net/reblue520/article/details/80891694 版权声明:本文为博主原创文章,转载请附上博文链接!
zabbix服务端nginx的上传文件限制修改:client_max_body_size 5m; nginx 客户端开启状态检测 nginx server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } } zabbix客户端配置脚本指令 cat /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf UserParameter=nginx.status[*],/etc/zabbix/scripts/nginx.sh $1 nginx.sh脚本 mkdir -p /etc/zabbix/scripts vim /etc/zabbix/scripts/nginx.sh #!/bin/bash ################################################## # AUTHOR: Neo <netkiller@msn.com> # WEBSITE: http://www.netkiller.cn # Description:zabbix 通过 status 模块监控 nginx # Note:Zabbix 3.2 # DateTime: 2016-11-22 ################################################## HOST="localhost" PORT="80" stub_status=stub_status function check() { if [ -f /sbin/pidof ]; then /sbin/pidof nginx | wc -w else ps ax | grep "nginx:" | grep -v grep | wc -l fi } function active() { /usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Active' | awk '{print $NF}' } function accepts() { /usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $1}' } function handled() { /usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $2}' } function requests() { /usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $3}' } function reading() { /usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Reading' | awk '{print $2}' } function writing() { /usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Writing' | awk '{print $4}' } function waiting() { /usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Waiting' | awk '{print $6}' } case "$1" in check) check ;; active) active ;; accepts) accepts ;; handled) handled ;; requests) requests ;; reading) reading ;; writing) writing ;; waiting) waiting ;; *) echo $"Usage $0 {check|active|accepts|handled|requests|reading|writing|waiting}" exit esac #zabbix客户端 chmod +x /srv/zabbix/libexec/nginx.sh # /srv/zabbix/libexec/nginx.sh Usage /srv/zabbix/libexec/nginx.sh {active|accepts|handled|requests|reading|writing|waiting} # /srv/zabbix/libexec/nginx.sh accepts 82 # systemctl restart zabbix-agent.service #zabbix页面导入模板 #nginx.xml <?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.2</version> <date>2016-11-29T07:05:44Z</date> <groups> <group> <name>Netkiller</name> </group> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>Template App Nginx</template> <name>Template App Nginx</name> <description>Nginx Template - http://www.netkiller.cn</description> <groups> <group> <name>Netkiller</name> </group> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>nginx</name> </application> </applications> <items> <item> <name>nginx status server accepts</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[accepts]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>1</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>accepts</description> <inventory_link>0</inventory_link> <applications> <application> <name>nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx status connections active</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[active]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>active</description> <inventory_link>0</inventory_link> <applications> <application> <name>nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx process</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[check]</key> <delay>60</delay> <history>30</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>is live</description> <inventory_link>0</inventory_link> <applications> <application> <name>nginx</name> </application> </applications> <valuemap> <name>Service state</name> </valuemap> <logtimefmt/> </item> <item> <name>nginx status server handled</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[handled]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>1</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>handled</description> <inventory_link>0</inventory_link> <applications> <application> <name>nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx status connections reading</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[reading]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>reading</description> <inventory_link>0</inventory_link> <applications> <application> <name>nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx status server requests</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[requests]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>1</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>requests</description> <inventory_link>0</inventory_link> <applications> <application> <name>nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx status connections waiting</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[waiting]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>waiting</description> <inventory_link>0</inventory_link> <applications> <application> <name>nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx status connections writing</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>nginx.status[writing]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description>writing</description> <inventory_link>0</inventory_link> <applications> <application> <name>nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> </items> <discovery_rules/> <httptests/> <macros/> <templates/> <screens/> </template> </templates> <triggers> <trigger> <expression>{Template App Nginx:nginx.status[check].last()}=0</expression> <recovery_mode>0</recovery_mode> <recovery_expression/> <name>nginx was down!</name> <correlation_mode>0</correlation_mode> <correlation_tag/> <url/> <status>0</status> <priority>4</priority> <description>Nginx process count: 0</description> <type>0</type> <manual_close>0</manual_close> <dependencies/> <tags/> </trigger> </triggers> <graphs> <graph> <name>nginx status connections</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>00C800</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App Nginx</host> <key>nginx.status[active]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>C80000</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App Nginx</host> <key>nginx.status[reading]</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>0000C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App Nginx</host> <key>nginx.status[waiting]</key> </item> </graph_item> <graph_item> <sortorder>3</sortorder> <drawtype>0</drawtype> <color>C800C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App Nginx</host> <key>nginx.status[writing]</key> </item> </graph_item> </graph_items> </graph> <graph> <name>nginx status server</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>00C800</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App Nginx</host> <key>nginx.status[accepts]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>C80000</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App Nginx</host> <key>nginx.status[handled]</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>0000C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template App Nginx</host> <key>nginx.status[requests]</key> </item> </graph_item> </graph_items> </graph> </graphs> <value_maps> <value_map> <name>Service state</name> <mappings> <mapping> <value>0</value> <newvalue>Down</newvalue> </mapping> <mapping> <value>1</value> <newvalue>Up</newvalue> </mapping> </mappings> </value_map> </value_maps> </zabbix_export>
mysqljian'kabbix官方支持监控MySQL,但直接使用默认的模板是不可用的,还需要经过额外的设置才可以使用。如果只需要对mysql数据库做简单的监控,zabbix自带的模板完全能够满足要求;如果有更高的需求那需要自己写脚本,或者使用fromdual插件,最近在研究,总是有些问题,没能解决,如果哪位成功了,欢迎交流~~ 参考:http://www.fromdual.com/mpm-installation-guide 下面是用zabbix自带的模板监控mysql的步骤。 环境:zabbix2.4.5 ubuntu14.04 LTS mysql 5.5 1、确定zabbix中有mysql的监控模板。默认已经在zabbix2.2及以上的版本中。模板名称:Template App MySQL。 如果没有则要去zabbix官方下载 url:https://zabbix.org/mw/images/d/d4/Template_App_MySQL-2.2.0.xml,然后在Zabbix服务器的前端Web界面的组态->模板页面中选择汇入(各种神翻译),在新的页面中导入下载的模板文件。 2、配置mysql的客户端,创建一个用户来获取mysql的相关数据 <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">GRANT USAGE ON . TO 'mysqlcheck'@'localhost' IDENTIFIED BY 'mysqlcheck'; FLUSH PRIVILEGES;</pre> 3、设置完帐户之后在被监控端新建/etc/zabbix/.my.cnf以提供Zabbix Agent访问数据库,内容类似如下: [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">sudo vim + /etc/zabbix/.my.cnf [mysql] host = localhost user = mysqlcheck password = mysqlcheck socket = /var/run/mysqld/mysqld.sock [mysqladmin] host = localhost user = mysqlcheck password = mysqlchechk socket = /var/run/mysqld/mysqld.sock</pre> [ 复制代码 ](javascript:void(0); "复制代码") 4、修改/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf,这个文件用于制定Zabbix Agent如何获取MySQL数据,我们需要将所有的/var/lib/zabbix修改为当前.my.cnf文件的路径/etc/zabbix。设置完 成之后保存并重启Zabbix Agent <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">sudo sed -i 's@/var/lib/zabbix@/etc/zabbix@g' /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf sudo service zabbix-agent restart</pre> 5、以上就配置完成了。开始监控后,主机会生成两个新图形。 image 版权所有@chrisDuan 博客地址http://www.cnblogs.com/chrisDuan 可以转载,注明出处.
模板名字,Template gpu 。zbx_export_templates.xml。 客户端需要安装zabbix和open hardware monitor <?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.0</version> <date>2018-12-18T07:45:39Z</date> <groups> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>Template gpu</template> <name>Template gpu</name> <description/> <groups> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>GPU</name> </application> </applications> <items> <item> <name>gputotal0</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>gputotal0</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>gputotal1</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>gputotal1</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>gpuused0</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>gpuused0</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>gpuused1</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>gpuused1</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>AMD GPU 0 Fan</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Control"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>%</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>AMD GPU 0 Load</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Load"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>%</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>AMD GPU 0 Free Memory</name> <type>0</type> <snmp_community/> <multiplier>1</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Smalldata/1"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>MB</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1000</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>AMD GPU 0 Used Memory</name> <type>0</type> <snmp_community/> <multiplier>1</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Smalldata/2"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>MB</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1000</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>AMD GPU 0 Total Memory</name> <type>0</type> <snmp_community/> <multiplier>1</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Smalldata/3"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>MB</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1000</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>AMD GPU 0 Temp</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Temperature"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>C</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>AMD GPU 0 Voltage</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Voltage"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>V</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>NVIDIA GPU 0 Fan</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Control"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>%</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>NVIDIA GPU 0 Load</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Load"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>%</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>NVIDIA GPU 0 Free Memory</name> <type>0</type> <snmp_community/> <multiplier>1</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Smalldata/1"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>MB</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1000</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>NVIDIA GPU 0 Used Memory</name> <type>0</type> <snmp_community/> <multiplier>1</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Smalldata/2"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>MB</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1000</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>NVIDIA GPU 0 Total Memory</name> <type>0</type> <snmp_community/> <multiplier>1</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Smalldata/3"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>MB</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1000</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>NVIDIA GPU 0 Temp</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Temperature"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>C</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>NVIDIA GPU 0 Voltage</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Voltage"]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>V</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>GPU</name> </application> </applications> <valuemap/> <logtimefmt/> </item> </items> <discovery_rules/> <macros/> <templates/> <screens/> </template> </templates> <triggers> <trigger> <expression>{Template gpu:wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Control"].last()}>90</expression> <name>AMD fan 0 more then 90%</name> <url/> <status>0</status> <priority>3</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Template gpu:wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Load"].last()}>90</expression> <name>AMD GPU 0 more than 90</name> <url/> <status>0</status> <priority>3</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Template gpu:wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Temperature"].last()}>75</expression> <name>AMD GPU 0 Temp more then 75 C</name> <url/> <status>0</status> <priority>3</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Template gpu:wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Control"].last()}>90</expression> <name>NVIDIA fan 0 more then 90%</name> <url/> <status>0</status> <priority>3</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Template gpu:wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Load"].last()}>90</expression> <name>NVIDIA GPU 0 more than 90</name> <url/> <status>0</status> <priority>3</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Template gpu:wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Temperature"].last()}>75</expression> <name>NVIDIA GPU 0 Temp more then 75 C</name> <url/> <status>0</status> <priority>3</priority> <description/> <type>0</type> <dependencies/> </trigger> </triggers> <graphs> <graph> <name>GPU 0 Fan</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Control"]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>F63100</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Control"]</key> </item> </graph_item> </graph_items> </graph> <graph> <name>GPU 0 Load</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Load"]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>F63100</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Load"]</key> </item> </graph_item> </graph_items> </graph> <graph> <name>GPU 0 Memory</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Smalldata/1"]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>F63100</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Smalldata/3"]</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>2774A4</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Smalldata/2"]</key> </item> </graph_item> <graph_item> <sortorder>3</sortorder> <drawtype>0</drawtype> <color>A54F10</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Smalldata/1"]</key> </item> </graph_item> <graph_item> <sortorder>4</sortorder> <drawtype>0</drawtype> <color>FC6EA3</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Smalldata/3"]</key> </item> </graph_item> <graph_item> <sortorder>5</sortorder> <drawtype>0</drawtype> <color>6C59DC</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Smalldata/2"]</key> </item> </graph_item> </graph_items> </graph> <graph> <name>GPU 0 Temp/Voltage</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Temperature"]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>F63100</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/atigpu/0" and SensorType="Voltage"]</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>2774A4</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Temperature"]</key> </item> </graph_item> <graph_item> <sortorder>3</sortorder> <drawtype>0</drawtype> <color>A54F10</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template gpu</host> <key>wmi.get[root\openhardwaremonitor,SELECT Value FROM Sensor WHERE Parent="/nvidiagpu/0" and SensorType="Voltage"]</key> </item> </graph_item> </graph_items> </graph> </graphs> </zabbix_export>
!/bin/bash hn=hostname -I|awk '{print $1}' da=date +"%Y%m%d" file=da"_userslogdate.txt" echo "">1}'`;do lastlog -b 60 -u file;done cat $file
筛选: 从众多的输出结果中挑选出符合条件的项。通常情况下,输出结果以列表的形式显示 例如:用get-command命令查看前十行的命令 wKiom1gVvW3Dx84XAACyV8_fMEw871.jpg 默认情况下,get-command搜索到的命令是以列表的形式展示的,如上图所示,输出结果有三列,这三个字段分别是:CommandType、Name、Definition。有些字段可以作为选项,来进行命令筛选 例如:用Command-Type作为选项,查询命令类型为Alias的所有命令 wKioL1gVv5jijS1CAAAiSQEUO8M918.png 例如:将Name作为选项,查询Name中包含Add的所有命令 wKiom1gVwMjwm7GmAAAZr6bnVDQ530.png 管道: 管道符号:| 命令1 | 命令2 | 命令3 用法:将管道前的输出结果交给管道后的命令来处理,通常用于筛选或者获取属性 通用筛选语句: Where-Object:别名为?,所以也可以简写为“?” wKioL1gVxIOxXy9kAAANe8aDOzI452.png 语法: 管道前命令| Where-Object {$_.字段名 -eq/like "关键字"} 字段名:命令查询出来的列名 -eq:通常用于精确查询,用于数字列的情况,也可以用于文字列,但是要求字符完全匹配 -like:通常用于模糊查询,用于文字列的情况,也可以配合通配符“*”使用 例如:搜索Name为copy的命令 wKioL1gVxg-wImfGAAAJAyff6IE797.png 也可以这样写: wKiom1gVxlih9_8-AAAIIE0TTeM351.png 例如:筛选进程名为“svchost”的进程 wKioL1gVyHuA7WEWAAApN8E1T1E809.png 用like模糊查询 wKioL1gVxwWSPT1xAAANzbPVrL0966.png 其他筛选方式: Select-Object -First 10:筛选前十行 Select-Object -First 10:筛选后十行 wKioL1gVy8rjA44vAAAZ-Zc640M225.png 输出格式: 输出格式有两种: 按详细列表方式输出:Format-List,这种格式输出的信息比Format-Table更加详细 按表格的方式输出:Format-Table
删除第一行 Get-Content a.txt | Select-Object -Skip 1 | Set-Content b.txt 复制代码 删除前2行 Get-Content a.txt | Select-Object -Skip 2 | Set-Content b.txt 复制代码 删除前3行 Get-Content a.txt | Select-Object -Skip 3 | Set-Content b.txt 复制代码
(Get-Content file.txt) | Foreach-Object {$_ -replace '[MYID]','MyValue'} | Out-File file.txt
[System.Net.Dns]::GetHostAddresses(_.AddressFamily -eq 'InterNetwork' } | Select-Object -ExpandProperty IPAddressToString
Windows PowerShell 现用执行策略很可能是Restricted(默认设置)。 Restricted 执行策略不允许任何脚本运行。若要了解计算机上的现用执行策略,请键入:get-executionpolicy 。若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本,请使用以下命令将计算机上的执行策略更改为 RemoteSigned:Set-ExecutionPolicy -Scope CurrentUser,输入RemoteSigned作为执行策略的值即可解决。
today" 昨天 "昨天是:today.AddDays(-1))" 明天 "明天是:today.AddDays(1))" 一周前 "一周前是: today.AddDays(-7))" 五个月前 "五个月前:today.AddMonths(-5))" 十年之前 "十年之前:today.AddYears(-10).Year)年,我们是朋友." 日期格式化 "格式化日期:" + $today.ToString('yyyy-MM-dd')
ComputerName) | Where-Object {adsi = [ADSI]"WinNT://adsi.Children | where {today=Get-Date -Format 'yyyyMMdd'ipaddr+""+ -replace '{|}',''} | Out-File $filename
docker search centos docker pull centos docker run -it centos /bin/bash 安装LNMP下zabbix:https://www.jianshu.com/p/3d60e62d9f95
qcow2、raw、vmdk等镜像格式 目录 原文:http://www.prajnagarden.com/?p=248 June 12th, 2012 云计算用一个朋友的话来说:”做云计算最苦逼的就是得时时刻刻为一些可能一辈子都碰不到的事做好准备。更苦逼的就是刚以为一个问题不会遇到,立刻就发生了。。。“。这个还真的没有办法,谁让哥我是搞云计算的呢,简单一个虚拟化就搞的你蛋疼,你还能想其它的吗? 一直纠结在做虚拟化使用什么镜像格式,刚刚开始用了raw的file,后来发现LVM的很多特性对于虚拟化还是有比较理想的能力,而且性能也很不错就用了LVM。后来被VMware骗了跑去搞Esxi接触了VMDK,最近研究openstack发现了qcow2格式,貌似现在很流行呀。也说不上分析这些镜像格式的能力,就简单说说自己的一些使用心得。 目前主要有那些格式来作为虚拟机的镜像: raw (default) the raw format is a plain binary image of the disc image, and is very portable. On filesystems that support sparse files, images in this format only use the space actually used by the data recorded in them. 老牌的格式了,用一个字来说就是裸,也就是赤裸裸,你随便dd一个file就模拟了一个raw格式的镜像。由于裸的彻底,性能上来说的话还是不错的。目前来看,KVM和XEN默认的格式好像还是这个格式。因为其原始,有很多原生的特性,例如直接挂载也是一件简单的事情。 裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像对裸露的它来说还是很简单的(如果其它格式需要转换,有时候还是需要它做为中间格式),空间使用来看,这个很像磁盘,使用多少就是多少(du -h看到的大小就是使用大小),但如果你要把整块磁盘都拿走的话得全盘拿了(copy镜像的时候),会比较消耗网络带宽和I/O。接下来还有个有趣的问题,如果那天你的硬盘用着用着不够用了,你咋办,在买一块盘。但raw格式的就比较犀利了,可以在原来的盘上追加空间: | 1 2 | dd``if``=``/dev/zero``of=zeros.raw bs=1024k count=4096 ``# 先创建4G的空间 cat``foresight.img zeros.raw > new-foresight.img ``# 追加到原有的镜像之后 | 当然,好东西是吹出来的,谁用谁知道,还是有挺多问题的。由于原生的裸格式,不支持snapshot也是很正常的。传说有朋友用版本管理软件对raw格式的文件做版本管理从而达到snapshot的能力,估计可行,但没试过,这里也不妄加评论。但如果你使用LVM的裸设备,那就另当别论。说到LVM还是十分的犀利的,当年用LVM做虚拟机的镜像,那性能杠杠的。而且现在好多兄弟用虚拟化都采用LVM来做的。在LVM上做了很多的优化,国外听说也有朋友在LVM增量备份方面做了很多的工作。目前来LVM的snapshot、性能、可扩展性方面都还是有相当的效果的。目前来看的话,备份的话也问题不大。就是在虚拟机迁移方面还是有很大的限制。但目前虚拟化的现状来看,真正需要热迁移的情况目前需求还不是是否的强烈。虽然使用LVM做虚拟机镜像的相关公开资料比较少,但目前来看牺牲一点灵活性,换取性能和便于管理还是不错的选择。 对于LVM相关的特性及使用可以参考如下链接:http://www.ibm.com/developerworks/linux/library/l-lvm2/index.html cow copy-on-write format, supported for historical reasons only and not available to QEMU on Windows 曾经qemu的写时拷贝的镜像格式,目前由于历史遗留原因不支持窗口模式。从某种意义上来说是个弃婴,还没等它成熟就死在腹中,后来被qcow格式所取代。 qcow the old QEMU copy-on-write format, supported for historical reasons and superseded by qcow2 一代的qemu的cow格式,刚刚出现的时候有比较好的特性,但其性能和raw格式对比还是有很大的差距,目前已经被新版本的qcow2取代。其性能可以查看如下链接:http://www.linux-kvm.org/page/Qcow2 qcow2 QEMU copy-on-write format with a range of special features, including the ability to take multiple snapshots, smaller images on filesystems that don’t support sparse files, optional AES encryption, and optional zlib compression 现在比较主流的一种虚拟化镜像格式,经过一代的优化,目前qcow2的性能上接近raw裸格式的性能,这个也算是redhat的官方渠道了,哈哈,希望有朋友能拍他们砖:https://fedoraproject.org/wiki/Features/KVM_qcow2_Performance 对于qcow2的格式,几点还是比较突出的,qcow2的snapshot,可以在镜像上做N多个快照: 更小的存储空间,即使是不支持holes的文件系统也可以(这下du -h和ls -lh看到的就一样了) Copy-on-write support, where the image only represents changes made to an underlying disk image(这个特性SUN ZFS表现的淋漓尽致) 支持多个snapshot,对历史snapshot进行管理 支持zlib的磁盘压缩 支持AES的加密 vmdk VMware 3 & 4, or 6 image format, for exchanging images with that product VMware的格式,这个格式说的蛋疼一点就有点牛X,原本VMware就是做虚拟化起家,自己做了一个集群的VMDK的pool,做了自己的虚拟机镜像格式。又拉着一些公司搞了一个OVF的统一封包。从性能和功能上来说,vmdk应该算最出色的,由于vmdk结合了VMware的很多能力,目前来看,KVM和XEN使用这种格式的情况不是太多。但就VMware的Esxi来看,它的稳定性和各方面的能力还是可圈可点。 vdi VirtualBox 1.1 compatible image format, for exchanging images with VirtualBox. SUN收购了VirtualBox,Oracle又收购了SUN,这么说呢,vdi也算虚拟化这方面的一朵奇葩,可惜的是入主的两家公司。SUN太专注于技术(可以说是IT技术最前端也不为过),Oracle又是开源杀手(mysql的没落)。单纯从能力上来说vdi在VirtualBox上的表现还是不错的。也是不错的workstation级别的产品。 说了这么多虚拟机镜像格式,这么多虚拟化,做云计算的伤不起呀,得为长期发展考虑,也有朋友对镜像的转换做了很多事情,简单看看几种镜像的转化: 转换工具 VMDK–>qcow2 qemu-img convert -f vmdk -O qcow2 SLES11SP1-single.vmdk SLES11SP1-single.img http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/index.html qcow2–>raw qemu-img convert -O qcow2 image-raw.raw image-raw-converted.qcow raw-> qcow2 qemu-img convert -f raw -O qcow2 2fuel2.img 2fuel2.qcow2 将OVA或VMDK格式转换为Xen可运行格式 将VMDK转换为Xen可运行格式 假设待转换vmdk格式的硬盘为origin.vmdk 要有qemu-img和vmware-vdiskmanager两个工具 安装qemu来获得qemu-img工具 安装vmware server来获得vmware-vdiskmanager工具 首先运行:vmware-vdiskmanager -r origin.vmdk -t 0 temp.vmdk 然后运行:qemu-img convert -f vmdk temporary_image.vmdk -O raw xen_compatible.img 将ova格式转换为Xen可读格式 假设待转换文件为origin.ova,在windows下将其改为origin.rar直接解压缩或在Linux下使用tar xvf oringin.ova解压缩。 解压缩后生成三个文件: xxx.vmdk xxx.mf xxx.ovf 使用上文方法一的步骤将xxx.vmdk转为Xen可运行格式。 转换VMWare的image让KVM能使用 我们先要安装一个小软件virt-goodies: sudo apt-get install virt-goodies 然后使用vmware2libvirt来给VMWare VM的基本资料vmx转成KVM可以读入的XML. 如: vmware2libvirt -f myvm.vmx > myvm.xml 使用qemu-img将VMWare VM的disk image转成KVM能读的文件: qemu-img convert -f vmdk myvm.vmdk -O qcow2 myvm.qcow2 可能还需要修改一下vmx转成的xml disk中的target dev,在VMWARE是ide(target dev=’hda’ bus=’ide’)可能要修改成scsi(target dev=’sda’ bus=’scsi’),我们看能不能找到ROOT就知道是不是用对了; bridge mode, 给interface type=’network’修改成interface type=’bridge’, 而source network=’default’修改成source bridge=’br0′. qcow选项,则会创建QCOW(写时复制)格式 修改后给VM的配置加入到libvirtd中. virsh -c qemu:///system define myvm.xml virsh -c qemu:///system list --all
修改内核模式为内核启动: vi /boot/grub2/grub.cfg defaults=1 关闭selinux 关闭防火墙 --bios开启虚拟化 安装 yum -y install kvm python-virtinst libvirt tunctl bridge-utils virt-manager qemu-kvm-tools virt-viewer virt-v2v yum -y install libguestfs-tools 启动 service libvirtd start 查看kvm模块 lsmod|grep kvm 查看虚机工具版本 virsh --version virt-install --version qemu-kvm -version 手动配置网桥工具 chkconfig NetworkManager off service NetworkManager stop cd /etc/sysconfig/network-scripts/ cp ifcfg-eth0 ifcfg-br0 vi ifcfg-eth0 DEVICE="eth0" BOOTPROTO=static NM_CONTROLLED="no" ONBOOT=yes TYPE="Ethernet" BRIDGE="br0" UUID="99dde4d3-94f1-4293-b8a8-b10255d5b8be" HWADDR=00:0C:29:47:41:8C IPADDR=192.168.233.130 PREFIX=24 GATEWAY=192.168.233.2 DNS1=192.168.233.2 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="Systemeth0" vi ifcfg-br0 DEVICE="br0" BOOTPROTO=static ONBOOT=yes TYPE="Bridge" HWADDR=00:0C:29:47:41:8C IPADDR=192.168.233.130 PREFIX=24 GATEWAY=192.168.233.2 DNS1=192.168.233.2 service network restart
上传操作系统 qcow2格式创建,空间为可动态增长 qemu-img create -f qcow2 test02.img 7G virt-install --name=oeltest02 --os-variant=RHEL5.8 --ram 512 --vcpus=1 --disk path=/data/test02.img,format=qcow2,size=7,bus=virtio --accelerate --cdrom /data/iso/oel58x64.iso --vnc --vncport=5910 --vnclisten=0.0.0.0 --network bridge=br0,model=virtio --noautoconsole --name指定虚拟机名称 --ram分配内存大小。 --vcpus分配CPU核心数,最大与实体机CPU核心数相同 --disk指定虚拟机镜像,size指定分配大小单位为G。 --network网络类型,此处用的是默认,一般用的应该是bridge桥接。 --accelerate加速 --cdrom指定安装镜像iso --vnc启用VNC远程管理,一般安装系统都要启用。 --vncport指定VNC监控端口,默认端口为5900,端口不能重复。 --vnclisten指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0。 --os-type=linux,windows --os-variant= win7:MicrosoftWindows7 vista:MicrosoftWindowsVista winxp64:MicrosoftWindowsXP(x86_64) winxp:MicrosoftWindowsXP win2k8:MicrosoftWindowsServer2008 win2k3:MicrosoftWindowsServer2003 freebsd8:FreeBSD8.x generic:Generic debiansqueeze:DebianSqueeze debianlenny:DebianLenny fedora16:Fedora16 fedora15:Fedora15 fedora14:Fedora14 mes5.1:MandrivaEnterpriseServer5.1andlater mandriva2010:MandrivaLinux2010andlater rhel6:RedHatEnterpriseLinux6 rhel5.4:RedHatEnterpriseLinux5.4orlater rhel4:RedHatEnterpriseLinux4 sles11:SuseLinuxEnterpriseServer11 sles10:SuseLinuxEnterpriseServer ubuntuoneiric:Ubuntu11.10(OneiricOcelot) ubuntunatty:Ubuntu11.04(NattyNarwhal) ubuntumaverick:Ubuntu10.10(MaverickMeerkat) ubuntulucid:Ubuntu10.04(LucidLynx) ubuntuhardy:Ubuntu8.04LTS(HardyHeron) 镜像下载 wget http://mirrors.huaweicloud.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso qemu-img create -f qcow2 zhoulj-test.img 7G virt-install --name=zhoulj-test os-variant=rhel7 --raw 1024 vcpus=1 --disk path=/data/zhoulj-test.img,format=qcow2,size=7,bus=virtio --accelerate --cdrom /data/iso/CentOS-7-x86_64-DVD-1810.iso --vnc --vncport=5910 --vnclisten=0.0.0.0 --network bridge=br0,model=virtio --noautoconsole 然后通过VNC连接
mha部署 image.png image.png image.png image.png image.png image.png image.png image.png ---504故障转移
导出所有数据库 mysqldump -q --single-transaction -A >all.sql 导出某几个数据库 mysqldump -q --single-transaction -B db1 db2 >a.sql 导出某几张表 mysqldump -q --single-transaction -B db1.a db2.c >a.sql 导出表结构 mysqldump -q -d --skip-triggers 导出存储过程 mysqldum -q -Rtdn --skip-triggers 导出触发器 mysqldump -q -tdn --skip-triggers 导出事件 mysqldump -q -Etdn --skip-triggers 导出数据 mysqldump -q --single-transaction --skip-triggers -t 建立新slave mysqldump -q --single-transaction --master-data=2 -A>all.sql 恢复 mysql -uroot -p1222 <all.sql mydumper 性能比mysqldump 性能快10倍 安装 image.png mydumper -uroot -pxxx -B db1 db2 -o a.sql myloader -uroot -pxx 全量备份脚本: !/bin/bash mkdir /backup cd /backup datadir=date +"%Y-%m-%d" mkdir -p i|gzip>/backup/i_binlog_rm" 凌晨1点 增量备份 !/bin/bash cd /backup datadir=date +"%Y-%m-%d" mkdir -p path/mysql-bin.index|sed 's/.///'for i in $binlog_cp do mysql -uroot -p123456 -e "\cp -p $path/$i /backup/$datadir/data/;" done binlog_rm=tail -n 1 binlog_rm'" 热备份工具:xtrabackup 安装 全量 备份所有 innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf /bak/ 备份数据库 innobackupex --user=root --password=123456 --defaults-file=/etc/my.cnf --databases=/bak/ 恢复 1、mysqld stop 2、删除数据文件和事务日志文件 3、innobackupex --defaults-file=/etc/my.cnf --apply-log /bak/2013xxxxx 4、innobackupex --defaults-file=/etc/my.cnf --copy-back /bak/2013xxxx 5、chown -R mysql.mysql /usr/local/mysql/data 6、mysqld start
mysql5.7 mariadb10.1,percona5.7 性能调优,高可用,监控 mysql安装 image.png 添加jemalloc管理内存 [mysqld_safe] malloc-ib=/usr/lib64/libjemalloc.so 5.7比5.6读写性能高2-3倍 -- 安装ssl加密 image.png mysql生成免密登录,maria没这个功能 image.png image.png grant all on . to 'xx'@'%' identified by 'aa'; innodb_undo_ logs 日志分割功能配置 innodb_print_all_deadlocks=1 把死锁信息打印到错误日志里 支持json 杀死执行超过2秒的查询语句 image.png image.png 线程池的作用大概就是等于一个交通警察指挥 --开启线程池 thread_handling=pool-of-threads thread_pool_max_threads=500 还要修改ulimit 文件 开启审计功能 install plugin server_audit soname 'server_audit.so' 半同步模式,主从都得配置 image.png -性能测试 sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=900000 --max-requests=10000 --num-threads=100 --mysql-host=ip --mysql-port= --mysql-user= --mysql-password= --mysql-db=test --mysql-socket=/xxx innodb=xtradb 数据库:磁盘和内存 mysql的瓶颈:慢查询、buffer_pool、磁盘 innodb_buffer_pool_size 内存70% sar: sar -u 1 3 cpu sar -p 1 3 每个cpu sar -q 负载 sar -r 内存 sar -W swap sar -b io sar -d 磁盘 sar -n DEV sar -n SOCK sar -n TCP UDP image.png 查询写操作频繁的表 image.png binlog_format 格式statement row mixed -------------------误删ibdata数据文件 -------------------update\delete忘记添加where --用替换.frm表结构文件的方式修改表 myisam 和 innodb的区别 image.png slow_query_log = 1 slow_query_log_file = mysql.slow long_query_time = 2 1、语句优化 避免子查询 配置文件优化: read_buffer_size 128k read_rnd_buffer_size 256k sort_buffer_size 256k thread_stack 256k join_buffer_size 256k max_connections 512-1000 innodb_buffer_pool_size 物理内存的60-70% innodb_log_buffer_size 16-64M 主从,一主多从,my-proxy主从,cluster主从 在从机上做备份, 1\冷备份
64GB的,innodb_buffer_pool_size 40GB [client] port = 3306 socket = /tmp/mysql.sock [mysqld] server-id = 22 port = 3306 user = mysql basedir = /usr/local/mysql datadir = /mysqldata/data tmpdir = /mysqldata/tmp socket = /tmp/mysql.sock skip-external-locking skip-name-resolve default-storage-engine = INNODB character-set-server = utf8 wait_timeout = 100 connect_timeout = 20 interactive_timeout = 100 back_log = 500 myisam_recover event_scheduler = ON image.png image.png image.png image.png image.png image.png
Linux系统性能监控工具:tsar 安装、配置、以及使用 介绍 tsar 是淘宝自己开发的一个监控工具,可用于收集和汇总系统信息,例如CPU,负载,IO和应用程序信息,例如nginx,HAProxy,Squid等。结果可以存储在本地磁盘或发送到Nagios。 tsar 可以通过自己开发模块轻松扩展,这使得它成为一个强大的监控工具。 总体架构 Tsar是基于模块化设计的程序,程序有两部分组成:框架和模块。 框架程序源代码主要在src目录,而模块源代码主要在modules目录中。 框架提供对配置文件的解析,模块的加载,命令行参数的解析,应用模块的接口对模块原始数据的解析与输出。 模块提供接口给框架调用。 tsar依赖与cron每分钟执行采集数据,因此它需要系统安装并启用crond,安装后,tsar每分钟会执行tsar –cron来定时采集信息,并且记录到原始日志文件。 安装 tsar 已上传至GitHub上,您可以克隆并安装,如下: cd tsar $ make make install 或者您可以下载zip文件并安装它: unzip tsar.zip make make install 安装后,您可能会看到这些文件: /etc/tsar/tsar.conf,这是tsar的主配置文件; /etc/cron.d/tsar,用于运行tsar每分钟收集信息; /etc/logrotate.d/tsar 将每个月轮流tsar的日志文件; /usr/local/tsar/modules 是所有模块库(* .so)所在的目录; 配置 定时任务配置:/etc/cron.d/tsar $cat /etc/cron.d/tsar cron tsar collect once per minute MAILTO="" root /usr/bin/tsar --cron > /dev/null 2>&1 默认情况下,安装后没有输出显示。只需运行tsar -l即可查看实时监控是否有效,例如: [kongjian@tsar]$ tsar -l -i 1 Time ---cpu-- ---mem-- ---tcp-- -----traffic---- --xvda-- -xvda1-- -xvda2-- -xvda3-- -xvda4-- -xvda5-- ---load- Time util util retran pktin pktout util util util util util util load1 11/04/13-14:09:10 0.20 11.57 0.00 9.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 11/04/13-14:09:11 0.20 11.57 0.00 4.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 通常,我们通过简单的编辑来配置tsar/etc/tsar/tsar.conf: 添加一个模块,添加一行 mod_<yourmodname> on 要启用或禁用模块,请使用 mod_<yourmodname> on/off 要指定模块的参数,请使用 mod_<yourmodname> on parameter output_stdio_mod 将模块输出设置为标准I / O output_file_path是设置历史数据文件,(你也应该修改logrotate脚本/etc/logrotate.d/tsar) output_interface指定tsar数据输出目标,默认情况下是本地文件。有关详细信息,请参阅高级部分。 用法 null:查看默认的mods历史数据, tsar --modname:指定要显示的模块, tsar --cpu -L / - 列表:列表可用moudule, tsar -L -l / - live:显示实时信息, tsar -l --cpu -i / - interval:报告的设置间隔, tsar -i 1 --cpu -s / - spec:指定模块详细信息字段, tsar --cpu -s sys,util -D / - 细节:不要将数据转换为K / M / G, tsar --mem -D -m / - merge:合并乘数为1, tsar --io -m -I / - item:显示spec项目数据, tsar --io -I sda -d / - date:指定数据,YYYYMMDD或n表示n天前 -C / - 检查:显示最后的收集数据 -h / - 帮助:显示帮助, tsar -h 在tsar的使用中,可以参考下面的帮助信息,完成对应的监控。 $tsar -h Usage: tsar [options] Options: -check 查看最后一次的采集数据 --check/-C 查看最后一次tsar的提醒信息,如:tsar --check / tsar --check --cpu --io --cron/-c 使用crond模式来进行tsar监控 --interval/-i 指明tsar的间隔时间,默认单位分钟,带上--live参数则单位是秒 --list/-L 列出启用的模块 --live/-l 查看实时数据 --file/-f 指定输入文件 --ndays/-n 指定过去的数据天数,默认1天 --date/-d 指定日期,YYYYMMDD或者n代表n天前 --detail/-D 能够指定查看主要字段还是模块的所有字段 --spec/-s 指定字段,tsar –cpu -s sys,util Modules Enabled: --cpu 列出cpu相关的监控计数 --mem 物理内存的使用情况 --swap 虚拟内存的使用情况 --tcp TCP 协议 IPV4的使用情况 --udp UDP 协议 IPV4的使用情况 --traffic 网络传出的使用情况 --io Linux IO的情况 --pcsw 进程和上下文切换 --partition 磁盘使用情况 --tcpx TCP 连接相关的数据参数 --load 系统负载情 tsar监控虚存和load情况 下图列出了对应的系统swap使用,load的使用情况。 $tsar --swap --load Time ---------------swap------------- -------------------load----------------- Time swpin swpout total util load1 load5 load15 runq plit 23/08/15-21:30 0.00 0.00 1.9G 0.00 1.32 1.37 1.38 2.00 12.4K 23/08/15-21:35 0.00 0.00 1.9G 0.00 1.20 1.29 1.34 21.00 12.4K 23/08/15-21:40 0.00 0.00 1.9G 0.00 1.28 1.25 1.31 2.00 12.4K 23/08/15-21:45 0.00 0.00 1.9G 0.00 1.44 1.26 1.29 3.00 12.4K 23/08/15-21:50 0.00 0.00 1.9G 0.00 1.54 1.30 1.29 3.00 12.4K 23/08/15-21:55 0.00 0.00 1.9G 0.00 0.94 1.36 1.34 4.00 12.4K 23/08/15-22:00 0.00 0.00 1.9G 0.00 1.10 1.32 1.33 4.00 12.5K tsar 内存使用情况 下图列出了系统内存的使用情况 $tsar --mem Time -----------------------mem---------------------- Time free used buff cach total util 23/08/15-21:25 2.1G 5.7G 0.00 164.0M 8.0G 71.44 23/08/15-21:30 2.1G 5.7G 0.00 181.4M 8.0G 71.43 23/08/15-21:35 2.1G 5.7G 0.00 213.9M 8.0G 71.42 23/08/15-21:40 2.1G 5.7G 0.00 233.8M 8.0G 71.43 23/08/15-21:45 1.4G 5.7G 0.00 924.6M 8.0G 71.43 23/08/15-21:50 1.4G 5.7G 0.00 889.4M 8.0G 71.42 tsar io使用情况 下图列出了使用tsar来监控系统IO情况 $tsar --io Time ------------------------------------------sda------------------------------------------- Time rrqms wrqms rs ws rsecs wsecs rqsize qusize await svctm util 23/08/15-21:25 0.28 3.4K 184.40 389.25 4.9K 15.0K 35.47 3.00 6.35 0.29 16.44 23/08/15-21:30 0.00 3.2K 109.71 382.74 2.5K 14.5K 35.27 3.00 7.33 0.30 14.68 23/08/15-21:35 0.15 3.1K 156.91 342.16 3.8K 13.8K 36.15 3.00 6.60 0.29 14.37 23/08/15-21:40 0.86 3.3K 234.00 371.43 6.9K 14.6K 36.43 3.00 5.93 0.28 16.83 23/08/15-21:45 0.72 3.4K 376.80 357.13 11.7K 14.8K 37.03 3.00 4.84 0.25 18.50 tsar 网络监控统计 $tsar --traffic Time ---------------------traffic-------------------- Time bytin bytout pktin pktout pkterr pktdrp 23/08/15-21:30 548.5K 353.4K 1.0K 1.2K 0.00 0.00 23/08/15-21:35 762.4K 440.4K 1.2K 1.4K 0.00 0.00 23/08/15-21:40 540.2K 344.0K 1.0K 1.1K 0.00 0.00 23/08/15-21:45 640.3K 365.0K 1.1K 1.2K 0.00 0.00 23/08/15-21:50 564.4K 364.1K 1.1K 1.2K 0.00 0.00 23/08/15-21:55 599.8K 327.6K 1.1K 1.1K 0.00 0.00 $tsar --tcp --udp -d 1 Time -------------------------------tcp------------------------------ ---------------udp-------------- Time active pasive iseg outseg EstRes AtmpFa CurrEs retran idgm odgm noport idmerr 23/08/15-00:05 0.79 1.52 1.6K 2.1K 0.00 0.03 3.4K 0.02 0.00 2.00 0.00 0.00 23/08/15-00:10 0.73 1.40 884.25 921.56 0.00 0.03 3.4K 0.01 0.00 3.00 0.00 0.00 23/08/15-00:15 0.77 1.46 959.62 1.0K 0.00 0.03 3.4K 0.01 0.00 3.00 0.00 0.00 23/08/15-00:20 0.69 1.43 1.0K 1.0K 0.00 0.03 3.4K 0.01 0.00 3.00 0.00 0.00 23/08/15-00:25 0.72 1.42 1.2K 1.1K 0.00 0.03 3.4K 0.00 0.00 3.00 0.00 0.00 tsar 检查告警信息 查看最后一次tsar的提醒信息,这里包括了系统的cpu,io的告警情况。 $tsar --check --cpu --io localhost.localdomain tsar cpu:user=25.0 cpu:sys=2.1 cpu:wait=0.1 cpu:hirq=0.0 cpu:sirq=0.2 cpu:util=27.4 io:sda:rrqms=0.0 io:sda:wrqms=4172.4 io:sda:rs=80.3 io:sda:ws=493.0 io:sda:rsecs=1664.0 io:sda:wsecs=18661.7 io:sda:rqsize=35.5 io:sda:qusize=4.0 io:sda:await=7.7 io:sda:svctm=0.3 io:sda:util=18.5 tsar 历史数据回溯 通过参数-d 2 可以查出两天前到现在的数据,-i 1 表示以每次1分钟作为采集显示。 $tsar -d 2 -i 1 Time ---cpu-- ---mem-- ---tcp-- -----traffic---- --sda--- ---load- Time util util retran bytin bytout util load1 22/08/15-00:02 ------ 71.40 0.03 754.2K 421.4K 14.38 1.59 22/08/15-00:03 34.55 71.41 0.01 773.7K 400.9K 13.39 1.42 22/08/15-00:04 31.80 71.41 0.03 708.6K 391.9K 12.88 1.54 22/08/15-00:05 28.70 71.40 0.00 544.5K 305.9K 11.32 1.68 22/08/15-00:06 25.83 71.41 0.02 521.1K 280.4K 13.32 1.48 22/08/15-00:07 25.68 71.42 0.00 495.0K 265.2K 12.08 1.21 22/08/15-00:08 30.89 71.41 0.01 811.0K 280.1K 14.92 0.92 22/08/15-00:09 23.83 71.41 0.03 636.7K 349.4K 11.81 1.47 高级 输出到Nagios 要打开它,只需output_interface file,nagios在主配置文件中设置输出类型。 您还应该指定Nagios的IP地址,端口和发送间隔,例如: The IP address or the hostname running the NSCA daemon server_addr nagios.server.com The port on which the daemon is listening - by default it is 5667 server_port 8086 The cycle (interval) of sending alerts to Nagios cycle_time 300 由于tsar使用Nagios的被动模式,因此您应该指定nsca二进制文件及其配置文件,例如: nsca client program send_nsca_cmd /usr/bin/send_nsca send_nsca_conf /home/a/conf/amon/send_nsca.conf 然后指定要检查的模块和字段。有4个阈值级别。 tsar mod alert config file threshold servicename.key;w-min;w-max;c-min;cmax; threshold cpu.util;50;60;70;80; 输出到MySQL 要使用此功能,只需output_interface file,db在tsar的配置文件中添加输出类型即可。 然后指定哪些模块将被启用: output_db_mod mod_cpu,mod_mem,mod_traffic,mod_load,mod_tcp,mod_udpmod_io 请注意,您应该设置tsar2db监听的IP地址(或主机名)和端口,例如: output_db_addr console2:56677 Tsar2db接收sql数据并将其刷新到MySQL。有关tsar2db的更多信息,请访问https://github.com/alibaba/tsar2db。 模块开发 tsar 容易扩展。无论何时您想要的信息尚未由tsar收集,您可以编写一个模块。 首先,安装tsardevel工具(make tsardevel将为您做这个): 然后运行tsardevel <yourmodname>,你会得到一个名为yourmodname的目录,例如: [kongjian@tsar]$ tsardevel test build:make install:make install uninstall:make uninstall [kongjian@tsar]$ ls test Makefile mod_test.c mod_test.conf 您可以根据需要修改test.c中的read_test_stats()和set_test_record()函数。然后运行make;make install安装您的模块并运行tsar --yourmodname以查看输出。
tomcat/conf/server.xml Connector port="8080" 改连接端口 <Server> <Service> <Engine> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> image.png tomcat <Host name="www.123.cn" appBase="/data/tomcatweb" unpackWARs="false" autoDeploy="true" xmlValidation="false" > <Context path="" docBase="/data/tomcatweb" debug="0" reloadable="true" crossContext="true"> </Host> tomcat加入访问日志 image.png context.xml配置连接mysql image.png image.png
mysqladmin -uroot -pxx password xxx mysql -uroot -p -h127.0.0.1 -P3306 show databases; show tables; desc db; show create table db; select user(); select database(); create database ss; show variables; grant all on db1.* to user1 identified by '12222'; --备份与恢复 mysqldump -uroot p'123456' mysql>a.sql mysql -uroot -pxxx mysql<a.sql pure-ftpd
nginx常用配置 image.png image.png image.png include vhost/*.conf 用户认证 location / { auth_basic "Auth" auth_basic_user_file /usr/local/nginx/conf/htpasswd } server { listen 80; server_name test.com test.com2; index index.html index.jsp; root /data/ddd if (http://www.123.com/$1 permanent; } } permanent = [R=301] redirect = [R=302] access_log /tmp/aa.log combinated_realip; kill -HUP cat $nginx_pid location ~ .*.(gif|jpg|jpeg|png|bmp|swf){ expires 12h; access_log off; } nginx 图片防盗链 location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)invalid_referer){ return 403; } access_log off; } location /data/{ allow 192.168.1.1; allow 172.12.0.0; deny all; } if ($http_user_agent ~ 'Spider/Tomato'){ return 403; } image.png proxy_pass http://xx; proxy_set_header Host remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forward_for; upstream aa{ ip_hash; server 33:33; server xx:ss; } server { ssl on; ssl_certificate xx.crt; ssl_certificate_key xx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }
apache 虚拟主机配置 <VirtualHost *:80> ServerAdmin xx@qq.com DocumentRoot "/data/aaa" ServerName www.aa.com ServerAlias www.b.com ErrorLog "logs/aming.com-errr.com" CustomLog "logs/axxx" common </VirtualHost> <VirtualHost *:80> DocumentRoot "/data/www/www.123.com" ServerName www.123.com </VirtualHost> <VirtualHost *:80> DocumentRoot "/data/wwwroot/www.123.com" ServerName www.123.com <Directory /data/wwwroot/www.123.com> AllowOverride AuthConfig AuthName "123 user auth" AuthType Basic AuthUserFile /data/.htpasswd require valid-user </Directory> </VirtualHost> apachectl -t apachectl graceful image.png 针对文件做限制 FilesMatch image.png apache实现跳转 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} !^www.123.comhttp://www.123.com/$1 [R=301,L] image.png apache查看是否加载模块 apachectl -M|grep -i rewrite apachectl graceful LogFormat image.png 设置不记录图片等日志 image.png 设置缓存过期时间 ExpiresActive on ExpiresByType image/gif "access plus 1 days" IfModule mod_expires.c image.png 配置防盗链 image.png 访问限制 <Directory> Order deny,allow Deny from all Allow from 127.0.0.1 <Directory /ss> <Filesmatch "admin.*"> Order deny,allow Deny from all Allow from 127.0.0.1 </Filesmatch> <Directory> 防止CC攻击和爬虫 image.png
关机指令 image.png image.png cat -A file 显示所有的内容 chgrp groupa dir chgrp -R groupa dir chmod ugoa umask chattr c 自动压缩 解压 image.png lsattr image.png image.png ln -s 来源文件 目标文件 /etc/passwd /etc/shadow 自定义的UID和GID都是1000开始 useradd -u g -d -M 不要目录 -s shell /sbin/nologin 创建密码的命令 yum install -y expect image.png su - 切换到家目录 image.png du -sh . du -ch . image.png mkfs image.png mount 参数指令 image.png mount -t -o 压缩 image.png xr -d xr -z tar -czvf a.tar --exclude a b' tar -xzvf a.tar tar -cjvf a.tar.bz2 a b tar -xjvf a.tar.bz2 zip unzip rpm -ivh xxx --force --nodeps rpm -Uvh rpm -e rpm -qa rpm -qi rpm -qf !用法 image.png cut -d ':' -f 1 cut -c1-10 sort -n sort -nr sort -u 去除重复 sort -k2,3 sort -k 2 uniq tee tr '' '/n' ; || && grep image.png image.png image.png image.png sed -n '2'p /etc/xx 打印 sed -n '2,5'p /etc/ss sed -n '/root/'p xx sed -e '/root/'p -e '/ss/'p -n file sed -i '1'd tst sed '1,3s/x/y/g' xx 调换字符串的位置 image.png awk -F ':' '/root/{print 3}' file awk -F ":" '3>300' /etc/s image.png awk '{pint NF}' awk '{pr-int $NF}' awk '{print NR}' 统计总和 image.png date date +"%Y-%m-%d %H:%M:%S" image.png date -d "-1 day" +%d date -d "-1 hour" +%H date -d "-1 min" +%M 数学计算要用[] sum=a+[b] sum=1+$2] if xx;then esle xx fi if xx;then xx elif xx else xx fi if [ a -gt 5 ] || [ $a -ne ] if [ -e xx ];then xx fi -d -f -w -x case 变量 in value1) xx ;; *) ;; esac for i in seq 1 5;do xx done for file in ls;do xx done while :;do xxx done 死循环 function a(){ xx } a() vmstat :proc: r,b memory:swpd,free,buff,cache swap:si,so io bi,bo system cpu :us,sy,id,wa,st top yum install -y sysstat sar -n DEV 查看网卡流量 yum install -y nload 查看网卡流量 free -m ps aux image.png tcpdump -i eth1 tcpdump -i ehn1 -n port 22 -n port 22 and port 33 hostnamectl set-hostname xx 临时和文件 zone:drop block public external dmz work home internal trusted image.png f firewall-cmd --zone=public --add-service=http image.png rsync -av xx xxx --delete --exclude rsync密钥文件600 image.png
一.前言 在企业中运维工作人员通常需要同时管理几十台甚至几百台主机(虚拟机),如果需要批量修改设置或者做更新操作的话,即便是事先编写好脚本,一台一台的去运行脚本也是非常耗时的,效率也十分低下。所以这时候我们需要可以在一台主机上,同时操作、控制多台其他主机的运维工具。 目前主流的工具很多,基本可以分为两类 1、agent:需要事先在被管控主机上安装一个小的程序,用于接受和控制远端主机,代表软件有puppet、func。这类软件运行起来比较安全,但是需要提前部署代理程序,当主机很多的时候会比较麻烦 2、agentless:不需要代理程序,而是直接使用ssh协议连接、控制被管控主机,后者只需要开启SSH服务就可以了,代表软件有farbic,ansible。这种软件比较方便,但是不太安全,毕竟要远程使用管理员账户登录,所以通常管控主机要使用有sudo权限的普通账户进行操作。 ======================================================= 二.ansible的一些基础****概念 ansible的公司成立于2012年,目前已经被红帽以1.5亿美元的价格收购了。虽然ansible作为一款开源软件面世的时间不长,但是却十分好用,它既兼具了puppet的一部分功能,也有fabric的部分功能,而且,只要有SS协议,它就可以工作,非常的轻量化,但是正因为基于SSH工作,所以它无法同时处理过多的主机,一般用在千台以下的环境。 ansible有以下一些特性: 1、模块化,ansible本身非常轻量,通过调用特定的模块来完成不同的任务 2、基于Python语言实现,由Paramiko,PyYAML和jinja2三个关键模块实现。 3、部署简单、agentless 4、主从模式工作 5、支持自定义模块 6、支持playbook,批量执行一串任务 <wbr>而且ansible还要有幂等性:即同样的命令重复执行多次,不会出现问题。 ansible包含以下几个模块: 1、ansible core: ansible自己的核心 2、host inventory: 被管控主机列表,只要将能通信的主机列在这个文件里,ansible就可以管控 3、connection plugins:链接插件,用于与每一个被管控主机建立会话并发送控制指令 4、modules:包含两类模块:core modules 核心模块;custom modules 自定义模块。 5、playbooks: 设定一个流程化脚本,让多个ansible任务按顺序执行。 ansible可以通过yum自动安装,但是它在epel源中。 ansible的主配置文件是 /etc/ansible/ansible.cfg Host inventory : /etc/ansible/hosts <wbr> <wbr> <wbr>用于定义被管控的主机列表,它的格式是这样的 这个文件使用的是INI风格的,可以直接写主机名,IP地址;也可以设置一个组,向组中加入多个主机,并且一个主机还可以同时属于不同的组;还可以在域名中直接调用组里的主机名。不过通常可以不用写的那么复杂。 ======================================================= 三.ansible的常用命令 ansible-doc -l : 列出常用的模块文档列表。ansible支持超多的模块,可以使用这个命令找到自己想要使用的对应模块。 ansible-doc -s 模块名称: 查看某一个模块支持的具体参数 <wbr> 示例: ansible-doc -s ping:查看ping命令的详细帮助 接下来写一些常用模块,在这之前先做一些准备工作 1、我的/etc/ansible/hosts配置是这样的 ansible常用技巧 2.由于ansible是基于ssh管理被管控主机,所以需要配置ssh基于秘钥认证进行连接,否则每次发送一个管控命令都会提示输入ssh的用户密码。 ssh-keygen -t rsa -P '' <wbr> ssh-copy-id -i .ssh/id_rsa.pub root@172.16.26.1 由于有7被管控个主机,同样的命令要敲7次,本来想弄个脚本解决,但是由于传送秘钥的时候需要交互输入对端用户密码,我不会解决这个问题,所以就没做 <wbr>- - # ..... <wbr> <wbr> command模块:对被管控主机做一些操作命令,并将各主机上的结果输出回ansible主机上。 示例:ansible all -m command -a ‘ifconfig ’ ansible常用技巧 注:all的含义是:操作对象为所有hosts文件中的主机和组,-m的含义是调用模块,而command是默认模块,如果不添加-m选项的话默认就为command,而且command只支持一些简单的命令,不支持管道符,如果想用管道符,要使用shell模块 user模块:可以快速在被管控主机上批量添加用户 示例:ansible all -m user -a 'name=ly state=present' <wbr> 常用参数: state=present <wbr> : 创建用户 home= <wbr> <wbr> :来指定用户家目录路径; system=true <wbr> :创建系统用户 uid= ** <wbr>:** 来指定用户uid shell= <wbr> <wbr> <wbr> :指定用户的默认shell ansible常用技巧 如果执行成功如上图,其中changed为被控主机确实发生了更改,即,之前没有该用户,现在已经创建。如果同样的命令再执行一次会怎么样? ansible常用技巧 虽然当前执行结果也成功了,但是两台被控主机并未发生任何变化,即,他们之前就已经存在了ly用户 删除用户: ansible all -m user -a 'name=ly state=absent remove=true' state=absent : 删除用户 remove=true : 删除用户家目录! group模块 和user类似,用于创建系统组 示例:ansible all -m group -a ‘name=go state=present gid=5001 system=true’ system=true <wbr>: <wbr> 创建一个系统组 如果要删除该组,只需要将state=present改成absent就可以了 cron模块 为被管控主机在crontab -e列表中添加计划任务 示例:ansible all -m cron -a “minute='/5' job='/usr/sbin/ntpdate 172.16.0.1 &> /dev/null' name='sync time' state='present'"* 为所有被管控主机添加一条计划任务,每5分钟向172.16.0.1同步一次系统时间 name= <wbr> <wbr> <wbr> <wbr> :表示工作名称 job= <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> :表示具体运行什么命令 hour=* <wbr> <wbr> <wbr> <wbr> <wbr>: 每小时 day=* <wbr> <wbr> <wbr>: <wbr> 每天 month=3 <wbr> <wbr>: 3月 weekday=3 <wbr> : 周三 ansible常用技巧 file模块 为被管控主机创建新文件 示例:ansible all -m file -a 'path=/tmp/test.txt state=touch owner=user1 mode=600' 在/tmp下创建一个叫test.txt的普通文件,属主为user1,权限为600 mode= <wbr> <wbr> <wbr> : 文件权限 group= <wbr> <wbr> <wbr>: 文件属组 state=touch:创建普通文件 state=directory: 创建目录 state=link <wbr> :创建一个软连接,还要使用src=/etc/passwd参数来指定源文件。 state=hard <wbr>: 创建一个硬链接,和上面一样也要使用src参数 state=absent:删除文件 yum模块 为被管控主机用yum安装软件 示例:ansible all -m yum -a 'name=httpd state=present' 为所有管控主机安装httpd,各管控主机默认从自己的base源中进行安装 state=latest <wbr> <wbr> : 为某个包做更新操作 enablerepo= <wbr> <wbr> :启动某个仓库源 disablerepo= <wbr> <wbr> :禁用某个仓库源 copy模块 为被管控主机执行复制操作 示例:ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab owner=ly group=ly mode=600' 让所有被管控主机复制管控主机的/etc/fstab文件到被管控主机的/tmp/fstab,属主属组为ly,权限为600 content=123 <wbr> :将‘123’复制到dest=字段指定的文件中,会覆盖目标文件的所有内容,基本就是远程输出重定向的意思。而且和src=参数不能一起用。 service 可以管理被管控主机上的各种服务程序,从简单的开启和关闭,到 在不同级别下是否开机自动启动等都可以操作 示例:ansbile all -m service -a 'name=httpd state=started ' <wbr> ansible常用技巧 这个主机启动失败的原因是80端口被占用了,我在上面跑着haproxy 另一个示例 ansible all -m service -a 'name=httpd runlevel=5 enabled=true' ansible常用技巧 在级别5下,自动启动httpd服务 script 这个模块非常有用,可以把本地的脚本在各被管控主机上跑一遍,我可以现在本地主机的/root目录下建立一个脚本123.sh,然后运行: ansible <wbr>all -m script -a '/root/123.sh' ansible常用技巧 shell : <wbr> 直接在被管控主机上启动一个子shell进程来运行命令,可以支持绝大多数的shell命令,包括管道符 ansible all -m shell -a "echo $RANDOM | tr <wbr>'0-9' 'a-z' > /root/123" ansible常用技巧 其实上面大多数操作都可以直接使用shell完成,不过用shell返回的信息并不太详细。 ======================================================= 四.ansible的playbook 虽然ansible可以同时操作很多个主机,但是如果有些命令可以批量执行,而不用一条一条的打的话其实会更加理想,而ansible的playbook就提供了这样的功能,它其实也是一种类型的脚本,核心元素有这几个: 1、Tasks <wbr>: 任务 2、varibales :变量 3、Templates:模板 4、Handlers:触发器 5、Roles:规则 而它的代码组织格式为YAML,它是一种编程语言,诞生于2001年,类似于xml这种半结构化语句,但是它并不需要那么多标签,所以很适合用于配置。 playbook的基本格式: hosts:172.16.26.1 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># <wbr>指定要操作的主机 <wbr> <wbr> <wbr> <wbr>vars : <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># <wbr>指定变量 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> var1: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> var2: <wbr> <wbr> <wbr> <wbr>tasks: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> # <wbr>指定任务 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> - name: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># <wbr>指定任务名字 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> shell : <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> # 具体的操作命令 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> - name: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> command <wbr>: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr>handlers: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr>- name : <wbr> <wbr> <wbr> <wbr>remote_user: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># 在被管控主机上执行这些任务的用户,也可以使用sudo host:172.16.26.2 host:172.16.26.3 举个栗子 ansible常用技巧 -name 后是自定义的名字,用来标识不同的任务。 定义好playbook后,使用ansible-playbook 123.yml 来启动 ansible常用技巧 ansible会先获取主机上的FACTS变量。然后开始一项一项的执行定义好的任务。OK则说明 ansible常用技巧 其中OK则代表有三项任务执行成功,但是没发生任何改变; changed则也表示成功,但是被管控主机做出了变化,比如本来没有httpd,通过剧本安装了httpd,状态就会发生改变,则为changed。 failed=1 就是某个task执行失败了,这里失败的原因是我的playbook中的命令写错了 - -# 。 上面的playbook中只有一个hosts字段,我们也可以设置多个hosts,分别设置不同的任务,如果一台主机在多个hosts字段中都存在,会按hosts字段的顺序执行,即最后task中做的设置会生效。 刚才的playbook中只是最基本的一些设置,其实还有一个重要的元素是变量,playbook中的变量和其他语言中的变量类似,只能使用字母、数字和下划线组成,并仅能以字母开头。 ansible中包含以下几种变量: 1、facts变量 2、自定义变量 3、主机变量 4、组变量 5、一些启动参数 什么是facts变量呢? facts简单来说就是由被管控主机返回来的自身的一些属性信息,比如ip地址,系统版本,硬件信息等,他们被存在ansible的facts变量中,可以使用 ansbile all -m setup 命令来手动查看facts变量 ansible常用技巧 facts是系统变量,不需要声明就可以直接调用,如果要使用自定义变量的话,需要提前声明,声明有两种方法,命令行和roles: 可以用playbook命令时,使用参数的方式来来声明,比如 ansible-playbook 123.yml --extra-vars "host=www user=ly" 这就声明了两个变量:host与user roles的话,下小节再说吧。 主机变量:定义在host inventory中(就是/etc/ansible/hosts) 中的主机之后的变量, 组变量:定义在host inventory中(就是/etc/ansible/hosts) 中的组后面的变量 启动参数:也是定义在定义在host inventory中(就是/etc/ansible/hosts) 中的主机之后的,但是并不是自定义的变量,更像一些参数。 ansible常用技巧 其中NUM是我自己定义的变量,后边三个则是ansible内置的一些参数 ansible_ssh_user=root <wbr> <wbr> <wbr> <wbr> <wbr> # 用于连接ssh的账户 ansible_ssh_pass= <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># <wbr> <wbr>连接ssh时使用的密码,如果事先没有设置秘钥认证,这个选项就很必要! ansible_ssh_port= <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> # 有些主机更改了ssh监听的端口,这个选项就很有用。 如何在playbook中定义并使用变量? ansible常用技巧 只需要加入vars字段,并在下面直接声明就可以了;调用的时候要加双大括号 这时候又有一个问题:如果我在命令行中传递了一样的变量username,和playbook中的变量冲突了,哪个生效?肯定是命令行中定义的变量生效,命令行定义的值会覆盖playbook中写死的变量值。 playbook中除了变量以外,还可以添加条件变量,在某task后面添加when子句即可实现条件测试功能;when语句支持jinja2语法; ansible常用技巧 ansible_os_family : 内置变量,保存了呗管控主机的系统类型。 当被管控主机是Debian时,才执行install web package这个tasks。 ansible常用技巧 skipping表示任务直接跳过了,没有执行,因为我的c6组中的主机都是CentOS 6。 ansible中还有一种迭代变量,用起来也十分简单: ansible常用技巧 httpd、php、php-mysql会按顺序轮流替换上方的item变量进行安装。 handlers:类似一个触发器,可以监控在某一个tasks中的name字段上,一旦这个name在执行发生了改变,即标注了change,则就会触发handlers,并执行handlers中定义的命令。 ansible常用技巧 notify字段类似一个监控器,可以监控某个任务,一旦该任务状态为change,则触发handlers,注意notify后的名字一定要和handlers的名字对应上,然后执行handlers里预先定义的任务,图中为重启httpd服务。 图中的大体含义是:首先安装httpd,然后复制管控主机上的定制好的配置文件到所有被管控主机上,如果复制配置文件这一步为changed,就会触发handlers,即重启httpd服务让复制过去的配置文件生效。然后无论是否触发了handler,都要尝试启动httpd服务。 这样设置的好处就在于,只有修改了配置文件的主机才会重启httpd服务,而不会影响到其他未发生变化的主机。 templates <wbr> 刚才我们有一步复制了一个本地已经定义好的配置文件到被管控主机上作为被管控主机上的,但是如果被管控主机各自需要的配置不相同怎么办?比如说,4台被管控主机都是httpd服务器,但是需要监听的端口不一样,我们如果把本地的配置文件复制给它们,那它们的配置文件都一样,势必监听的端口也都一样,这时要如何处理?这时候就可以使用templates功能。 templates使用jinja2风格的语法,我们可以先在/etc/ansible/hosts上为不同的主机各自定义不同的变量,比如: ansible常用技巧 然后修改本地/root/httpd.conf的listen字段,并给他改名为?/root/httpd.conf.j2,把它做成一个真正的模板文件。 ansible常用技巧 接下来再修改b.yml,把copy任务换成template字段,把源改为/root/httpd.conf.j2 ansible常用技巧 接下来运行ansible-playbook b.yml, 每个主机会自动用httpd.conf.j2这个模板文件生成自己的配置文件,并用自己的port变量替换掉模板中的{{ port }}字段。 ansible常用技巧 这里172.16.26.104这台主机失败了,是由于我之前并没有为它配置port变量导致的。另外3个则配置成功了。让我们看一下另外三台主机监听的端口。 ansible常用技巧 ansible常用技巧 ansible常用技巧 和我们刚才设定的变量值一模一样,我们也可以使用更多的变量来替换模板中的固定内容,让同一批被管控主机可以分别拥有自己的个性化配置。 ======================================================= 五.roles <wbr> roles可以把一个完整playbook中的元素分拆,以层级结构分别放到磁盘中特定的位置保存起来,然后可以让不同的hosts灵活的调用这些被分拆的元素代码,重新组合成一个新的临时playbook来运行。 我们可以在/etc/ansible/roles目录下建立多个不同的目录,给它们取上不同的名字,每个roles目录下可以以文件的方式存放不同的元素(tasks,variables,handlers等),然后在playbook中直接调用roles目录的名字,就可以自动执行roles目录下的所有元素。roles目录类似于一个存放在磁盘上的函数,里面包含了很多元素,需要使用的时候,直接调用roles目录的目录名就可以运行目录下的所有元素。 比如,我们在/etc/ansible/roles目录下建立一个目录,叫test,然后在test目录下建立多个子目录:files/, tasks/,handlers,vars,meta。 files/:此roles下用到的所有文件均可放置于此目录中 templates/: jinja2模板文件存放位置 tasks/:任务列表文件; 可以有多个文件,但至少有一个叫做main.yml的文件。 vars/:变量字典文件,用于自定义多个变量,上小节说的通过role传递变量就是指这里; <wbr>可以有多个文件,但至少有一个叫做main.yml的文件。 handlers/ : 处理器列表文件; <wbr>可以有多个文件,但至少有一个叫做main.yml的文件。 meta/ : 此roles的特殊设定及依赖关系等 我们可以现在/etc/ansible/roles下创建几个目录: mkdir testrole/{meta,files,templates,tasks,vars,handlers} <wbr> <wbr> #这些目录并非都是必须的 如果我们需要定义变量的话,可以在vars目录下创建一个main.yml的文件,然后进行定义 ansible常用技巧 定义两个变量,user=ly <wbr>group=ly 然后在tasks目录下创建main.yml来定义任务列表。 ansible常用技巧 图例的配置和刚才的b.yml剧本几乎一样,但是注意在roles中,handler不能再和tasks放在一起了,要单独定义在handlers目录中;而且template处指定的源是一个相对路径,相对路径就是roels/testrole/templates这个目录中,所以我们把所有的j2配置模板放在这里就好。 我们在handlers目录中建立一个文件main.yml ansible常用技巧 注意这里的name还是要和notify监控字段指定的名字要一样,否则当我们有多个handler的时候,notify不知道我们要激活哪一个handler。 然后把之前的/root/httpd.conf.j2复制到roles/testrole/templates目录下,然后修改一下这个j2模板文件,让他们能利用上我们之前在vars/main.yml中定义的两个变量: ansible常用技巧 现在一个role就设置完毕了,我们如果想要调用这个role,需要在/etc/ansible下创建一个playbook文件 ansible常用技巧 testrole是我们之前在roles目录下创建的那个子目录名字,调用这个目录名字,就可以调用这个目录下所有我们刚才定义好的元素。 注意:如果确定要调用roles话,playbook文件尽量放在/etc/ansible目录下,否则容易出现一些小问题。 然后运行我们刚刚创建好的脚本文件 ansible常用技巧 运行基本没有问题。 注意,roles下的层级结构一定要遵循规范,否则无法成功调用 ansible常用技巧 tags:标签 有的role中可能有很多个task任务,如果我们只想运行role中的某一个task,而不想所有task都运行一遍怎么办? 可以给task加上不同的标签,用来标识不同的task,然后我们在运行playbook的时候,可以用-t 选项指定标签,来运行我们指定的任务,而不是所有role中的任务全都跑一遍。比如,修改testrole/tasks/main.yml ansible常用技巧 给修改配置文件的步骤添加一个标签,然后运行 ansible-playbook -t conf abc.yml ansible常用技巧 此时只会运行role中的其中一个task,而不会所有的task全跑一遍。 ======================================================= 六.总结 1、ansible安装包在epel源中,如果想通过yum安装,需要配置好epel源 2、ansible装好后需要先配置被管控主机列表/etc/ansible/hosts;而且最好先把管控主机的秘钥传给所有被管控主机 3、除了shell模块以外,大多数的模块最基本的格式都是name=XX state=present|absent <wbr> 4、playbook和roles用法很类似,只不过roles要分散设置各各不同的元素。而且同一个playbook可以调用多个roles,所以当很多tasks等元素需要大量复用时可以考虑roles
sed -i '88 r b.file' a.file 在a.file的88行插入b.file awk '1;NR==88{system("cat b.file")}' a.file > a.file awk查找 awk '/neon-0.29.6.tar.gz/{print $1}' a.sh sed -i '/regex/ r b.txt' a.txt # regex是正则表达式 awk '/target/{system("cat b.file")}' a.file > c.file awd调用系统命令 awk 'NR==2{system("cat anaconda-ks.cfg")}' a.sh sed插入文件 " r a.txt" sed追加 sed -i "/aaa/a\bbbb" file 前面 sed -i "/aaa/i\bbb" file sed -n "/a/,/b/" file
copy src dest content backup follow 如果有Link文件,拷贝过去的也会是link force group owner mode 把/srv/myfiles/foo.conf文件拷贝到远程节点/etc/foo.conf,并且它的拥有者是foo,拥有它的群组是foo,权限是0644 copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644 跟上面的案例一样,不一样的只是权限的写法 copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u=rw,g=r,o=r" 另外一个权限的写法 copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u+rw,g-wx,o-rwx" 拷贝/mine/ntp.conf到远程节点/etc/ntp.conf,并且备份远程节点的/etc/ntp.conf。 copy: src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes 作者:OceanBreaker 来源:CSDN 原文:https://blog.csdn.net/modoo_junko/article/details/45080415 版权声明:本文为博主原创文章,转载请附上博文链接!
一、概述 file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。 二、常用参数 path参数 :必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以。 state参数 :此参数非常灵活,其对应的值需要根据情况设定。比如,我们想要在远程主机上创建/testdir/a/b目录,那么则需要设置path=/testdir/a/b,但是,我们无法从”/testdir/a/b“这个路径看出b是一个文件还是一个目录,ansible也同样无法单单从一个字符串就知道你要创建文件还是目录,所以,我们需要通过state参数进行说明。当我们想要创建的/testdir/a/b是一个目录时,需要将state的值设置为directory,”directory”为目录之意,当它与path结合,ansible就能知道我们要操作的目标是一个目录。同理,当我们想要操作的/testdir/a/b是一个文件时,则需要将state的值设置为touch。当我们想要创建软链接文件时,需将state设置为link。想要创建硬链接文件时,需要将state设置为hard。当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absent,”absent”为缺席之意,当我们想让操作的目标”缺席”时,就表示我们想要删除目标。 src参数 :当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。 force参数 : 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。不过强制创建链接文件分为三种情况。情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。 owner参数 :用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。 group参数 :用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。 mode参数:用于指定被操作文件的权限,比如,如果想要将文件权限设置为”rw-r-x---“,则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的。如果想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700。 recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。 三、示例 1.在 ansible-demo3 主机上创建一个名为 testfile1 的文件,如果 testfile1 文件已经存在,则会更新文件的时间戳,与 touch 命令的作用相同。 [root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testfile1 state=touch" ansible-demo3 | SUCCESS => { "changed": true, "dest": "/testdir/testfile1", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "secontext": "unconfined_u:object_r:default_t:s0", "size": 8, "state": "file", "uid": 0 } 1 2 3 4 5 6 7 8 9 10 11 12 13 2.在 ansible-demo3 主机上创建一个名为 /testdir/testdir 的目录,如果 /testdir/testdir 目录已经存在,则不进行任何操作。 [root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testdir state=directory" ansible-demo3 | SUCCESS => { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/testdir/testdir", "secontext": "unconfined_u:object_r:default_t:s0", "size": 6, "state": "directory", "uid": 0 } 1 2 3 4 5 6 7 8 9 10 11 12 13 3.在 ansible-demo3 上为 testfile1 文件创建软链接文件,软链接名为 linkfile1,执行下面命令的时候,testfile1 已经存在。 [root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/linkfile1 state=link src=/testdir/testfile1" ansible-demo3 | SUCCESS => { "changed": true, "dest": "/testdir/linkfile1", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "secontext": "unconfined_u:object_r:default_t:s0", "size": 18, "src": "/testdir/testfile1", "state": "link", "uid": 0 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 4.在 ansible-demo3 上为 testfile2 文件创建硬链接文件,硬链接名为 hardfile2,执行下面命令的时候,testfile2 已经存在。 [root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/hardfile2 state=hard src=/testdir/testfile2" ansible-demo3 | SUCCESS => { "changed": true, "dest": "/testdir/hardfile2", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "secontext": "unconfined_u:object_r:default_t:s0", "size": 0, "src": "/testdir/testfile2", "state": "hard", "uid": 0 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5.在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述 force 参数的解释。 [root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/linkfile3 state=link src=/testdir/sourcefile force=yes" ansible-demo3 | SUCCESS => { "changed": true, "dest": "/testdir/linkfile3", "src": "/testdir/sourcefile", "state": "absent" } 1 2 3 4 5 6 7 返回的 state 为 absent,表示源文件不存在。 6.删除远程机器上的指定文件或目录。 [root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testdir state=absent" ansible-demo3 | SUCCESS => { "changed": true, "path": "/testdir/testdir", "state": "absent" } 1 2 3 4 5 6 7.在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。 ansible ansible-demo3 -m file -a "path=/testdir/abc state=touch owner=ding" ansible ansible-demo3 -m file -a "path=/testdir/abc owner=ding" ansible ansible-demo3 -m file -a "path=/testdir/abc state=directory owner=ding" 1 2 3 8.在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组。 ansible ansible-demo3 -m file -a "path=/testdir/abb state=touch group=ding" ansible ansible-demo3 -m file -a "path=/testdir/abb group=ding" ansible ansible-demo3 -m file -a "path=/testdir/abb state=directory group=ding" 1 2 3 9.在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限。 ansible ansible-demo3 -m file -a "path=/testdir/abb state=touch mode=0644" ansible ansible-demo3 -m file -a "path=/testdir/abb mode=0644" ansible ansible-demo3 -m file -a "path=/testdir/binfile mode=4700" ansible ansible-demo3 -m file -a "path=/testdir/abb state=directory mode=0644" 1 2 3 4 10.当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为ding。 ansible ansible-demo3 -m file -a "path=/testdir/abd state=directory owner=ding group=ding recurse=yes" 1 四、总结 本节介绍了 Ansible 常用模块之 file 模块,并举例说明如何使用,下节我们介绍 blockinfile 模块。 这里的命令常用参数介绍及示例,主要摘抄自下面文档内容,有部分改动,在这里对原作者深表感谢! 作者:dylloveyou 来源:CSDN 原文:https://blog.csdn.net/dylloveyou/article/details/80560226 版权声明:本文为博主原创文章,转载请附上博文链接!
grep -C 5 foo file 前后 grep -B 5 foo file before grep -A 5 foo file after
yum -y install squid vi /etc/squid/squid.conf http_port 3128 cache_mem 64 MB maximum_object_size 4 MB cache_dir ufs /var/spool/squid 100 16 256 access_log /var/log/squid/access.log acl localnet src 10.0.0.0/8 http_access allow localnet http_access deny all service squid start 客户端配置 Proxy配置 yum設置代理 vim /etc/yum.conf 1 添加: proxy=http://[proxy-ip]:[port]/ apt設置代理 gedit /etc/apt/apt.conf 1 添加: Acquire::http::proxy “http://user:pwd@proxy.xxx:8080/“; Acquire::https::proxy “https://user:pwd@proxy.xxx:8080/“; Acquire::ftp::Proxy “ftp://username:password@proxyhost:port/“; wget設置代理 vim /etc/wgetrc 1 添加: http_proxy = http://[proxy-ip]:[port]/ ftp_proxy = http://[proxy-ip]:[port]/ rpm設置代理 vim /etc/profile 1 添加: export http_proxy=http://[proxy-ip]:[port]/ export ftp_proxy=http://[proxy-ip]:[port]/ -- echo "export http_proxy=http://ip:port" >> /etc/profile echo "export https_proxy=http://ip:port" >> /etc/profile source /etc/profile