Fork me on GitHub
Suzf  Blog

FAQ_Puppet: 常见问题 【持续更新中】

Q1:最近测试3.7.1 的版本出现了一个问题:The package type's allow_virtual parameter will be changing its default value from false to true in a future release

A1:

[[email protected] ~]# puppet --version
3.7.1

[[email protected] ~]# puppet agent --test --server master.jeffery.com --noop
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for agent1.jeffery.com
Warning: The package type's allow_virtual parameter will be changing its default value from false to true in a future release. If you do not want to allow virtual packages, please explicitly set allow_virtual to false.
(at /usr/lib/ruby/site_ruby/1.8/puppet/type/package.rb:430:in `default')
Info: Applying configuration version '1413249918'

Notice: Finished catalog run in 0.11 seconds

出现一个警告,但不影响执行的结果,有群友说是版本有问题,最终我也不知道是神码问题的。。

可以在服务器端的 pp文件中的package 中加入 :allow_virtual => false, 来解决出现的警告。

检查文件的正确性spacer.gif

测试

Q2:

puppet Error 400 on SERVER Permission denied

Error: /Stage[main]/Ssh::Config/File[/etc/ssh/sshd_config]: Could not evaluate: Error 400 on SERVER: Permission denied - /etc/puppet/modules/ssh/files/sshd_config Could not retrieve file metadata for puppet:///modules/ssh/sshd_config: Error 400 on SERVER: Permission denied - /etc/puppet/modules/ssh/files/sshd_config

A2: chmod -R ./ssh/files/*

Q3:

What causes the error “Could not retrieve catalog from remote server: execution expired” in Puppet

This can be caused when the load on the Puppet Master server is too high to send compiled catalogs to the agents.
Start by checking if any services are using all the available resources, or if the server is under-powered for the requests it is getting. If all agents run at the same time, edit the cron job that controls their run time to spread it out.
If all else fails, allowing the agents to take longer to receive the catalog may work. This can be done by adding the configtimeout setting to the puppet.conf file (/etc/puppet/puppet.conf) and increasing the value. It defaults to "2m", meaning two minutes.

Q4:

Error: Could not retrieve catalog from remote server: Connection refused - connect(2)
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
Error: Could not send report: Connection refused - connect(2)

此错误是没有启动puppet master服务 或是没有绑定主机名/DNS 未得到正确解析

[14:37:04][[email protected] ~]$ cat /etc/hosts | grep 192
#192.168.9.10     master01.ocean.org   master01
#192.168.9.20     agent01.ocean.org    agent01

取消注释 再次执行 问题解决

 

FAQ_Zabbix:解决模板收集到的数据和真实数据有偏差

前不久定制了一个Sanfor的模板,后发现 发现内存图形呈现的数据太不靠谱了。和真是数据相差近千倍。

使用snmpwalk 抓取数据后发现单位是kb , 靠懵了和 交换、路由的单位不太一样

查看了一下官方手册 ,在 item 有一个选项是 Use custom multiplier 可以转换单位

https://www.zabbix.com/documentation/2.0/manual/config/items/item

数据备份 之网站镜像方案 sersync

网站镜像方案:sersync & rsync

spacer.gif

一、需要软件:sersync、rsync
sersync 访问网址:http://code.google.com/p/sersync/

二、试验环境
主服务器(内容发布服务器):Node1 172.16.7.30 需要安装软件:sersync、rsync
同步目标服务器: Node2 172.16.7.81 需要安装软件:rsync [默认都已经安装好]

三、实施

主服务器配置:
3.1、解压sersync压缩包

tar zxf sersync2.5_32bit_binary_stable_final.tar.gz

mv GNU_Linux-x86/ /usr/local/rsync

[[email protected] rsync]# pwd

/usr/local/rsync

[[email protected] rsync]# ls

confxml.xml sersync2

2.2、编辑config.xml文件,修改如下信息

说明信息:
表明将主服务器的本地 /backup 路径下的文件,同步到远程服务器172.16.7.30上的test_rsync模块上。
crontab附图:显示每600毫秒同步(下图是config.xml中内容,不需要修改)

2.3、在主服务器上开启sersync守护进程,使sersync在后台运行,开启实时同步。
./sersync2 -d

以上信息表明已经同步!

1、同步目标服务器配置:
在Node2上新建文件/etc/rsyncd.conf ,编辑如下

vim /etc/rsyncd.conf [默认没有]

具体解释:
(1)将同步过来的文件放入path指定的路径/backupl。
(2)如果有多台从服务器,则在每台都需要进行类似的rsync配置。
配置好之后,开启rsync守护进程rsync --daemon

四、测试查看是否内容同步
4.1、先在主服务器/backup目录下创建一个test.txt
[[email protected] rsync]# echo "jeffery"> /backup/test.txt

4.2、然后到目标服务器查看同步目录的变化,发现已经同步。

tailf /var/log/rsyncd.log

注意:
如果在从服务器增加文件,主服务器不会被同步.该技术是单向性的.

Windows 安装cwRsync

下载地址https://www.itefix.net/download/cwRsync_5.3.0_Free.zip

这里我放到了c:/cwRsync
备份保存路径 c:/backup

将软件包解压放到C:\cwrsync 找到rsync.exe 以管理员身份运行就好了

执行下面命令可以看到如下信息表示同步成

这表示把服务器test_rsync指定的目录 同步到本地c盘的backup目录了

 

Expect自动化控制简单介绍

telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。

shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd、scp

对自动部署免去用户交互很痛苦,expect能很好的解决这类问题。

expect的核心是spawn expect send set

spawn 调用要执行的命令

expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:

send 发送需要交互的值,替代了用户手动输入内容

set 设置变量值

interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

设置expect永不超时

set timeout -1

设置expect 300秒超时,如果超过300没有expect内容出现,则推出

set timeout 300

expect编写语法,expect使用的是tcl语法。

一条Tcl命令由空格分割的单词组成. 其中, 第一个单词是命令名称, 其余的是命令参数

cmd arg arg arg

$符号代表变量的值. 在本例中, 变量名称是foo.

$foo

方括号执行了一个嵌套命令. 例如, 如果你想传递一个命令的结果作为另外一个命令的参数, 那么你使用这个符号

[cmd arg]

双引号把词组标记为命令的一个参数. "$"符号和方括号在双引号内仍被解释

"some stuff"

大括号也把词组标记为命令的一个参数. 但是, 其他符号在大括号内不被解释

{some stuff}

反斜线符号是用来引用特殊符号. 例如:\n 代表换行. 反斜线符号也被用来关闭"$"符号, 引号,方括号和大括号的特殊含义

#自动登录运程主机并执行命令

[[email protected] expect]# cat ssh_log_cmd.expect
#!/usr/bin/expect
set user "root"
set password "jeffery"
set ip "172.16.7.91"

spawn ssh [email protected]$ip

expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$password\r"}
}
expect "]*"
send "touch /tmp/haha.txt\r"
expect "]*"
send "echo haha > /tmp/haha.txt\r"
expect "]*"
send "exit\r"

#使用rsync同步文件

[[email protected] expect]# cat sync_file.expect
#!/usr/bin/expect
# Desc: auto sync file
# Author: Jeffery.su
# Date: 15/09/2014

set user "root"
set password "jeffery"
set host "172.16.7.91"

spawn rsync -av [email protected]$host:/tmp/haha.txt /tmp

expect {
"yes/no" {send "yes\r"}
"password" {send "$password\r"}
}

#参数的使用

[[email protected] expect]# cat trans_para.expect
#!/usr/bin/expect
# Desc: transmit parameter
# Author: Jeffery.Su
# Date: 15/09/2014

set user [lindex $argv 0]
set host [lindex $argv 1]
set password "jeffery"
set cm [lindex $argv 2]

spawn ssh [email protected]$host

expect {
"yes/no" {send "yes\r"}
"password" {send "$password\r"}
}

expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"

#调用 expect trans_para.expect root 172.16.7.91 date

 

Zabbix之监控Nginx状态信息

nginx需要支持 http_stub_status_module 编译的时候需要使用--with-http_stub_status_module
yum默认支持此选项

1. 配置nginx stuats
源码: vim nginx.conf
yum: vim /etc/nginx/conf.d/default.conf
#and add the following to your server block 

location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 172.16.7.70; #Put your servers IPaddress instead of 172.16.7.70
deny all;

#这里是线上Nginx的配置【yum】
location /nginx_status {
                stub_status on;
                allow 127.0.0.1;
                allow 172.16.99.38;
        }

  # 检测配置文件
  nginx -t
  # 重新加载配置文件
  nginx -s reload        

2.查看Nginx状态信息
curl localhost/nginx_status

注解:
Active connections: 1 当前活动的连接数
server accepts handled requests
 3721 3721 3714
 3721  从启动到现在一共处理的连接数
 3721  从启动到现在成功创建的握手的次数
 3714   总共处理的请求数(requests)
 请求的丢失数=(握手-连接)

connection 连接数,tcp连接
request http请求,GET/POST/DELETE

Reading: 0 Writing: 1 Waiting: 0
Reading: 0 读取客户端Header的信息数 请求头
Writing: 1 返回给客户端的header的信息数 响应头
Waiting: 0 等待的请求数

3. zabbix客户端配置 

#创建检测脚本
mkdir /usr/local/zabbix/scripts 

vi /usr/local/zabbix/scripts/nginx_status.sh 

#!/bin/bash 
# Script to fetch nginx statuses for tribily monitoring systems 
# Author: [email protected] 
# License: GPLv2 

# Set Variables 
#BKUP_DATE=`/bin/date +%Y%m%d` 
#LOG="/etc/zabbix/nginx_status.log" 
HOST=`/sbin/ifconfig eth0 | sed -n '/inet /{s/.*addr://;s/ .*//;p}'` 
PORT="80" 

# Functions to return nginx stats 

function active { 
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Active' | awk '{print $NF}' 
} 

function reading { 
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Reading' | awk '{print $2}' 
} 

function writing { 
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Writing' | awk '{print $4}' 
} 

function waiting { 
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Waiting' | awk '{print $6}' 
} 

function accepts { 
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $1}' 
} 

function handled { 
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $2}' 
} 

function requests { 
/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $3}' 
} 

# Run the requested function 
$1 

# 对脚本赋予执行权限
chmod +x /usr/local/zabbix/scripts/nginx_status.sh 

# 修改agent 配置文件
vim /usr/local/zabbix/etc/zabbix_agentd.conf
#开启自定义KEY功能
UnsafeUserParameters=1
UserParameter=nginx.accepts,/usr/local/zabbix/scripts/nginx_status.sh accepts
UserParameter=nginx.handled,/usr/local/zabbix/scripts/nginx_status.sh handled
UserParameter=nginx.requests,/usr/local/zabbix/scripts/nginx_status.sh requests
UserParameter=nginx.connections.active,/usr/local/zabbix/scripts/nginx_status.sh active
UserParameter=nginx.connections.reading,/usr/local/zabbix/scripts/nginx_status.sh reading
UserParameter=nginx.connections.writing,/usr/local/zabbix/scripts/nginx_status.sh writing
UserParameter=nginx.connections.waiting,/usr/local/zabbix/scripts/nginx_status.sh waiting 

#重启zabbix_agentd
/etc/init.d/zabbix_agentd  restart

4.服务端测试

# 有信息返回说明配置正常
# /usr/local/zabbix/bin/zabbix_get -s 172.16.99.25 -knginx.accepts
12877

# 有图有真相

#模板
http://pan.baidu.com/s/1c00Aqcg

FAQ : 若果是无返回信息则说明agent端配置错误这是查看zabbix_agentd.log 的输出日志,排查错误

#查看who权限
# ll /sbin/ifconfig
-rwx------ 1 root root 73936 May 10 2012 /sbin/ifconfig
# ll /usr/bin/who
-rwx------ 1 root root 48952 Nov 22 2013 /usr/bin/who
果真没有执行权限
visudo 授权或是 chmod +x /usr/bin/who &&  chmod +x  /sbin/ifconfig 

 

LNMP之源码自定义安装

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。

Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、gentoo等。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Mysql是一个小型关系型数据库管理系统。
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。

Nginx之Upstream模块实现负载均衡

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 172.16.7.14 weight=10;
server 172.16.7.15 weight=10;
}

3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 172.16.7.14:88;
server 172.16.7.15:80;
}

4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

upstream bakend{#定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加
proxy_pass http://bakend/;

每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录

location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

例:配置使用Nginx实现LB
[[email protected] ~]# sed -i '/^[ \t]*#/d; /^$/d' /usr/local/nginx/conf/nginx.conf
[[email protected] ~]# cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;

events {
worker_connections 1024;
}

http {
upstream Jeffery_lb {
ip_hash; #会话保持
server 172.16.7.30:80; #后端的真实服务器
server 172.16.7.40:80; #后端的真实服务器
server 172.16.7.50:80; #后端的真实服务器
}

server {
listen 80;
server_name www.Jeffery.com;

location / {
root html;
index index.php index.html index.htm;
proxy_pass http://Jeffery_lb;
proxy_set_header Host $host;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

 

Zabbix之JMX监控Tomcat

zabbix从2.0开始添加了支持用于监控JMX应用程序的服务进程,称为"ZabbixJavagateway";它是用java写的一个程序。

一.工作原理:

zabbixserver想知道一台主机上的特定的JMX值时,它向ZabbixJavagateway询问,而ZabbixJavagateway使用"XmanagementAPI"询特定的应用程序,而前提是应用程序这端在开启时需要&l"com.sun.management.jmxremote&r"来开启JMX查询就行了。

Zabbixserver有一个特殊的进程用来连接Javagateway叫StartJavaPollers;Javagateway通过配置文件中START_POLLERS参数设置启动多个线程,在zabbix服务器这边如果一个连接所用时间超过Timeout,将会被中断,但是Javagateway将继续从JMXcounter取数据。所以

StartJavaPollers设置的值要小于等于START_POLLERS设置的值。

ZabbixJavagateway就相当于一个代理。