集中化管理saltstack

更新线上3台web nginx配置(53、54、77)
1、ssh到Master(192.168.101.52)
2、修改/srv/salt/nginx/vhosts/路径下的配置文件,保存
3、执行刷新state配置,将同步修改minion web服务器的指定配置文件# salt -N 'webgroup' state.highstate
4、检查nginx配置是否存在语法错误# salt -N 'webgroup' cmd.run '/usr/local/nginx/sbin/nginx -t'
5、重启nginx服务# salt -N 'webgroup' cmd.run '/usr/local/nginx/sbin/nginx -s reload'

更新线上3台web php配置(53、54、77)
1、ssh到Master(192.168.101.52)
2、修改配置文件/srv/salt/nginx/php.ini,保存
3、执行刷新state配置,将同步修改minion web服务器的指定配置文件# salt -N 'webgroup' state.highstate
4、重启php服务# salt -N 'webgroup' cmd.run 'server php-fpm restart'

更新线上3台mysql配置(55、56、77)
1、ssh到Master(192.168.101.52)
2、修改配置模版文件/srv/salt/mysql/my.cnf,保存
3、重启mysql服务,使修改后的配置生效
# salt -N 'mysqlgroup' cmd.run 'server mysqld restart'


saltstack 是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能。saltstack基于python语言实现。saltstack具备如下特点:
部署简单、方便。
支持大部分UNIX/Linux及Windows环境。
主从集中化管理。
配置简单、功能强大、扩展性强。
主控端(master)和被控端(minion)基于证书认证,安全可靠。
支持API及自定义模块,可通过Pyhton轻松扩展。

角色     id         ip  
Master    -    192.168.101.52
minion     53-web    192.168.101.53
minion     54-web    192.168.101.54
minion     77-web    192.168.101.77
minion     55-db2    192.168.101.55
minion     56-db1    192.168.101.56

1、安装saltstack
安装epel,目前RHEL官网yum源还没有Saltstack的安装包支持,因此先安装EPEL作为部署Saltstack的默认yum源。
     RHEL(CentOS)6版本:rpm -Uvh下载地址:http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
(1)主服务器安装(主控端)
  #yum install salt-master -y
  #chkconfig salt-master on
  #service salt-master start
 (2) 从服务器安装(被控端)
  #yum install salt-minion -y
  #chkconfig salt-minion on
  #service salt-minion start

2、saltstack配置
(1)master主控端配置
  # cat /etc/salt/master
interface: 192.168.101.52  # 绑定Master通信IP
auto_accept: True      # 自动认证,不需要手动运行salt-key来确认证书信任
file_roots:        # 指定Saltstack 文件根目录位置
  base:
    - /srv/salt    
(2)重启saltstack salt-master服务使新配置生效
   #service salt-master restart
(3)minion被控端配置,重启生效(#service salt-minion restart)
  # cat /etc/salt/minion
master:192.168.101.52     #指定master主机IP地址
id:53-web          #修改被控端主机识别id
 (4)master添加hosts
     [root@lvss ~]# cat /etc/hosts
      192.168.101.53    53-web
      192.168.101.54    54-web
      192.168.101.77    77-web
      192.168.101.56    56-db1
      192.168.101.55    55-db2
 (5)校验安装结果,测试被控端与主控端是否建立信任关系和连通性是否正常
    # salt '53-web' test.ping

3、利用saltstack远程执行命令
saltstack 一个比较突出优势是具备执行远程命令的功能,可以集中化操作平台
命令格式:salt '<操作目标>'<方法>[参数]
例如:查看被控主机的内存使用情况。
# salt '53-web' cmd.run 'free -m'

针对<操作目标>,saltstack提供了多种方法对被控端主机(id)进行过滤,常用具体参数。
  (1) -E,--pcre 正则表达式匹配
  (2) -L,--list 以主机id名列表的形式进行过滤
如:# salt -L '53-web,56-db1' cmd.run 'df -h'
  (3) -G,--grain 根据被控主机的grains信息进行匹配过滤
如:# salt -G 'os:centos' cmd.run 'python -V'   //获取主机系统为centos的python版本号
  (4) -I, --pillar 根据被控主机的pillar信息进行匹配过滤
如:# salt -I 'nginx:root:/data/vhost/' test.ping
  (5) -N, --nodegroup 根据主控端master配置文件中的分组名称进行过滤
  (6) -C, --compound 根据条件运算符not、and、or去匹配不同规则
  (7) -S, --ipcidr 根据被控主机的IP地址或IP子网进行匹配


4、saltstack常用模块及API
saltstack提供了丰富的功能模块,涉及操作系统的基础功能、常用工具支持等,也可以通过sys模块列出当前版本支持的模块。
[root@lvss ~]# salt '53-web' sys.list_modules
53-web:
    - acl
    - aliases
    - alternatives
    - archive
    - artifactory
    - blockdev
    - btrfs
    - buildout
    - cloud
    - cmd
    - composer
    - config
    - container_resource
    - cp
    - cron

(1)cmd模块’
1)功能:实现远程的命令行调用执行(默认具备root操作权限,使用时需评估风险)
2)示例:
salt '*' cmd.run "free -m"    #获取所有被控主机的内存使用情况
3)API调用:
client.cmd('53-web','cmd.run',['free -m'])

(2)cp模块
1)功能:实现远程文件、目录的复制,以及下载URL文件等操作
2)示例:
#将指定被控主机的/etc/hosts文件复制到被控主机本地的salt cache目录(/var/cache/salt/minion/localfiles/);
salt '*' cp.cache_local_file /etc/hosts

#将主服务器file_roots 指定位置下的文件复制到被控主机
salt '*' cp.get_file salt://path/to/file /minion/dest
3)API调用:
client.cmd('53-web','cp.get_file',['salt://path/to/file','/minion/dest'])

(3)file 模块
1)功能:被控主机文件常用操作,包括文件读写、权限、查找、校验等。
2)示例:
#修改所有被控主机/etc/passwd文件的属组、用户权限,等价于chown root:root /etc/passwd
salt '*' file.chown /etc/passwd root root

#复制所有被控主机本地/path/to/src 文件到本地的/path/to/dest文件
salt '*' file.copy /path/to/src /path/to/dest

#获取所有被控主机/etc/passwd 的权限mode,如755、644
salt '*' file.get_mode /etc/passwd

#删除所有被控主机的/tmp/foo文件
salt '*' file.remove /tmp/foo
....
3)API调用:
client.cmd('*','file.remove',['/tmp/foo'])

5、grains 组件
grains是saltstack最重要的组件之一,grains的作用是收集被控主机的基本信息,这些信息通常都是一些静态类的数据,包括CPU、内核、操作系统、虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理员可以利用这些信息对不同业务进行个性化配置

(1)grains常用操作命令
匹配系统版本为centos的主机:
salt -G 'os:centos' cmd.run 'uname -a'
获取所有主机的grains项信息:
salt '*' grains.ls
获取主机单项grains数据,如获取操作系统发行版本:
salt '53-web' grains.item os
[root@lvss ~]# salt '53-web' grains.item os
53-web:
    ----------
    os:
        CentOS

(2)定义grains数据
定义grains数据的方法有两种,其中一种为在被控主机定制配置文件,另一种是通过主控端扩展模块API实现,区别是模块更灵活,可以通过Python编程动态定义,而配置文件只适合相对固定的键与值

被控端主机定制grains数据
# cat /etc/salt/minion.d/hostinfo.conf
grains:
  roles:
    - webserver
    - memcache
  deployment: datacenter4
  cabinet: 13
重启被控主机salt-minion服务,使之生效。验证结果在主控端运行:
# salt '64-lvs' grains.item roles deployment cabinet
64-lvs:
    ----------
    cabinet:
        13
    deployment:
        datacenter4
    roles:
        - webserver
        - memcache

主控端扩展模块定制grains数据
首先在主控端编写python代码,然后将该python文件同步到被控主机,最后刷新生效(即编译python源码文件成字节码pyc)。在主控端bash目录(/etc/salt/master配置文件的file_roots项,默认的base配置在/srv/salt)下生成_grains目录,执行install -d /srv/salt/_grains开始编写代码

# cat /srv/salt/_grains/nginxgrains.py
#!/usr/bin/python
import os,sys,commands

def NginxGrains():

    grains = {}
    max_open_file=65536

    try:
        getulimit=commands.getstatusoutput('source /etc/profile;ulimit -n')
    except Exception,e:
        pass
    if getulimit[0]==0:
        max_open_file=int(getulimit[1])
    grains['max_open_file'] = max_open_file
    return grains

6、pillar组件
pillar也是saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用,如模版、state、API等,在pillar中定义的数据与不同业务特性的被控主机相关联,这样不同被控主机只能看到自己匹配的数据,因此pillar安全性很高,适用于一些比较敏感的数据,这也是区别与grains最关键的一点,如定义不同业务组主机的用户id、组id、读写权限、程序包等信息,定义的规范是采用python字典形式,即键/值,最上层的键一般为主机的id或组名称。

pillar定义
(1)主配置文件定义
saltstack 默认将主控端配置文件中的所有数据都定义到pillar中,而且对所有被控主机开放,修改/etc/salt/master配置中的pillar_opts:Ture 开启这项功能
# salt '53-web' pillar.data
(2)SLS文件定义
pillar 支持sls文件中定义数据,与state组件十分相似,两者文件的配置格式、入口文件top.sls都是一致的。
1)定义pillar的主目录
pillar_roots:          
  base:
    - /srv/pillar
2)定义入口文件top.sls
入口文件的作用一般是定义pillar的数据覆盖被控主机的有效域范围,“*”代表任意主机,其中包括了一个data.sls文件
# cat /srv/pillar/top.sls
base:
  '*':
    - data

# cat /srv/pillar/data.sls
appname: website
flow:
  maxconn: 30000
  maxmem: 6G
3)校验pillar
# salt '64-lvs' pillar.data appname flow
64-lvs:
    ----------
    appname:
        website
    flow:
        ----------
        maxconn:
            30000
        maxcpu:
            2
        maxmem:
            6G


7、定义state
state是saltstack最核心的功能,通过预先定制好的sls(salt state file)文件对被控主机进行状态管理,支持包括程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等
state的入口文件与pillar一样,文件名称都是top.sls,但state要求sls文件必须存放在saltstack base定义的目录下,默认为/srv/salt。state描述配置.sls支持jinjia模版、grains及pillar引用等,在state逻辑层次定义完成后,再通过salt '*' state.highstate 执行生效

# cat /srv/salt/top.sls
base:
  '*':
    - nginx

# cat /srv/salt/nginx.sls
nginx:
  file.managed:
   - source: salt://nginx/vhosts/nginx.conf
   - name: /usr/local/nginx/conf/nginx.conf
   - user: root
   - group: root
   - mode: 644
   - template: jinja






基于saltstack实现nginx配置集中管理
主控端配置(192.168.101.52)
  # cat /etc/salt/master (配置片段)
   interface: 192.168.101.52  # 绑定Master通信IP
   auto_accept: True      # 自动认证,不需手动运行salt-key来确认证书信任
   file_roots:          # 指定Saltstack 文件根目录位置
  base:
    - /srv/salt          #目录不存在,自己创建
   pillar_roots:           #定义pillar的主目录
  base:
    - /srv/pillar    #目录不存在,自己创建
   nodegroups:             #根据业务类型划分分组
   webgroup: 'L@53-web,54-web,77-web'

(1)定义grains数据,使用python编写grains_module,实现动态配置被控主机grains的max_open_file键,值为ulimit -n的结果。以便动态生成nginx.conf中的worker_rlimit_nofile、worker_connections参考的值。nginx还需要监听本IP,利用ip访问,因web服务器不同,ip地址也不同。
[root@lvss ~]# cat /srv/salt/_grains/nginxgrains.py
#!/usr/bin/python
import os,sys,commands

def NginxGrains():              #获取max_open_file键

    grains = {}
    max_open_file=65536

    try:
        getulimit=commands.getstatusoutput('source /etc/profile;ulimit -n')
    except Exception,e:
        pass
    if getulimit[0]==0:
        max_open_file=int(getulimit[1])
    grains['max_open_file'] = max_open_file
    return grains

def myip():                            #获取被控主机本地ip地址
    grains = {}
    grains['myip']=commands.getoutput("ifconfig | grep Bcast | awk '{print $2}' | awk -F ':' '{print $2}'")
    return grains

同步grains模块到被控端主机,运行:
# salt '*' saltutil.sync_all  
同步模块后,文件已经同步到被控主机minion cache目录中,如下:
/var/cache/salt/minion/extmods/grains/nginxgrains.py  #该目录为扩展模块文件最终存放位置
/var/cache/salt/minion/files/base/_grains/nginxgrains.py  #为临时存放位置

刷新模块使其生效(让minion编译模块),运行:
# salt '*' sys.reload_modules
刷新模块,在/var/cache/salt/minion/extmods/grains/位置多了一个编译后的字节码文件nginxgrains.pyc文件

验证max_open_file key的key及ip操作命令
#salt -N 'webgroup' grains.item max_open_file myip   # -N 根据master配置文件中的分组名进行过滤


(2)配置pillar
通过/etc/salt/master中定义好的组信息webgroup,引用webgroup/init.sls
在入口文件top.sls中引用二级配置有两种方式:一种是直接引用,直接引用webserver.sls文件;另一种是创建webserver目录,在引用目录中的init.sls文件,两者效果是一样的,本例中采用的第二种。
# cat /srv/pillar/top.sls    #入口文件top.sls
base:
  webgroup:               #webgroup表示webgroup组,是前面master配置文件里面定义的
    - match: nodegroup
    - webserver

pillar配置web_root的数据
# cat /srv/pillar/webserver/init.sls
nginx:                        #定义state名称,通常采用与描述的对象保持一致的方法
    root: /data/vhost/

查看设定的pillar信息,webgroup组包含了53-web主机,所以可以看到我们定义的数据,如果结果不符合预期,可以尝试刷新被控主机pillar数据
运行 #salt '*' saltutil.refresh_pillar



(3)配置state
# tree /srv/salt/
/srv/salt/
├── _grains
│   └── nginxgrains.py
├── nginx
│   ├── init.sls
│   ├── nginx.sls
│   ├── vhosts
│   │   ├── m.ihuiye.cn.conf
│   │   ├── news.ihuiye.cn.conf
│   │   ├── nginx.conf
│   │   ├── weixin.ihuiye.cn.conf
│   │   ├── www.ihuiye.cn.conf
│   │   └── www.stboss.com.conf
│   └── vhosts.sls
└── top.sls

定义入口文件top.sls
# cat /srv/salt/top.sls
base:
  webgroup:
    - match: nodegroup
    - nginx

将nginx/nginx.sls、nginx/vhosts.sls文件加载进来
# cat /srv/salt/nginx/init.sls
include:
  - nginx.nginx
  - nginx.vhosts

# cat /srv/salt/nginx/nginx.sls
nginx:
  file.managed:
   - source: salt://nginx/vhosts/nginx.conf    #nginx.conf模版文件
   - name: /usr/local/nginx/conf/nginx.conf    #minion端nginx.conf配置文件路径
   - user: root                      #所属用户
   - group: root                      #所属组
   - mode: 644                      #权限
   - template: jinja                      #使用jinja模版

虚拟主机配置文件
# cat /srv/salt/nginx/vhosts.sls
vhostsconfig:
  file.managed:
   - source: salt://nginx/vhosts/www.ihuiye.cn.conf
   - name: /usr/local/nginx/conf/vhosts/www.ihuiye.cn.conf
   - user: root
   - group: root
   - mode: 644
   - template: jinja
newsconfig:
  file.managed:
   - source: salt://nginx/vhosts/news.ihuiye.cn.conf
   - name: /usr/local/nginx/conf/vhosts/news.ihuiye.cn.conf
   - user: root
   - group: root
   - mode: 644
   - template: jinja
mconfig:
  file.managed:
   - source: salt://nginx/vhosts/m.ihuiye.cn.conf
   - name: /usr/local/nginx/conf/vhosts/m.ihuiye.cn.conf
   - user: root
   - group: root
   - mode: 644
   - template: jinja

配置文件模版
# cat /srv/salt/nginx/vhosts/nginx.conf
user www;
pid /var/run/nginx.pid;
worker_processes {{ grains['num_cpus'] }};
{% if grains['num_cpus'] == 2 %}
worker_cpu_affinity 01 10;
{% elif grains['num_cpus'] == 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% elif grains['num_cpus'] >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_rlimit_nofile {{ grains['max_open_file'] }};
.....


# cat /srv/salt/nginx/vhosts/www.ihuiye.cn.conf
server {
  listen       80;
  server_name  www.ihuiye.cn *.co.ihuiye.cn 192.168.101.11 {{ grains['myip'] }};   # 前面设置的grains 本地ip{{ grains['myip'] }}
  root   /data/vhost/www.huiyewang.com;    #根目录都一致,所以没有利用之前pillar定义的 {{ pillar ['nginx']['root'] }}
  index  index.php index.htm index.html;
  #charset koi8-r;
  error_page 404 /404.html;
  access_log /data/log/nginx/access.log cain;
  rewrite_log on;
  ....

执行刷新state配置,同步修改minion的nginx配置
# salt -N 'webgroup' state.highstate


检查nginx配置是否与设置的一致,并重启nginx服务,使更改配置生效
# salt -N 'webgroup' cmd.run '/usr/local/nginx/sbin/nginx -t'

# salt -N 'webgroup' cmd.run '/usr/local/nginx/sbin/nginx -s reload'
# salt -N 'webgroup' cmd.run 'ps aux | grep nginx'     #nginx已成功重启




附:
1、Salt Minion可以通过 salt-call 命令开始运行属于它自己的highstate.
$ salt-call state.highstate

minion将会检查在master上的配置以确保当前自己处于正确的配置状态.

posted @ 2018-01-30 14:15  飞鹰之歌  阅读(186)  评论(0)    收藏  举报