运维知识体系

运维知识体系

运维知识体系总结,持续更新,欢迎转载。
缓存知识体系

缓存知识体系

运维知识体系之缓存,分层多级缓存体系。
DevOps学院

DevOps学院

中国新一代IT在线教育平台
我买云

我买云

企业级开源运维解决方案

Tomcat 开启JMX监控

运维监控赵班长 发表了文章 • 0 个评论 • 191 次浏览 • 2018-12-20 15:05 • 来自相关话题

 如果需要使用Zabbix Java Gateway监控JMX,需要先打开JMX监控接口。   1.Tomcat部署可以在http://tomcat.apache.org/官网上下载对应的版本。这里在linux-node2这个实验节点上 ...查看全部
 如果需要使用Zabbix Java Gateway监控JMX,需要先打开JMX监控接口。
 
1.Tomcat部署可以在http://tomcat.apache.org/官网上下载对应的版本。这里在linux-node2这个实验节点上,使用Tomcat8做实验。 
 
安装JDK1.8和Tomcat-8.5.20 
[root@linux-node2 ~]# yum install -y java-1.8.0
[root@linux-node2 ~]# cd /usr/local/src
# wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.20/bin/apache-tomcat-8.5.20.tar.gz
[root@linux-node2 src]# tar zxf apache-tomcat-8.5.20.tar.gz
[root@linux-node2 src]# mv apache-tomcat-8.5.20 /usr/local/
[root@linux-node2 src]# ln -s /usr/local/apache-tomcat-8.5.20/ /usr/local/tomcat

2.Tomcat开启JMX监控
JMX监控设置有三种类型:
  • 无验证的JMX监控
  • 用户名密码认证
  • SSL加密

 
[root@linux-node2 ~]# vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.56.12"
参数行中的com.sun.management.jmxremote.port参数是tomcat JMX监听的端口,可以随意配置,但是不可已经被占用;java.rmi.server.hostname参数的IP地址为远程Linux服务器的IP地址。

 
3.启动Tomcat
[root@linux-node2 ~]# /usr/local/tomcat/bin/startup.sh 
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@linux-node2 ~]# netstat -ntlp | grep 8888
tcp6 0 0 :::8888 :::* LISTEN 6154/java



LNMP(Linux+Nginx+PHP+MySQL)生产源码部署实战

Web服务器赵班长 发表了文章 • 0 个评论 • 227 次浏览 • 2019-01-04 15:08 • 来自相关话题

       日常工作中,部署Nginx+PHP是非常普通的一个场景,如果有一个最佳实践,每次可以直接复制粘贴就好了。本文正是完全生产实践的方式。Nginx和PHP均推荐使用源码安装,MySQL推荐直接使用官方提供编译好的二进制文件,性能是最佳的, ...查看全部
 
     日常工作中,部署Nginx+PHP是非常普通的一个场景,如果有一个最佳实践,每次可以直接复制粘贴就好了。本文正是完全生产实践的方式。Nginx和PHP均推荐使用源码安装,MySQL推荐直接使用官方提供编译好的二进制文件,性能是最佳的,除非你可以非常专业的进行MySQL编译的定制。
 
1.源码安装Nginx
依赖软件包安装。
[root@linux-node1 ~]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm 
[root@linux-node1 ~]# yum install -y gcc glibc gcc-c++ pcre-devel openssl-devel
创建www用户,用于启动Nginx
[root@linux-node1 src]# useradd -s /sbin/nologin -M www
Nginx源码编译安装
[root@linux-node1 ~]# cd /usr/local/src
[root@linux-node1 src]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
[root@linux-node1 src]# tar zxf nginx-1.14.2.tar.gz
[root@linux-node1 src]# cd nginx-1.14.2
[root@linux-node1 nginx-1.14.2]#./configure --prefix=/usr/local/nginx-1.14.2 \
--user=www --group=www \
--with-http_ssl_module --with-stream \
--with-http_stub_status_module --with-file-aio
[root@linux-node1 nginx-1.14.2]# make && make install
2.测试配置并启动Nginx
[root@linux-node1 ~]# ln -s /usr/local/nginx-1.14.2/ /usr/local/nginx
[root@linux-node1 ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.14.2/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.14.2/conf/nginx.conf test is successful
[root@linux-node1 ~]# /usr/local/nginx/sbin/nginx
查看Nginx启动状态
[root@linux-node1 ~]# netstat –ntlp | grep 80
 
3.源码安装PHP(FPM)
首先,我们需要将PHP依赖的软件包都安装上。
[root@linux-node1 ~]# yum install -y gcc gcc-c++ glibc make autoconf \
libjpeg-turbo-devel libpng-devel mhash-devel \
freetype-devel libxml2-devel zlib-devel \
libcurl-devel openssl-devel swig libmcrypt-devel

4.下载软件包
[root@linux-node1 ~]# cd /usr/local/src
[root@linux-node1 src]# wget http://120.52.51.16/cn2.php.net/distributions/php-5.6.39.tar.gz
[root@linux-node1 src]# tar zxf php-5.6.39.tar.gz
[root@linux-node1 src]# cd php-5.6.39

5.编译软件包
[root@linux-node1 php-5.6.39]#./configure --prefix=/usr/local/php-5.6.39 --with-mysql \
--with-jpeg-dir --with-png-dir --with-curl --with-gd \
--with-zlib --enable-xml --with-libxml-dir --enable-bcmath \
--enable-sysvsem --enable-mbregex --with-openssl \
--enable-mbstring --enable-gd-native-ttf --enable-sockets \
--enable-shmop --enable-opcache --disable-debug \
--with-xmlrpc --enable-zip --enable-soap --enable-zip --enable-fpm \
--with-fpm-user=www --with-fpm-group=www --with-freetype-dir \
--with-mcrypt --with-mhash --enable-inline-optimization
[root@linux-node1 php-5.6.39]# make && make install

6.设置php配置文件和启动脚本
[root@linux-node1 php-5.6.39]# ln -s /usr/local/php-5.6.39/ /usr/local/php
[root@linux-node1 php-5.6.39]# cp php.ini-production /usr/local/php/lib/php.ini
[root@linux-node1 php-5.6.39]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@linux-node1 php-5.6.39]# chmod +x /etc/init.d/php-fpm

fpm配置文件
[root@linux-node1 php-5.6.39]# cd /usr/local/php/etc/	
[root@linux-node1 etc]# cp php-fpm.conf.default php-fpm.conf
[root@linux-node1 etc]# /etc/init.d/php-fpm start
Starting php-fpm done
默认情况下php-fpm会监听在本地127.0.0.1的9000端口,你也可以调整php-fpm.conf设置为监听sock文件。
 
7.配置Nginx和PHP的连接
[root@linux-node1 ~]# cd /usr/local/nginx/conf/
[root@linux-node1 conf]# vim nginx.conf
#去掉以下内容注释并修改
location ~ \.php$ {
#root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf; #注意修改
}
重载Nginx配置
[root@linux-node1 conf]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.14.2/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.14.2/conf/nginx.conf test is successful
[root@linux-node1 conf]# /usr/local/nginx/sbin/nginx -s reload

测试PHP安装
[root@linux-node1 conf]# cd /usr/local/nginx/html/
[root@linux-node1 html]# vim info.php
<?php
phpinfo();
?>

 

QQ截图20190104152228.png

 MySQL 生产部署
    mysql的安装除了yum,还可以源码编译,其实如果你没有完全掌握源码编译的优化选项,选择官方编译好的二进制版本也是不错的选择。
下载mysql二进制包
[root@linux-node1 ~]# cd /usr/local/src
# wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.37-linux-glibc2.12-x86_64.tar.gz
 
 
 
创建mysql用户
[root@linux-node1 ~]# groupadd mysql
[root@linux-node1 ~]# useradd -r -g mysql -s /bin/false mysql

解压mysql二进制包
[root@linux-node1 ~]# cd /usr/local/src
[root@linux-node1 src]# tar zxf mysql-5.6.37-linux-glibc2.12-x86_64.tar.gz
[root@linux-node1 src]# mv mysql-5.6.30-linux-glibc2.5-x86_64 /usr/local/
[root@linux-node1 ~]# chown -R mysql:mysql /usr/local/mysql-5.6.30-linux-glibc2.5-x86_64



初始化mysql
[root@linux-node1 ~]# ln -s /usr/local/mysql-5.6.30-linux-glibc2.5-x86_64/ /usr/local/mysql
[root@linux-node1 ~]# chown -R mysql:mysql /usr/local/mysql
[root@linux-node1 ~]# /usr/local/mysql/scripts/mysql_install_db \
--defaults-file=/usr/local/mysql/my.cnf \
--user=mysql --basedir=/usr/local/mysql/ \
--datadir=/usr/local/mysql/data

启动mysql
[root@linux-node1 src]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf &



 
PHP安装PDO MySQL扩展
    要让PHP连接到MySQL。可以使用PDO扩展,安装PDO扩展和安装其它PHP模块的方法都是类似的,分为三个步骤:
第一步:安装PDO扩展:
[root@linux-node1 ~]# cd /usr/local/src/php-5.6.21/ext/pdo_mysql/
phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块
[root@linux-node1 pdo_mysql]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
[root@linux-node1 pdo_mysql]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@linux-node1 pdo_mysql]# make && make install
执行完毕,最后会输出讲扩展安装到的位置,
# ls /usr/local/php-5.6.21/lib/php/extensions/no-debug-non-zts-20131226/
opcache.a opcache.so pdo_mysql.so

第二步:修改配置文件
[root@linux-node1 ~]# vim /usr/local/php/lib/php.ini
#在文件末尾添加
extension=pdo_mysql.so
第三步:重新加载PHP(FPM)
[root@linux-node1 ~]# /etc/init.d/php-fpm reload
Reload service php-fpm done
 
 使用mysqli连接数据库,所以需要给PHP安装该模块。
[root@linux-node1 pdo_mysql]# cd /usr/local/src/php-5.6.39/ext/mysqli/
[root@linux-node1 mysqli]# /usr/local/php/bin/phpize
[root@linux-node1 mysqli]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@linux-node1 mysqli]# make && make install

[root@linux-node1 mysqli]# vim /usr/local/php/lib/php.ini
#在最下面新添加一行
extension=mysqli.so
[root@linux-node1 mysqli]# /etc/init.d/php-fpm reload

 
 安装其他PHP模块均使用类似的方法。例如安装Redis、Memcached模块等。
 

Redis4.0集群

NoSQLShenghuiChen 发表了文章 • 0 个评论 • 140 次浏览 • 2019-01-04 14:54 • 来自相关话题

节点信息规划: 准备部署7001-7004 4个实例,但是redis集群提示最少需要3个主节点,6个节点才能完成启动,所以后面2个是后来加的。 注意:这里因为是测试环境,所以将所有实例都放在了一台机器上,生产建议主备节点不要放在一台机器 ...查看全部
节点信息规划:
准备部署7001-7004 4个实例,但是redis集群提示最少需要3个主节点,6个节点才能完成启动,所以后面2个是后来加的。
注意:这里因为是测试环境,所以将所有实例都放在了一台机器上,生产建议主备节点不要放在一台机器上
9.png

1、环境安装
~]# cd /opt/
opt]# wget http://download.redis.io/releases/redis-4.0.11.tar.gz
opt]# tar zxf redis-4.0.11.tar.gz
opt]# cd redis-4.0.11
opt]# make test
#yum 安装tcl
opt]# yum install tcl -y
opt]# make test
#将redis的执行脚本拷贝到PATH变量所在目录或加入全局环境变量
opt]# cp -a src/redis-server src/redis-cli src/redis-sentinel src/redis-trib.rb src/redis-check-aof src/redis-check-rdb src/redis-benchmark /usr/local/bin/
2、配置redis集群文件
opt]# mkdir -p redis-cluster
opt]# mkdir -p /opt/redis-cluster/nodes-{7001,7002,7003,7004}
opt]# ln -s redis-4.0.11 redis
按需修改配置文件(以nodes-7001实例为例)
[root@shenghui-ansible opt]# egrep -v "^#|^$" redis-cluster/nodes-7001/redis.conf 
bind 192.168.56.67
protected-mode yes
port 7001
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile redis_7001.pid
loglevel notice
logfile "/opt/redis-cluster/nodes-7001/redis_7001.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /opt/redis-cluster/nodes-7001/
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
cluster-slave-validity-factor 10
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
3、启动redis及创建集群
依次启动各个redis实例
]# redis-server /opt/redis-cluster/nodes-7001/redis.conf
]# redis-server /opt/redis-cluster/nodes-7002/redis.conf
]# redis-server /opt/redis-cluster/nodes-7003/redis.conf
]# redis-server /opt/redis-cluster/nodes-7004/redis.conf
4、创建redis集群
创建redis集群使用redis-trib.rb命令,该命令是基于ruby的脚本,需要安装ruby,ruby-gem以及gem-redis
#如果有老版本,卸载ruby2.0.0,安装ruby2.2.2以上版本
[root@elk01 ~]# ruby -v  #centos7 忽略
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
[root@elk01 ~]# yum erase ruby
~]# wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.3.tar.gz
~]# tar zxf ruby-2.5.3.tar.gz
~]# cd ruby-2.5.3/
ruby-2.5.3]# ./configure
ruby-2.5.3]# make
安装ruby-redis.gem
推荐:如果默认国外的gem源连不上或者很慢,可以试试国内源
添加国内源命令:gem source -a https://gems.ruby-china.com
删除国外源并添加国内源:gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.com/
#检测gem源,注意RubyGems源尽量用新版本,官方建议2.6.X,但是我用2.5.2也没什么问题
[root@shenghui-ansible ~]# gem source -l
*** CURRENT SOURCES ***

https://gems.ruby-china.com
redis-cluster]# gem install redis -v 3.3.5 #注:不要使用4.x版本,不然后期增加实例,迁移哈希槽会失败
创建集群报错:
root@elk01 redis-cluster]# redis-trib.rb create --replicas 1 192.168.56.67:7001 192.168.56.67:7002 192.168.56.67:7003 192.168.56.67:7004
>>> Creating cluster
*** ERROR: Invalid configuration for cluster creation. #错误表示redis集群至少要3个主,6个节点
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 4 nodes and 1 replicas per node.
*** At least 6 nodes are required.
#新增两个节点
redis-cluster]# mkdir -p nodes-{7005,7006}
#拷贝并修改下redis配置ip
redis-cluster]# cp nodes-7001/redis.conf nodes-7005/
redis-cluster]# cp nodes-7001/redis.conf nodes-7006/
启动redis
redis-server /opt/redis-cluster/nodes-7005/redis.conf
redis-server /opt/redis-cluster/nodes-7006/redis.conf
[root@shenghui-ansible ~]# ps -ef|grep redis
root 26651 1 0 Nov13 ? 00:01:10 redis-server 127.0.0.1:7002 [cluster]
root 26656 1 0 Nov13 ? 00:01:10 redis-server 127.0.0.1:7003 [cluster]
root 26661 1 0 Nov13 ? 00:01:09 redis-server 127.0.0.1:7004 [cluster]
root 26666 1 0 Nov13 ? 00:01:10 redis-server 127.0.0.1:7005 [cluster]
root 26671 1 0 Nov13 ? 00:01:09 redis-server 127.0.0.1:7006 [cluster]
root 26725 1 0 Nov13 ? 00:01:11 redis-server 127.0.0.1:7001 [cluster]
#创建集群成功
redis-cluster]# redis-trib.rb create --replicas 1 192.168.56.67:7001 192.168.56.67:7002 192.168.56.67:7003 192.168.56.67:7004 192.168.56.67:7005 192.168.56.67:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.56.67:7001
192.168.56.67:7002
192.168.56.67:7003
Adding replica 192.168.56.67:7004 to 192.168.56.67:7001
Adding replica 192.168.56.67:7005 to 192.168.56.67:7002
Adding replica 1192.168.56.67:7006 to 192.168.56.67:7003
M: 23df12c2bafde34f5bdd53d3463ad20b8ab507d2 192.168.56.67:7001
集群测试:
[root@shenghui-ansible ~]# redis-cli -c -p 7001 #登陆操作集群,-c参数是必须的
127.0.0.1:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:7
cluster_stats_messages_ping_sent:84881
...
127.0.0.1:7001> cluster nodes
21da5db87c968a926ac98db20c6b3e5db98e86b4 192.168.56.67:7001@17001 myself,slave 64f7850f021d1150b41fc654f247e075f8573813 0 1542181496000 1 connected
bbba5557051520f7d825819415a806b8716f811c 127.0.0.1:7002@17002 master - 0 1542181497150 2 connected 5461-10922
f707863e9846cf9e7c68fd7cdae5b72aa4f6839b 127.0.0.1:7004@17004 slave 66ebc6a414a533a9a2ed27fbcdbea88b9d8ed4db 0 1542181498161 4 connected
ecdf34327e274a8294f7225ddbb5d3f4cd0b7bde 127.0.0.1:7006@17006 slave bbba5557051520f7d825819415a806b8716f811c 0 1542181497000 6 connected
64f7850f021d1150b41fc654f247e075f8573813 127.0.0.1:7005@17005 master - 0 1542181495000 7 connected 0-5460
66ebc6a414a533a9a2ed27fbcdbea88b9d8ed4db 127.0.0.1:7003@17003 master - 0 1542181495132 3 connected 10923-16383
127.0.0.1:7001> set liubai 'papa'
-> Redirected to slot [11252] located at 127.0.0.1:7003
OK
127.0.0.1:7003> get liubai
"papa"
nodes-7001宕机查看数据(redis集群去中心化,连接哪一台都可以):
~]# kill -9 26725  #生长不建议使用kill,登陆redis-cli 使用shutdown关闭redis
[root@shenghui-ansible ~]# redis-cli -c -p 7002
127.0.0.1:7002> get liubai
-> Redirected to slot [11252] located at 127.0.0.1:7003 #数据在nodes3,从自动切换选举为主
"papa"
127.0.0.1:7003> cluster nodes
bbba5557051520f7d825819415a806b8716f811c 127.0.0.1:7002@17002 master - 0 1542181782880 2 connected 5461-10922
21da5db87c968a926ac98db20c6b3e5db98e86b4 127.0.0.1:7001@17001 slave,fail 64f7850f021d1150b41fc654f247e075f8573813 1542181666613 1542181664000 7 disconnected
64f7850f021d1150b41fc654f247e075f8573813 127.0.0.1:7005@17005 master - 0 1542181780860 7 connected 0-5460
66ebc6a414a533a9a2ed27fbcdbea88b9d8ed4db 127.0.0.1:7003@17003 myself,master - 0 1542181781000 3 connected 10923-16383
f707863e9846cf9e7c68fd7cdae5b72aa4f6839b 127.0.0.1:7004@17004 slave 66ebc6a414a533a9a2ed27fbcdbea88b9d8ed4db 0 1542181781869 4 connected
ecdf34327e274a8294f7225ddbb5d3f4cd0b7bde 127.0.0.1:7006@17006 slave bbba5557051520f7d825819415a806b8716f811c 0 1542181780000 6 connected
127.0.0.1:7003> get liubai
"papa"

OpenStack Queens Dashboard无法打开解决

回复

OpenStack赵班长 发起了问题 • 1 人关注 • 0 个回复 • 113 次浏览 • 2018-12-31 16:11 • 来自相关话题

Zabbix API初步入门

Zabbix赵班长 发表了文章 • 0 个评论 • 161 次浏览 • 2018-12-30 18:42 • 来自相关话题

    Zabbix API是实现Zabbix自动化监控的主要手段之一,你可以使用Zabbix Agent的自动注册功能,也可以使用网络自动发现功能,但是这些功能各有各的缺点。如果编写脚本对你来说没有压力,我跟建议Zabbix的所有自动化功能全部使用API的方 ...查看全部
    Zabbix API是实现Zabbix自动化监控的主要手段之一,你可以使用Zabbix Agent的自动注册功能,也可以使用网络自动发现功能,但是这些功能各有各的缺点。如果编写脚本对你来说没有压力,我跟建议Zabbix的所有自动化功能全部使用API的方式来完成。
 

图片1.png

 
 
1.登录API接口
 
## 登录认证
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1
}' http://192.168.56.11/zabbix/api_jsonrpc.php | python -m json.tool

 


执行完毕,会访问一个Auth Token,需要保留下来,后面的操作中需要使用


 
2.使用Python调用Zabbix API
 
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
import json

url = 'http://zabbix.unixhot.com/zabbix/api_jsonrpc.php'
post_data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "api-user",
"password": "zabbix"
},
"id": 1
}
post_header = {'Content-Type: application/json'}

ret = requests.post(url, data=json.dumps(post_data), headers=post_header)
print ret.text

 
3.显示所有主机:注意替换auth token。
 
## 显示所有主机
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["host"]
},
"auth": "3593bc5a0a3b62a5b7f8c3a9c3b9f59f",
"id": 1
}' http://192.168.56.11/zabbix/api_jsonrpc.php | python -mjson.tool

 
查询所有主机组:
## 显示所有主机组
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend"
},
"auth": "3593bc5a0a3b62a5b7f8c3a9c3b9f59f",
"id": 1
}' http://192.168.56.11/zabbix/api_jsonrpc.php | python -mjson.tool

 
查询所有模板:
## 显示所有模版
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": "extend"
},
"auth": "3593bc5a0a3b62a5b7f8c3a9c3b9f59f",
"id": 1
}' http://192.168.56.11/zabbix/api_jsonrpc.php | python -mjson.tool

SaltStack自动化部署Zabbix Agent

SaltStack赵班长 发表了文章 • 0 个评论 • 146 次浏览 • 2018-12-30 17:22 • 来自相关话题

     Zabbix Agent建议在系统初始化的时候直接使用SaltStack进行自动化部署,以后的管理和变更均使用SaltStack来完成。   1.准备SaltStack环境(略)   注:可以参考Sal ...查看全部
     Zabbix Agent建议在系统初始化的时候直接使用SaltStack进行自动化部署,以后的管理和变更均使用SaltStack来完成。
 
1.准备SaltStack环境(略)
 
注:可以参考SaltStack专栏里面的SaltStack快速入门。
 
2.创建对应的目录
[root@linux-node1 ~]# mkdir /srv/salt/base/zabbix/files/ -p

3.准备Zabbix配置文件,手动安装zabbix-agent后,copy文件到files目录下:
[root@linux-node1 ~]# yum install -y zabbix-agent
[root@linux-node1 ~]# cp /etc/zabbix/zabbix_agentd.conf /srv/salt/base/zabbix/files/

4.修改zabbix_agentd.conf为模板文件
[root@linux-node1 ~]# vim /srv/salt/base/zabbix/files/zabbix_agentd.conf 
Server={{ ZABBIX_SERVER }}
ServerActive={{ ZABBIX_ACTIVE_SERVER }}
Hostname={{ AGENT_HOSTNAME }}

5.编写状态文件:
 
[root@linux-node1 ~]# vim /srv/salt/base/zabbix/zabbix-agent.sls
zabbix-repo:
cmd.run:
- name: rpm -i https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
- unless: rpm -qa | grep zabbix-release

zabbix-agent:
pkg.installed:
- name: zabbix-agent
- version: 4.0.2-1.el7
- require:
- cmd: zabbix-repo
file.managed:
- name: /etc/zabbix/zabbix_agentd.conf
- source: salt://zabbix/files/zabbix_agentd.conf
- template: jinja
- defaults:
ZABBIX_SERVER: 192.168.56.11,192.168.56.12
ZABBIX_ACTIVE_SERVER: 192.168.56.11:10051,192.168.56.12:10051
AGENT_HOSTNAME: {{ grains['fqdn'] }}
- require:
- pkg: zabbix-agent
service.running:
- enable: True
- watch:
- pkg: zabbix-agent
- file: zabbix-agent

6.执行状态
 
[root@linux-node1 ~]# salt '*' state.sls zabbix.zabbix-agent
linux-node1.example.com:
----------
ID: zabbix-repo
Function: cmd.run
Name: rpm -i https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
Result: True
Comment: unless condition is true
Started: 17:19:44.412981
Duration: 938.341 ms
Changes:
----------
ID: zabbix-agent
Function: pkg.installed
Result: True
Comment: All specified packages are already installed and are at the desired version
Started: 17:19:49.124383
Duration: 2037.406 ms
Changes:
----------
ID: zabbix-agent
Function: file.managed
Name: /etc/zabbix/zabbix_agentd.conf
Result: True
Comment: File /etc/zabbix/zabbix_agentd.conf is in the correct state
Started: 17:19:51.165575
Duration: 53.529 ms
Changes:
----------
ID: zabbix-agent
Function: service.running
Result: True
Comment: The service zabbix-agent is already running
Started: 17:19:51.220700
Duration: 56.149 ms
Changes:

Summary for linux-node1.example.com
------------
Succeeded: 4
Failed: 0
------------
Total states run: 4
Total run time: 3.085 s
linux-node2.example.com:
----------
ID: zabbix-repo
Function: cmd.run
Name: rpm -i https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
Result: True
Comment: unless condition is true
Started: 17:19:45.512368
Duration: 1108.944 ms
Changes:
----------
ID: zabbix-agent
Function: pkg.installed
Result: True
Comment: All specified packages are already installed and are at the desired version
Started: 17:19:49.699172
Duration: 1787.491 ms
Changes:
----------
ID: zabbix-agent
Function: file.managed
Name: /etc/zabbix/zabbix_agentd.conf
Result: True
Comment: File /etc/zabbix/zabbix_agentd.conf is in the correct state
Started: 17:19:51.490851
Duration: 53.646 ms
Changes:
----------
ID: zabbix-agent
Function: service.running
Result: True
Comment: The service zabbix-agent is already running
Started: 17:19:51.546009
Duration: 63.202 ms
Changes:

Summary for linux-node2.example.com
------------
Succeeded: 4
Failed: 0
------------
Total states run: 4
Total run time: 3.013 s

 
 
 

Zabbix告警脚本-Python发送邮件

Zabbix赵班长 发表了文章 • 0 个评论 • 118 次浏览 • 2018-12-30 10:08 • 来自相关话题

自定义Zabbix告警,首先需要编写告警脚本,告警脚本需要支持3个参数:        1.告警接收人      2.主题      3.内容   生产建议使用Shell脚本作为告警脚本, ...查看全部
自定义Zabbix告警,首先需要编写告警脚本,告警脚本需要支持3个参数:
 
     1.告警接收人
     2.主题
     3.内容
 
生产建议使用Shell脚本作为告警脚本,同时需要日志记录,也可以在Shell脚本中完成,然后可以再使用Shell脚本调用其它的脚本。这样可以随时更换告警介质,也可以做好日志记录。
 
 
1.最简单的告警脚本
 
[root@linux-node1 alertscripts]# cat pymail.sh 
#!/bin/bash
echo $1 $2 $3 >> /tmp/alter.txt

 
2.编写告警脚本
#!/usr/bin/python
#coding: utf-8
import smtplib
import sys
from email.mime.text import MIMEText
from email.header import Header
from email.Utils import COMMASPACE

receiver = sys.argv[1]
subject = sys.argv[2]
mailbody = sys.argv[3]
smtpserver = 'smtp.qq.com'
username = 'username'
password = 'passwd'
sender = username

msg = MIMEText(mailbody,'html','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = username
msg['To'] = receiver

smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.starttls()
smtp.sendmail(msg['From'], msg['To'], msg.as_string())
smtp.quit()

 
测试邮件发送
 
[root@linux-node1 alertscripts]# python pymail.py 57459267@qq.com testmail test

 
加入到告警脚本中
 
#!/bin/bash
/usr/local/bin/python /usr/lib/zabbix/alertscripts/pymail.py "$1" "$2" "$3"

Zabbix监控插件-Nginx、TCP、Redis、Memcached

自动化运维赵班长 发表了文章 • 0 个评论 • 244 次浏览 • 2018-12-23 13:55 • 来自相关话题

  2014年写的Zabbix监控插件,主要监控TCP的11种状态、Nginx状态、Redis和Memcached状态。   监控模板请查看附件。直接导入到Zabbix中即可。   Nginx监控状态 ...查看全部
 
2014年写的Zabbix监控插件,主要监控TCP的11种状态、Nginx状态、Redis和Memcached状态。
 
监控模板请查看附件。直接导入到Zabbix中即可。
 
Nginx监控状态配置默认使用127.0.0.1获取。
 
Nginx监控配置:
 
1.为Nginx增加状态配置文件。
[root@linux-node2 ~]# yum install -y nginx
[root@linux-node2 ~]# vim /etc/nginx/conf.d/nginx-status.conf
server {
server_name 127.0.0.1;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
2.测试Nginx配置并启动
[root@linux-node2 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@linux-node2 ~]# systemctl start nginx


3.测试Nginx状态接口
[root@linux-node2 ~]# curl http://127.0.0.1/nginx_status
Active connections: 1
server accepts handled requests
7 7 7
Reading: 0 Writing: 1 Waiting: 0
 
  
#!/bin/bash
############################################################
# $Name: zabbix_linux_plugins.sh
# $Version: v1.0
# $Function: zabbix plugins
# $Author: Jason Zhao
# $organization: www.unixhot.com
# $Create Date: 2014-08-10
# $Description: Monitor Linux Service Status
############################################################
tcp_status_fun(){
TCP_STAT=$1
#netstat -n | awk '/^tcp/ { state[$NF]} END {for(key in state) print key,state[key]}' > /tmp/netstat.tmp
ss -ant | awk 'NR>1 { s[$1]} END {for(k in s) print k,s[k]}' > /tmp/netstat.tmp
TCP_STAT_VALUE=$(grep "$TCP_STAT" /tmp/netstat.tmp | cut -d ' ' -f2)
if [ -z $TCP_STAT_VALUE ];then
TCP_STAT_VALUE=0
fi
echo $TCP_STAT_VALUE
}

nginx_status_fun(){
NGINX_PORT=$1
NGINX_COMMAND=$2
nginx_active(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
nginx_reading(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
nginx_writing(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
nginx_waiting(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
nginx_accepts(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
nginx_handled(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
nginx_requests(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
case $NGINX_COMMAND in
active)
nginx_active;
;;
reading)
nginx_reading;
;;
writing)
nginx_writing;
;;
waiting)
nginx_waiting;
;;
accepts)
nginx_accepts;
;;
handled)
nginx_handled;
;;
requests)
nginx_requests;
esac
}

memcached_status_fun(){
M_PORT=$1
M_COMMAND=$2
echo -e "stats\nquit" | nc 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND " | awk '{print $3}'
}

redis_status_fun(){
R_PORT=$1
R_COMMAND=$2
(echo -en "INFO \r\n";sleep 1;) | nc 127.0.0.1 "$R_PORT" > /tmp/redis_"$R_PORT".tmp
REDIS_STAT_VALUE=$(grep ""$R_COMMAND":" /tmp/redis_"$R_PORT".tmp | cut -d ':' -f2)
echo $REDIS_STAT_VALUE
}

main(){
case $1 in
tcp_status)
tcp_status_fun $2;
;;
nginx_status)
nginx_status_fun $2 $3;
;;
memcached_status)
memcached_status_fun $2 $3;
;;
redis_status)
redis_status_fun $2 $3;
;;
*)
echo $"Usage: $0 {tcp_status key|memcached_status key|redis_status key|nginx_status key}"
esac
}

main $1 $2 $3





 
使用方法:
[root@linux-node2 ~]# ./zabbix_linux_plugin.sh 
Usage: ./zabbix_linux_plugin.sh {tcp_status key|memcached_status key|redis_status key|nginx_status key}





 
获取TCP监控状态
[root@linux-node2 ~]# ./zabbix_linux_plugin.sh tcp_status LISTEN
14


 

iTop自定义CI模型

自动化运维赵班长 发表了文章 • 0 个评论 • 93 次浏览 • 2019-01-07 12:44 • 来自相关话题

iTop自定义CI模型,需要Toolkit工具,附件中。   1.下载附件中的Toolkit。直接解压到对应的webroot下。   2.直接访问http://xxx/toolkit访问。  
iTop自定义CI模型,需要Toolkit工具,附件中。
 
1.下载附件中的Toolkit。直接解压到对应的webroot下。
 
2.直接访问http://xxx/toolkit访问。