基础篇

--------------------------------------------------------------------------------------------------------

  概述:SaltStack简单来说是一个基础架构管理工具,这个比较抽象,说白就是一个运维管理工具,底层是使用python实现,C/S架构,支持分布式部署,据说可以轻松管理上W台服务器,和Puppet这类工具很类似,其主要的功能:

  1. 基于Key的远程连接并执行命令;

  2. 强大的搜索器,多种方式过滤服务器;

  3. 灵活的远程部署实现方式;

  4.  基于YMAL格式对文件,用户,用户组及服务等资源灵活管理;

极简易安装


  本实例采用CentOS6.5_x86_64操作系统,在安装之前请先配置好Yum


 salt-master服务端安装

1
2
3
yum  - y install salt - master     / 安装
rpm  - aq|grep salt - master     / 检测
salt - master配置文件:  / etc / salt / master


 salt-minion客户端安装

1
2
3
yum  - y install salt - minion    / 安装
rpm  - aq|grep salt - minion    / 检测
salt - minion配置文件:  / etc / salt / minion


添加客户端


1
2
3
4
5
6
salt - key  - L     / 列出所有key,key格式是minion - id ,如果没有配置minion - id ,则是主机名
salt - key  - A     / 接受所有key
salt - key  - a  “ZK - YJY - APP - 01 ”    / 接受指定的key
salt - key  - R     / 拒绝所有未接受的key
salt - key  - D      / 删除所有key
salt - key  - d  “ZK - YJY - APP - 01 ”    / 删除指定的key


Target搜索器


  添加了minionkey后就可以免密码将命令传输到minion,并把执行结果返回来,方便的进行批量操作了,想象一下,如果有上W台服务器,而只想查看某些服务器的配置信息,怎么实现  当然要有一个目标搜索器才行,saltstacktarget搜索器非常强大,基于minionid进行匹配,所以我们在部署minion之前要事先对minionid做好规划(如果不配置minionid,则默认是使用主机名,也要对主机名做好规划)

 glob方式

1
2
salt “ * ” test.ping   
salt “ZK - YJY - APP - 01 ” test.ping

正则表达式

1
2
3
salt  “web * ” test.ping
salt  “web[ 0 - 9 ]NaNdb?” test.ping
salt  “web - [x - z]” test.ping

 grains

1
2
salt  - G “os:CentOS” test.ping
salt  - "cpuarch:x86_64" test.ping

 基于IP

1
2
salt  - "192.168.153.130" test.ping
salt  - "192.168.153.0/24" test.ping

 基于节点组

需要先在/etc/salt/master中定义nodegroups,如下:

1
2
3
4
nodegroups:
       group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com’
       group2:  'G@os:Debian and foo.domain.com'
       group3:  'L@webserver01,webserver02'
1
salt  - Ngroup3 test.ping

 复合方式

本质是上面的方式结合在一起,形成更为复杂的条件:

1
salt  - 'webserv* and G@os:Debian orE@web-dc1-srv.*'  test.ping


Grains是啥


  grains简单来说就是一个字典,{“os”:CentOS, “num_cpus”:8},字典就是这样的key-value的键值对的一个无序集合,里面存放着minion端的所有配置信息,

列出配置信息的分类,其实就是查看有哪些key

1
salt “ * ” grains.ls

列出配置信息的分类和具体分类信息,其实就是查看key-value

1
salt “ * ” grains.items

 列出某个配置信息项的具体信息

1
salt “ * ” grains.item cpu_model

 

==========================================================================================

 

进阶篇States

-------------------------------------------------------------------------------------------------------

  这篇是为自动化部署作准备的,核心就是弄清楚States的使用技巧


YAML基本格式


1
2
3
4
nginx_package:       / / 声明 id
       file .managed:        / / 文件模板的managed函数,作用是实现从master下载文件
           -  name:  / tmp / nginx - 1.8 . 0.tar .gz     / / 定义名称空间
           -  source: salt: / / nginx / files / nginx - 1.8 . 0.tar .gz    / / 指定文件在master上的位置

难点说明:

 saltstackYMAL格式通常以声明id开始,名称空间会覆盖id,也就是说,如果没有name,则id就是name,如果有nameid只作为标识,且在一个sls文件中,id不能重复,在states中有很多模块函数,可以对文件,用户,用户组,服务,定时任务等资源进行操作,我们只要调用并定义一些参数即可。

这里要注意下缩进和空间,仔细观察就明白了


条件判断和先决条件

1
2
3
4
5
6
7
8
extract_nginx:     / / 声明 id
       cmd.run:     / / 这个模块是表示要执行一些系统命令
         -  cwd:  / tmp     / / 切换到指定目录下
         -  names:    / / 具体的命令,如果有多条可依次向下排列
           -  tar zxf nginx - 1.8 . 0.tar .gz
         -  unless: test  - / tmp / nginx - 1.8 . 0      / / 这里是一个条件判断
         -  require:   / / 先决条件
           -  file : nginx_source    / / 具体条件

难点说明:

  第一个要注意的地方是unless这个判断条件,这个条件如果返回falsecmd.run才执行,否则不执行,unless可以很好的控制同步配置后重复执行某些命令

  第二个需要注意的地方是先决条件require,先决条件除了require之外还是watch,但require可以用在任何模块中,watch只能用在service.running模块中


用户和组模块


1
2
3
4
5
6
7
8
9
10
11
12
nginx_user:    / / 声明 id
   user.present:     / / 用户管理模块,以下是一些参数
         -  name: nginx  
         -  uid:  121
         -  gid:  121
         -  createhome: false
         -  shell:  / sbin / nologin
         -  require:   / / 先决条件,表示要创建nginx用户先创建nginx这个组
           -  group: nginx   
    group.present:
         -  name: nginx
            -  gid:  121


服务模块


1
2
3
4
5
6
7
nginx_service:      / / 声明 id
   service.running:       / / 服务运行模块
     -  name: nginx
     -  enable:  True
     -  reload True
     -  watch:     / / 监测以下条件是否变化,如果改变则重启服务
       -  file / usr / local / nginx / conf / nginx.conf

  我开始以为是修改minionnginx配置会自动重启,后面验证不对,应该是修改了masternginx的配置源文件,执行同步才会重启,使minionnginx配置文件始终与master配置文件保持一致,这个是我测试的结果,也可能理解有误,后面再去研究吧。

 

Template模板


1
2
3
4
{ %  for  usr  in [ 'moe' , 'larry' , 'curly' % }
     {{ usr }}:
         user.present
{ %  endfor  % }

        这个就是python中的模板标签的定义{%%}{{}}在,sls中,或者在配置源文件中都可以使用模板标签。

1
2
3
4
5
6
7
apache:    
     pkg.installed:
     { %  if  grains[ 'os' = = 'RedHat'  % }
         -  name: httpd
     { %  elif  grains[ 'os' = = 'Ubuntu'  % }
         -  name: apache2
     { %  endif  % }

使用模板可以比较灵活的对可变的部分进行控制


include引入


        如果有多个sls文件,我们可以在一个sls文件中引入另一个sls,在init.sls文件顶部添加如下内容:

1
2
3
include:
     -   install.sls
     -   conf.sls

 


批量部署nginx


        有了以上的基础,就可以很方便的部署任何软件包了,这里重点讲下步骤:

 编辑master配置文件,将如下内容注释去掉

1
2
3
file_roots:
        base:     / / 此处的base标识在top.sls文件中引用
          -  / srv / salt    / / 配置管理文件存放的root目录

当然,这里可以根据需要创建多个不同的file_roots目录

创建指定的目录

        默认/srv目录下是空的,需要创建salt目录

创建top.sls文件

        在/srv/salt目录下创建top.sls文件

1
2
3
4
base:    / / 此处的base即在file_roots中定义的base
   '*' :   / / 这里是表示target目标,可以使用搜索器定义
     -  nginx.install      / / 表示file_roots目录下的nginx目录下的install.sls
     -  nginx.conf     / / 表示file_roots目录下的nginx目录下的conf.sls

  top.sls是一个入口文件,master同步时首先会去读取top.sls ,通过top.sls去找对应目录下的其它sls文件

编写install.slsconf.sls

        此处略去无数行

将软件包和配置文件和启动脚本放到指定目录

        你懂的

        网上有大量的部署配置,推荐一些比较好的网址,个人建议学saltstack之前最好有一些python基础,毕竟是python写的

http://blog.cunss.com/?p=272

http://docs.saltstack.cn/zh_CN/latest/

https://docs.saltstack.com/en/latest/