Saltstack批量编译部署Nginx(多模块)

最近一直在研究saltstack的同步文件和批量执行命令,随着架构的变大,批量部署的需求也变得明显起来了,我需要用一条命令就部署好nginx和tomcat,并且符合我所有的环境需求,可以直接投入生产环境使用,这就需要用到saltstack的批量安装部署功能了。这篇文章主要介绍nginx的批量部署,下篇讲解tomcat多实例的批量部署方法。

环境介绍:

  • CentOS 6.5

  • salt 2015.5.10

  • nginx 1.12.0

  • minion:test

1、修改master配置文件,修改后重启服务,因为saltstack是用python写的,所以所有配置文件缩进和空格必须和文中一致!

mkdir -p /srv/salt
vim /etc/salt/master
  file_roots:    #前面必须有俩空格,下面缩进同理    
    base:      
      - /srv/salt/

2、主入口文件top.sls

vim /srv/salt/top.sls
 base:    
   'test':    #只作用于test这台minion      
     - nginx.init    #使用nginx下的init.sls文件进行初始化

3、创建nginx目录

mkdir -p /srv/salt/nginx/files    #用于存放模块和配置文件

mkdir -p /srv/salt/soft/    #用于存放模块的安装方法

cd /srv/salt/nginx && tree

未分类

4、编辑初始化文件init.sls

vim /srv/salt/nginx/init.sls
 include:  
   - nginx.install    #包含nginx下的install.sls

5、编辑安装部署文件install.sls

vim /srv/salt/nginx/install.sls
include:
  - soft.modules        #包含模块配置文件
#nginx.tar.gz
nginx_source:
  file.managed:
    - name: /tmp/nginx-1.12.0.tar.gz        #标识文件所在位置
    - unless: test -e /tmp/nginx-1.12.0.tar.gz    #检测文件是否存在,只在第一次检测
    - source: salt://nginx/files/nginx-1.12.0.tar.gz    #把maser上的文件传过去
#extract
extract_nginx:
  cmd.run:
    - cwd: /tmp        #进入/tmp目录
    - names:
      - tar zxvf nginx-1.12.0.tar.gz        #解压
    - unless: test -d /tmp/nginx-1.12.0.tar.gz
    - require:
      - file: nginx_source        #这个命令必须在上面的函数执行成功后才继续执行
#user
nginx_user:
  user.present:        #用户创建
    - name: nginx
    - createhome: False        #不用家目录
    - gid_from_name: True
    - shell: /sbin/nologin        #指定shell
#nginx_pkgs
nginx_pkg:
  pkg.installed:        #安装必备组件
    - pkgs:
      - gcc
      - gcc-c++
      - epel-release
      - openssl-devel
      - pcre-devel
      - zlib-devel
      - gd-devel
      - lua-devel
#nginx_compile
nginx_compile:        #nginx进行编译
  cmd.run:
    - cwd: /tmp/nginx-1.12.0
    - names:
      - ./configure --prefix=/usr/local/nginx  --user=nginx  --group=nginx --with-file-aio
       --with-http_ssl_module --with-http_realip_module --with-http_addition_module 
       --with-http_image_filter_module --with-http_gzip_static_module 
       --with-http_stub_status_module --with-mail --with-mail_ssl_module 
       --with-pcre --with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib 
       --with-http_sub_module --add-module=/soft/ngx_cache_purge-2.3 
       --add-module=/soft/ngx_devel_kit-0.3.0rc1 
       --add-module=/soft/echo-nginx-module-master 
       --add-module=/soft/lua-nginx-module-master && make && make install
    - require:
      - cmd: extract_nginx
      - pkg:  nginx_pkg
    #- unless: test -d /usr/local/nginx/    #检测或不检测目录是否存在
#cache_dir
cache_dir:
  cmd.run:
    - names:        #创建虚拟主机目录,把nginx目录权限给相关用户
      - mkdir -p /usr/local/nginx/conf/vhosts && chown -R nginx.nginx /usr/local/nginx/
    - require:
      - cmd: nginx_compile
    - unless: test -d /usr/local/nginx/conf/vhosts/
  #vhosts
  file.managed:
    - name: /usr/local/nginx/conf/nginx.conf    #修改后的配置文件复制过去
    - source: salt://nginx/files/nginx.conf
    #- unless: test -e /usr/local/nginx/conf/nginx.conf    #建议不进行检测,如果检测,有这个文件将不会进行更新

/usr/local/nginx/conf/proxy.conf:
  file.managed:
    - name: /usr/local/nginx/conf/proxy.conf
    - source: salt://nginx/files/proxy.conf
    #- unless: test -e /usr/local/nginx/conf/proxy.conf

6、编辑模块配置文件

vim /srv/salt/soft/modules.sls
echo-install:        #每个文件管理必须配置不同的名字,缩进必须一致,name:和source:后面的空格必须有!
  file.managed:
    - name: /soft/echo-nginx-module-master.zip
    - source: salt://nginx/files/echo-nginx-module-master.zip
    - user: root        #用户指定可有可无
    - group: root
    - mode: 755        #权限指定可有可无

  cmd.run:
    - name: cd /soft && unzip echo-nginx-module-master.zip
    - unless: test -d /soft/echo-nginx-module-master

lua-install:
  file.managed:
    - name: /soft/lua-nginx-module-master.zip
    - source: salt://nginx/files/lua-nginx-module-master.zip

  cmd.run:
    - name: cd /soft && unzip lua-nginx-module-master.zip
    - unless: test -d /soft/lua-nginx-module-master

purge-install:
  file.managed:
    - name: /soft/ngx_cache_purge-2.3.tar.gz
    - source: salt://nginx/files/ngx_cache_purge-2.3.tar.gz

  cmd.run:
    - name: cd /soft && tar xvf ngx_cache_purge-2.3.tar.gz
    - unless: test -d /soft/ngx_cache_purge-2.3

devel-install:
  file.managed:
    - name: /soft/ngx_devel_kit-0.3.0rc1.tar.gz
    - source: salt://nginx/files/ngx_devel_kit-0.3.0rc1.tar.gz

  cmd.run:
    - name: cd /soft && tar xvf ngx_devel_kit-0.3.0rc1.tar.gz
    - unless: test -d /soft/ngx_devel_kit-0.3.0rc1

7、执行同步推送

salt 'test' state.highstate

观察是否全部为success,如果有fail,查看具体失败原因,解决问题后可继续推送。

saltstack实现文件分发

取消配置文件/etc/salt/master以下注释

... ...
file_roots:
  base:
    - /srv/salt
... ...

新建相关目录

mkdir /srv/salt
touch /srv/salt/top.sls

top.sls文件 /srv/salt/top.sls

base:
  '*':
    - ssh_key.key
mkdir /srv/salt/ssh_key
touch /srv/salt/test.sls

/srv/salt/test.sls

/root/.ssh/authorized_keys: 
# 客户端文件存放路径和命名,如果.ssh目录不存在则会自动新建
  file:
    - managed
    - source: salt://ssh_key/test   
    # 默认file根目录为`/srv/salt`,拷贝相应文件至所在目录
    - user: root
    - group: root
    - mode: 600

最终目录结构

# tree /srv/salt/
/srv/salt/
|-- ssh_key
|   |-- test
|   |-- test.sls
`-- top.sl

server端主动推送

salt '*' state.highstate -v     # 按照top.sls执行所有
salt '*' state.sls ssh_key.ms   # 指定sls执行

SaltStack安装与配置

介绍

本来已经在虚拟机中安装好了 Salt。不想测试时无意运行了 salt ‘*’ pip.install salt,可能与原来用脚本安装 Salt 起了冲突。导致 Salt 命令各种报错。不得不重装 Salt,顺带记录下相关的步骤。

安装

下载安装 SALT MASTER(包含了 MINION)

curl -L https://bootstrap.saltstack.com -o install_salt.sh
sudo sh install_salt.sh -P -M

下载安装 SALT MINION

curl -L https://bootstrap.saltstack.com -o install_salt.sh
sudo sh install_salt.sh -P

配置

配置文件位置:/etc/salt/master 和 /etc/salt/minion

通过 KEY 建立 MASTER 和 MINION 的连接

salt-key -F master

复制 master.pub 对应的内容(指纹)。粘贴到 minion 配置文件的 master_finger的值,重启 minion。

查看所有的 key

salt-key -L

确认后接受 key

salt-key -A
salt-key -L

验证

假设 minion 为 alpha,

# salt alpha test.ping
alpha:
    True

如果结果不对重点检查 master_finger 的值有没有复制错了????。

补充:Salt Restful api 接口配置

安装 salt-api

yum install salt-api

创建用户

为了做权限控制(pam),创建用户 saltdev,并设置密码

adduser saltdev
passwd saltdev

配置和启动

增加 master 相关配置

rest_cherrypy:
  port: 8000
  disable_ssl: True
#  ssl_crt: /etc/pki/tls/certs/localhost.crt
#  ssl_key: /etc/pki/tls/certs/localhost.key

external_auth:
  pam:
    saltdev:
      - .*
      - '@runner'
      - '@wheel'

重启 master,启动 salt-api。

验证

访问相应 ip 的 8000 端口,例如 localhost:8000,查看是否有返回结果。

salt-minion和salt-master之间如何重新认证

随心笔记,如有错误 欢迎指正。

  • salt minion 和salt master之间重新建立认证

  • 修改了minion端的id之后 比如修改了hostname之后,

  • minion端会将minion的id 存放在/etc/salt/minion_id

文件中,重启不会改变。所以要重新认证就需要以下2步:

1、清空minion_id

>/etc/salt/minion_id

2.删除minion存放masterkey的文件pki文件夹下所以的东西

rm -rf /etc/salt/pki/*

3.重启minion

service salt-minion restart

在master端:

删除pki文件之后,重启即可:

rm -rf /etc/salt/pki/*

service salt-master restart

之后就可以salt-key看到新的minion id了。

saltstack根据不同主机下发不同配置

[root@yy01 salt]# cat top.sls
base:
'*':
- conf
[root@yy01 salt]# cat conf.sls
{% for x in grains['nginx_ip'] %}
/opt/test01:
file.managed:
- source: salt://{{x}}/user.txt
- mode: 644
- user: root
- group: root
{% endfor %}

source内容需要存放在sls文件的目录下,本来想sls文件和数据分开来存放的。找了好多资料没有成功后续再研究吧

# salt * state.highstate

sls文件中的nginx_ip是自己定义的这个需要在配置salt客户端时就指定好的

Linux Crontab定时任务使用介绍及使用saltstack管理

一、引言:

最近无意之间看到salt有一个cron的模块,今天就在这里介绍linux crontab以及通过salt的cron对crontab的管理。

二、Linux crontab的介绍:

crontab是用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放在”crontab”文件中,以供之后读取和执行。crontab存储的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。

2.1、crond的启动与关闭:

#查看crond的状态
[root@A01-R07-I165-88 ~]# service crond status
#关闭crond
[root@A01-R07-I165-88 ~]# service crond stop
#启动crond
[root@A01-R07-I165-88 ~]# service crond start
#重启crond
[root@A01-R07-I165-88 ~]# service crond restart
#重新加载crond
[root@A01-R07-I165-88 ~]# service crond reload

2.2、全部配置文件

crontab在/etc目录下面存在cron.hourly,cron.daily,cron.weekly,cron.monthly,cron.d五个目录和crontab,cron.deny二个文件。

  • cron.daily是每天执行一次的Job;

  • cron.weekly是每个星期执行一次的Job;

  • cron.monthly是每个月执行一次的Job;

  • cron.hourly是每个小时执行一次的Job;

  • cron.d是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的。

/etc/crontab的内容如下:

[root@A01-R07-I165-88 ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
#
# *  *  *  *  * user-name  command to be executed

/etc/cron.deny文件就是用于控制不让哪些用户使用crontab的功能。

2.3、用户配置文件:

每个用户都有自己得的cron配置文件,通过crontab -e就可以编辑,一般情况下我们编辑完用户的cron配置文件保存退出后,系统会自动就存放于/var/spool/cron/目录中,文件以用户名命名。

linux的cron服务是每隔一分钟去读取一次/var/spool/cron/,/etc/crontab,/etc/cron.d下面的所有内容。

2.4、cron命令格式:

crontab [ -u user ] 文件 
crontab [ -u user ] { -l | -r | -e }
-u:指定某一用户
-e:执行文字编辑器来设定用户(当前用户或指定用户)时程表,内定的文字编辑器是vi.
-r:删除用户时程表.
-l:列出用户时程表.

2.5、cron文件格式:

*  *  *  *  *  command
分 时 日 月 周   命令
第1列表示分钟1~59, 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

2.6、特殊用户:

[root@A01-R07-I165-88 cron]# crontab -l
# Lines below here are managed by Salt, do not edit
@reboot /root/cgroup_mkdir.sh

  
@reboot是指在开机后运行,且只运行一次,效果跟设置在/etc/rc.local中一样。

另外还有:

string            meaning 
------           ------- 
@reboot        Run once, at startup. 
@yearly         Run once a year, "0 0 1 1 *". 
@annually      (same as @yearly) 
@monthly       Run once a month, "0 0 1 * *". 
@weekly        Run once a week, "0 0 * * 0". 
@daily           Run once a day, "0 0 * * *". 
@midnight      (same as @daily) 
@hourly         Run once an hour, "0 * * * *".

2.7、每10秒运行一次:

未分类

三、通过salt来管理crontab:

新增一条记录:
salt -L '*' cron.set_job yarn '10' '9' '1' '*' '*' 'source /home/yarn/.bashrc;find /sys/fs/cgroup/cpu/hadoop-yarn -mtime +15 -name "container_*" -exec rm -rf {} ;' "rm the container files"
查看记录:
salt '*' cron.raw_cron yarn
删除记录:
salt '*' cron.rm_job yarn 'source /home/yarn/.bashrc;find /sys/fs/cgroup/cpu/hadoop-yarn -mtime +15 -name "container_*" -exec rm -rf {} ;' minute='10'

saltstack自动安装配置HAproxy

下载haproxy1.6.2.tar.gz

下载地址:http://www.haproxy.org/download/1.6/src/

1、编写功能模块

1.1 首先编写依赖安装模块

# mkdir -p /srv/salt/prod/pkg /srv/salt/prod/haproxy /srv/salt/prod/haproxy/files 
# cd /srv/salt/prod/pkg

# cat pkg-init.sls 
pkg-init:
pkg.installed:
- names:
- gcc
- gcc-c++
- glibc
- make
- autoconf
- openssl
- openssl-devel

1.2 编写HAproxy状态模块

如何写状态模块?
安装一遍,记录安装步骤

手动安装步骤:

安装依赖

# yum install gcc gcc-c++ glibc make autoconf openssl openssl-devel
cd /usr/local/
tar -zxf haproxy-1.6.2.tar.gz
cd /usr/local/haproxy-1.6.2

2、将配置文件,启动文件等拷贝到/srv/salt/prod/haproxy/files下

2.1 获取启动脚本,并copy到/srv/salt/prod/haproxy/files/

# mv haproxy-1.6.2.tar.gz /srv/salt/prod/haproxy/files/
# cd /srv/salt/prod/haproxy/files/
# tar zxf haproxy-1.6.2.tar.gz
# cd haproxy-1.6.2/examples/
# vim haproxy.init
BIN=/usr/local/haporxy/sbin/$BASENAME

# cp haproxy.init /srv/salt/prod/haproxy/files/

# cd /srv/salt/prod/haproxy/files
# rm -rf haproxy-1.6.2

2.1 编写install.sls

不在这里写配置文件,是为了解耦。因为安装和启动时原子操作,在哪都必须,但是配置文件,在不同环境下是不一样的

# cd /srv/salt/prod/haproxy/
# vim install.sls

include:
- pkg.pkg-init
haproxy-install: 
file.managed: 
- name: /usr/local/src/haproxy-1.6.2.tar.gz
- source: salt://haproxy/files/haproxy-1.6.2.tar.gz
- user: root
- group: root
- mode: 755
cmd.run:
- name: cd /usr/local/src && tar zxf haproxy-1.6.2.tar.gz && cd haproxy-1.6.2 && make TARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
- unless: test -d /usr/local/haproxy
- require:
- pkg: pkg-init
- file: haproxy-install
haproxy-init:
file.managed:
- name: /etc/init.d/haproxy
- source: salt://haproxy/files/haproxy.init
- user: root
- group: root
- mode: 755
- require:
- cmd: haproxy-install
cmd.run:
- name: chkconfig --add haproxy
- unless: chkconfig --list | grep haproxy
- require:
- file: /etc/init.d/haproxy
net.ipv4.ip_nonlocal_bind:
sysctl.present:
- value: 1
haproxy-config-dir:
file.directory:
- name: /etc/haproxy
- user: root
- group: root
- mode: 755

# salt '*' state.sls haproxy.install env=prod

注:
直接拷贝上面的配置文件执行可能会出错,建议进入vim状态后,使用set list命令,确保$符号和配置之间没有空格
并且层级关系是2、4、6个空格
建议先执行测试然后再实际配置修改

# salt '*' state.sls haproxy.install env=prod test=True

3、编写业务引用

3.1 HAproxy配置文件

# mkdir -p /srv/salt/prod/cluster/files
# cd /srv/salt/prod/cluster/files/ 
# vim /srv/salt/prod/cluster/files/haproxy-outside.cfg
global
maxconn 100000
chroot /usr/local/haproxy
uid 99 
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
maxconn 100000
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen stats
mode http
bind 0.0.0.0:8888
stats enable
stats uri /haproxy-status
stats auth haproxy:saltstack
frontend frontend_www_example_com
bind 192.168.3.11:80
mode http
option httplog
log global
default_backend backend_www_example_com
backend backend_www_example_com
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP/1.0
balance source
server web-node1 192.168.3.12:8080 check inter 2000 rise 30 fall 15
server web-node2 192.168.3.19:8080 check inter 2000 rise 30 fall 15

# cd ..
# vim /srv/salt/prod/cluster/haproxy-outside.sls
include:
- haproxy.install
haproxy-service:
file.managed:
- name: /etc/haproxy/haproxy.cfg
- source: salt://cluster/files/haproxy-outside.cfg
- user: root
- group: root
- mode: 644
service.running:
- name: haproxy
- enable: True
- reload: True
- require:
- cmd: haproxy-init
- watch:
- file: haproxy-service

# cd /srv/salt/base/
# vim top.sls
base:
'*':
- init.env_init
prod:
'*':
- cluster.haproxy-outside

执行安装配置

# salt '*' state.highstate

4、Web查看服务状态

从web登陆192.168.3.12:8888/haproxy-status
用户名和密码在/srv/salt/prod/cluster/files/haproxy-outside.cfg中

# grep 'auth' /srv/salt/prod/cluster/files/haproxy-outside.cfg
stats auth haproxy:saltstack

至此haproxy的配置完成

未分类

saltstack自动安装配置redis-3.2.8

一、准备redis自动化配置的文件

即安装一遍redis,然后获取相关文件和配置在salt中执行上线

1、 源码安装redis3.2.8并注册为系统服务

安装依赖

yum install -y tcl

1.1 下载安装包Redis-3.2.8.tar.gz

# cd /usr/local/src
# wget http://download.redis.io/releases/redis-3.2.8.tar.gz

1.2 解压及安装

[root@node2 src]# tar zxf redis-3.2.8.tar.gz
[root@node2 src]# cd redis-3.2.8/src/
[root@node2 redis-3.2.8]# make PREFIX=/usr/local/redis install #指定安装路径

1.3 创建配置文档,修改配置

创建配置文档路径

# mkdir /etc/redis
[root@node2 src]# cp ../redis.conf /etc/redis/redis_6350.conf

以下几个参数常用到

daemonize yes # 后台运行
bind 127.0.0.1 # 绑定ip,需要外网访问时将其注释掉
protected-mode yes # 保护模式,默认是开启的,需要其他客户端链接时,改为no关闭
requirepass redispass # 其他客户端链接时的密码
appendonly yes # 每次更新后记录日志
pidfile /var/run/redis_6350.pid # 如果不是默认的6379端口需要修改该行

1.4 注册系统服务,开机自启

创建启动脚本

# cp ../utils/redis_init_script /etc/rc.d/init.d/redis3

修改redis启动脚本,要修改的地方有

添加 chkconfig 注释

redis-server 、redis-cli 、pidfile、redis.conf路径

如果需要配置密码,还要在停止命令增加参数 -a 指定密码

[root@node2 src]# cat /etc/init.d/redis3 

#!/bin/sh
# chkconfig:   2345 90 10
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6350
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis_${REDISPORT}.conf"

usage(){
    echo "usage: $0 [start|stop|status|restart]"
}

redis_start(){
if [ -f $PIDFILE ]
    then
            echo "$PIDFILE exists, process is already running or crashed"
    else
            echo "Starting Redis server..."
            $EXEC $CONF
fi
}

redis_stop(){
    if [ ! -f $PIDFILE ]
    then
            echo "$PIDFILE does not exist, process is not running"
    else
            PID=$(cat $PIDFILE)
            echo "Stopping ..."
            $CLIEXEC -p $REDISPORT -a redispass shutdown
            while [ -x /proc/${PID} ]
            do
                echo "Waiting for Redis to shutdown ..."
                sleep 1
            done
            echo "Redis stopped"
    fi
}

redis_restart(){
    redis_stop
    sleep 1
    redis_start
}
redis_status(){
    ps -ef|grep redis|grep -v grep|grep -v status
}

main(){
    case "$1" in
        start)
            redis_start;;
        stop)
            redis_stop;;
        status)
            redis_status;; 
        restart)
            redis_restart;;
        *)
            usage;
    esac
}

main $1

保存后执行注册成系统服务:

chkconfig --add redis3
chkconfig redis3 on

完成后,可以使用 service redis3 start|stop 启动关闭redis服务

1.5 添加环境变量:

vim /etc/profile

在最后添加:

PATH=$PATH:/usr/local/redis/bin
export PATH

# 使配置生效
source /etc/profile

# service redis3 start
[root@node2 src]# ps -ef|grep redis
root     20818     1  0 09:57 ?        00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:6350
root     20827 14125  0 09:58 pts/0    00:00:00 grep --color=auto redis

用redis-cli 链接,set,get正常

[root@node2 src]# redis-cli -p 6350 -a redispass

127.0.0.1:6350> set name 2
OK
127.0.0.1:6350> get name
"2"
127.0.0.1:6350> set jack 18
OK
127.0.0.1:6350> get jack
"18"
127.0.0.1:6350> quit

二、salt相关的配置处理

# mkdir -p /srv/salt/prod/pkg /srv/salt/prod/redis /srv/salt/prod/redis/files 
# cd /srv/salt/prod/pkg

1、 初始化nginx相关配置文件

①下载redis-3.2.8.tar.gz上传到/srv/salt/prod/redis/files目录

②配置文件

[root@test7_chat_api_im files]# grep '^[a-Z]' redis_6350.conf 
bind 127.0.0.1
protected-mode yes
port 6350
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6350.pid
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
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
requirepass redispass
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
lua-time-limit 5000
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

③服务管理脚本

[root@test7_chat_api_im files]# cat redis3 
#!/bin/sh
# chkconfig:   2345 90 10
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6350
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis_${REDISPORT}.conf"

case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT -a redispass shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

2、 编写依赖包安装

vim /srv/salt/prod/pkg/pkg-init.sls

pkg-init:
  pkg.installed:
    - names:
      - gcc
      - gcc-c++
      - glibc
      - make
      - autoconf
      - openssl
      - openssl-devel
      - pcre
      - pcre-devel
      - glib
      - glib-devel
      - tcl

3、 用户添加模块

# mkdir /srv/salt/prod/user
# vim /srv/salt/prod/user/redis.sls 
redis-user-group:
  group.present:
    - name: redis
    - gid: 6350

  user.present:
    - name: redis
    - fullname: redis
    - shell: /sbin/nologin
    - uid: 6350
    - gid: 6350

4、 编写nginx状态模块

# cd /srv/salt/prod/redis
vim /srv/salt/prod/redis/install.sls

include:
  - pkg.pkg-init
  - user.redis
redis-source-install:
  file.managed:
    - name: /usr/local/src/redis-3.2.8.tar.gz
    - source: salt://redis/files/redis-3.2.8.tar.gz
    - user: root
    - group: root
    - mode: 755
  cmd.run:
    - name: cd /usr/local/src && tar zxf redis-3.2.8.tar.gz && cd cd redis-3.2.8/src/ && make PREFIX=/usr/local/redis install && chown -R redis:redis /usr/local/redis && mkdir /etc/redis
    - unless: test -d /usr/local/redis
    - require:
      - user: redis-user-group
      - file: redis-source-install
      - pkg: pkg-init

服务模块

# vim /srv/salt/prod/redis/service.sls 
include:
  - redis.install

redis-init:
  file.managed:
    - name: /etc/init.d/redis3
    - source: salt://redis/files/redis3
    - mode: 755
    - user: root
    - group: root
    - require:
      - cmd: redis-source-install
  cmd.run:
    - name: chkconfig --add redis3
    - unless: chkconfig --list | grep redis
    - require:
      - file: redis-init

/etc/redis/redis_6350.conf:
  cmd.run:
    - name: mkdir /etc/redis
  file.managed:
    - source: salt://redis/files/redis_6350.conf
    - user: redis
    - group: redis
    - mode: 644 

redis-service:
  service.running:
    - name: redis3
    - enable: True
    - restart: True
    - require:
      - cmd: redis-init
    - watch:
      - file: /etc/redis/redis_6350.conf

执行配置测试,没有问题再安装,至此salt安装redis服务已完毕:

# 先测试先处理一些简单的错误

salt 'test4_haili_dev' state.sls redis.service env=prod test=True

salt 'test4_haili_dev' state.sls redis.service env=prod

更换saltstack master服务器

1. 拷贝原来服务器的pki ,上传到要迁移的服务器服务器

[root@master salt]# tar -zcf pki.tar.gz pki/

[root@master salt]# ls
1.py  master  pki  pki.tar.gz

2.重启master服务(新服务器)

[root@bogon master]# /etc/init.d/salt-master restart

Stopping salt-master daemon:                               [确定]

Starting salt-master daemon:                                 [确定]

3.更改minion端配置文件

minion手动一台一台更改效率低

[root@minion salt]# vim /etc/salt/minion

master:ip地址改为要迁移的ip

批量更改:

在master端(旧)

[root@master salt]# salt '*' cmd.run "sed -i 's/128/131/' /etc/salt/minion"

minion1.lgl.com:

minion2.lgl.com:

4.验证

[root@master salt]# salt '*' cmd.run 'cat /etc/salt/minion | grep master'

5.重启master服务

[root@master salt]# salt '*' service.restart salt-minion

minion1.lgl.com:

    True

minion2.lgl.com:

    True

CentOS 6.7安装部署SaltStack配置管理工具

1.saltStack 服务架构介绍

SaltStack 是一种基于C/S架构的服务模式,在SaltStack架构中服务器端叫作Master,客户端叫作Minion,传统C/S架构为:客户端发送请求给服务器端,服务器端接收到请求并且处理完成后再返回给客户端。在SaltStack架构中不仅有传统的C/S架构服务模式,而且有消息队列中的发布与订阅(pub/sub)服务模式。这使得SaltStack应用场景更加丰富。目前在实际环境中一般使用SaltStack的C/S架构进行配置管理。

在Master和Minion端都是以守护进程的模式运行,一直监听配置文件里面定义的ret_port(接受minion请求,默认端口号:4506)和publish_port(发布消息,默认端口号:4505)的端口。当Minion运行时会自动连接到配置文件里面定义的Master地址ret_port端口进行连接认证。默认客户端请求id是socket.getfqdn()取到的值,也可以在Minion启动之前修改Minion的id值。

2.安装部署

[root@zabbix salt]# cat /etc/redhat-release
CentOS release 6.7 (Final)

安装 epel yum源

在 Master 端和 Minion 端都需要安装 epel 的 yum源

rpm -ivh http://mirrors.zju.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm

3.安装 Master 端

yum -y install salt-master
/etc/init.d/salt-master start

Starting salt-master daemon: [确定]

chkconfig salt-master on

SaltStack Master 端版本号

[root@SaltStack-Master ~]# salt-master --version
salt-master 2015.5.10 (Lithium)

4.安装 minion 端

yum -y install salt-minion
sed -i 's/#master: salt/master: 192.168.10.10/g' /etc/salt/minion # 指定 master 的ip地址
/etc/init.d/salt-minion start
chkconfig salt-minion on

SaltStack Minion 端版本号

[root@SaltStack-Minion-node01 ~]# salt-minion --version
salt-minion 2015.5.10 (Lithium)

5.C/S认证

salt-key -L 查看当前需要接受的keys(master和minions都需要把服务开启)。

系统管理

-A参数,该参数意思是接受所有认证主机的认证,也可以使用 -a id名 只认证单独的主机

系统管理

如果对客户端信任,可以让master自动接受请求,在master端/etc/salt/master配置

    auto_accept: True

6、命令执行

测试master和minion之间的通信是否正常

系统管理

True代表正常,*代表所有主机,也可以选择单台或者按组及正则进行匹配等

命令执行使用cmd.run参数

系统管理