简介

SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)

与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。有如下特性:

(1)、部署简单、方便;

(2)、支持大部分UNIX/Linux及Windows环境;

(3)、主从集中化管理;

(4)、配置简单、功能强大、扩展性强;

(5)、主控端(master)和被控端(minion)基于证书认证,安全可靠;

(6)、支持API及自定义模块,可通过Python轻松扩展。

通过部署SaltStack环境,我们可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。


SaltStack master启动后默认监听4505和4506两个端口。


4505(publish_port)为saltstack的消息发布系统,


4506(ret_port)为saltstack被控端与服务端通信的端口。


如果使用lsof 查看4505端口,会发现所有的minion在4505端口持续保持在ESTABLISHED状态。minion与master之间的通信模式如下:

集中化管理平台saltstack--原理及部署_集中化管理平台saltstack--原理

被控端直接于主控端的zeromq建立长连接,接收广播到的任务消息并执行。即在主控端配置iptables规则:

  iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT

  iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4506 -j ACCEPT

saltstack认证原理:


1)、minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。


2)、master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在

master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就

能对minion发送指令了。

依赖情况:

集中化管理平台saltstack--原理及部署_集中化管理平台saltstack--原理_02

SaltStack的通信模式分为2种模式:ZeroMQ、REAT,鉴于REAT目前还不是太稳定,选择ZeroMQ模式


安装

本例采用centos6。5默认的Python2。6。6。。若更改Python版本,

同时要修改

# vim /usr/bin/yum。


此处仅介绍通过yum安装saltstack。


默认的yum 源没有saltstack包,需要改为epel 源。


https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm


若安装时出现报错:

 Error: Package: salt-2015.5.10-2.el6.noarch (epel)

            Requires: python-requests

 Error: Package: salt-2015.5.10-2.el6.noarch (epel)

            Requires: PyYAML

  You could try using --skip-broken to work around the problem

  You could try running: rpm -Va --nofiles --nodigest


需要在/etc/yum.repos.d/加上centos自带的yum源--CentOS-Base.repo。


master端安装:yum -y install salt-master


        chkconfig salt-master on


minion端安装:yum -y install salt-minion


        chkconfig salt-minion on


调整salt配置并检验


注:saltstack的配置文件格式都是YAML 的,配置的时候需要注意语法


master端:


vi /etc/salt/master

interface: masterIP                 #绑定master通信IP。

auto_accept: True                  #设为自动认证,避免繁琐的手动运行salt-key确认证书信任。

file_roots:                      #指定salt文件根目录的位置    

  base:

     - /srv/salt                        

更改完成后启动该服务


minion端

vi /etc/salt/minion

master: masterIP                   #绑定master主机IP地址。

id: JYD-test-2                    #更改被控端主机识别id,建议用主机名来配置

更改完成后启动该服务


应用

salt-key -L            # 显示当前所有被控端id

-D   删除所有认证id     

-d id 删除某个id证书     

-A   接受所有id证书请求      

-a id 接受某个id证书请求

salt '*' test.ping                  # 测试所有主机的连通性(此处*为通配符)

salt -E '^JYD-test.*' cmd.run 'free -m'     # -E使用正则,cmd.run执行远程命令

-L  以主机id名列表的形式操作部分主机           

-G  根据被控主机的grains过滤(后续详细介绍)

-I  根据被控主机的pillar过滤 (后续详细介绍)    

-N  根据分组名称过滤(分组在/etc/salt/master里定义)

-C  根据条件符not and or 匹配       

-S  根据被控主机的IP或子网匹配




常用模块学习

(1)、cp模块(实现远程文件、目录的复制,以及下载URL文件等操作)(参数 cache_local_file、get_file、get_dir、get_url)

## 将主服务器file_roots指定位置下的目录复制到被控主机

# salt '*' cp.get_dir salt://hellotest /data

 

##将主服务器file_roots指定位置下的文件复制到被控主机

# salt '*' cp.get_file salt://hellotest/rocketzhang /root/rocketzhang

 

## 下载指定URL内容到被控主机指定位置

# salt '*' cp.get_url http://xxx.xyz.com/download/0/files.tgz /root/files.tgz


API调用:client.cmd('*','cp.get_dir',['salt://path/to/dir','/minion/dest'])

 

(2)、cmd模块(实现远程的命令行调用执行,默认是root权限,使用注意)

# salt '*' cmd.run 'netstat -ntlp'

API调用:client.cmd('*','cmd.run',['命令'])

★此模块较常用,可实现多个模块的功能。

 

(3)、cron模块(实现被控主机的crontab操作)(raw_cron查,cron.set_job加,rm_job删)

## 为指定的被控主机、root用户添加crontab信息

# salt '*' cron.set_job root '*/5' '*' '*' '*' '*' 'date >/dev/null 2>&1'

# salt '*' cron.raw_cron root

 

## 删除指定的被控主机、root用户的crontab信息

# salt '*' cron.rm_job root 'date >/dev/null 2>&1'


API调用:client.cmd('*','cron.rm_job',['root','命令']


(4)、dnsutil模块(实现被控主机通用DNS操作)

## 为被控主机添加指定的hosts主机配置项

# salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 test.com

API调用:client.cmd('*','dnsutil.hosts_remove',['/etc/hosts','域名']


(5)、file模块(被控主机文件常见操作,包括文件读写、权限、查找、校验等)(参数有check_hash md5加密值对比、get_sum 指定加密方式、chown、copy、dirctory_exists目录是否存在、stats、get_mode、set_mode、mkdir、sed内容修改、append追加、remove)

# salt '*' file.get_sum /etc/resolv.conf md5

# salt '*' file.stats /etc/resolv.conf

API调用:client.cmd('*',fiel.append /文件 "增加字段")


(6)、archive模块,在系统层面实现压缩包的调用(gzip,gunzip,tar,unzip等)

# salt '*' archive.gzip /tmp/abc.txt

API调用:client.cmd('*','archive.gunzip ',['/tmp/qq.gz'])


 

(7)、network模块(返回被控主机网络信息)(参数有 dig、ping、traceroute 跟域名,hwaddr 跟网卡、in_subnet 跟网段、interfaces、ip_addrs、subnet 无字段)

# salt '*' network.ip_addrs

# salt '*' network.interfaces

API调用:client.cmd('*','network.in_subnet','网段')

 

(8)、pkg包管理模块(被控主机程序包管理,如yum、apt-get等)(参数有 install、remove 跟软件包,upgrade升级所有)

# salt '*' pkg.install nmap

# salt '*' pkg.file_list nmap

API调用:client.cmd('*','pkg.upgrade')

 

(9)、service 服务模块(被控主机程序包服务管理)(参数有 enable、disable、reload、restart、start、stop、status)

# salt '*' service.enable crond

# salt '*' service.reload crond

API调用:client.cmd('*','service.stop' 'httpd')



1、安装

安装saltstack用EPEL源安装简单快捷,实际部署的时候可以将saltstack相关的rpm包放到本地的yum源用本地源安装。

安装EPEL源:

[root@saltstack ~]#wget -c http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

[root@saltstack ~]#rpm -ivh epel-release-6-8.noarch.rpm


安装salt-master,如果master要对自己进行配置管理则服务器master端本地也要安装minion


[root@saltstack ~]#yum install salt-master


#安装salt-minion可选


[root@saltstack ~]#yum install salt-minion

2、修改配置文件并启动服务。saltstack配置比较简单,一般不需要修改太多的参数。

salt-master端,暂时没有什么配置的,默认就好。


[root@saltstack ~]# grep -Ev "^#|^$" /etc/salt/master

file_roots:

  base:

    - /srv/salt

pillar_roots:

  base:

    - /srv/pillar

[root@saltstack ~]# salt-master -d


salt-minion端,配置 “master”项指向master的IP地址,配置 “id” 项为主机名(一般用主机名,也可以配成其它的标识符)


[root@minion01 ~]# grep -Ev "^#|^$" /etc/salt/minion

master: 192.168.186.134

id: minion01

[root@minion01 ~]# salt-minion -d

[root@minion01 ~]#

[root@minion02 ~]# grep -Ev "^#|^$" /etc/salt/minion

master: 192.168.186.134

id: minion02

[root@minion02 ~]# salt-minion -d

[root@minion02 ~]#

3、master认证端添minion的key,并做简单的存活测试。


salt-key管理所有的key,-L参数列出所有的key.”Unaccepted Keys”就是所有未认证minion端的key


[root@saltstack ~]# salt-key -L

Accepted Keys:

Unaccepted Keys:

minion01

minion02

Rejected Keys:


-A参数接纳(认证)所有未被接纳(认证)的key,-a参数认证单个指定的key。

[root@saltstack ~]# salt-key -A


The following keys are going to be accepted:

Unaccepted Keys:

minion01

minion02

Proceed? [n/Y] y

Key for minion minion01 accepted.

Key for minion minion02 accepted.


再查看下所有key的情况,可以看到”Accepted Keys”已经认证的key。

[root@saltstack ~]# salt-key -L

Accepted Keys:

minion01

minion02

Unaccepted Keys:

Rejected Keys:

用test.ping测试下minion端的存活,可以从返回值看到minion01和minion02在线

[root@saltstack ~]# salt \* test.ping

minion01:

    True

minion02:

    True

[root@saltstack ~]#

用test.ping命令测试时,如果等待的返回时间较长有可能是某些minion已经不在线了,可以用salt-run来查看所有minion的存活状态。

[root@saltstack ~]# salt-run manage.status

down:

up:

    - minion01

    - minion02

[root@saltstack ~]#


salt相关的管理命令:

salt-run manage.up # 查看存活的minion  

salt-run manage.down           # 查看死掉的minion

salt-run manage.down removekeys=True     # 查看down掉的minion,并将其删除

salt-run manage.status             # 查看minion的相关状态

salt-run manage.versions # 查看salt的所有master和minion的版本信息

salt-run jobs.active # 查看哪些系统任务还在处理中

salt-run jobs.list_jobs # 显示所有的已完成或部分完成的任务信息

salt '*' saltutil.running # 查看运行的jobs ID

salt \* saltutil.kill_job 20151209034239907625 # kill掉进程ID

salt -d # 查看帮助文档

salt -d|grep service # 查看service相关模块命令

salt '*' sys.doc # 查看帮助文档

salt-key  -L             # 查询所有接收到的证书

salt-key  -a <证书名>   # 接收单个证书

salt-key  -A             # 接受所有证书

salt-key  -d <证书名>   # 删除单个证书

salt-key  -D             # 删除所有证书

salt '*' service.get_all # 获取主机所有服务

salt '*' service.reload sshd # 重载sshd服务

salt '*' pkg.list_pkgs # 显示软件包版本列表

salt '*' pkg.version python # 显示软件包版本信息

salt '*' pkg.install httpd # 安装软件包

salt 'node1.com' service.status mysql # 查看mysql服务状态

salt 'node1.com' service.start mysql # 启动mysql服务

salt 'node1.com' cmd.run 'service mysql status' # 与上面一样查看服务

salt '*' sys.list_modules # 模块列表

salt-cp '*'  /etc/hosts   /etc/hosts # 把master上的hosts文件分发到所有主机

salt '*' cp.get_file salt://ceshi/b /tmp/test # 把salt-master端相应的文件,分发文件到minion端

salt '*' cp.get_dir salt://zabbix /tmp # 把salt-master端相应的目录,分发文件到minion端

salt '*' file.copy /tmp/zabbix.sls /tmp/sls # 把salt-master端对应文件拷贝到minion端相应目录下

salt '*' cmd.run 'uptime' # 远程命令执行测试



远程执行脚本:


'cmd.script:'

        salt '*' cmd.script salt://scripts/runme.sh

        salt '*' cmd.script salt://scripts/runme.sh 'arg1 arg2 "arg 3"'

        salt '*' cmd.script salt://scripts/windows_task.ps1 args=' -Input c:\tmp\infile.txt' shell='powershell'

        salt '*' cmd.script salt://scripts/runme.sh stdin='one\ntwo\nthree\nfour\nfive\n'

'cmd.shell:'

        This passes the cmd argument directly to the shell

        salt '*' cmd.shell "ls -l | awk '/foo/{print \$2}'"

        salt '*' cmd.shell template=jinja "ls -l /tmp/`grains`.`id` | awk '/foo/{print \$2}'"

        salt '*' cmd.shell "Get-ChildItem C:\ " shell='powershell'

        salt '*' cmd.shell "grep f" stdin='one\ntwo\nthree\nfour\nfive\n'

        salt '*' cmd.shell cmd='sed -e s/=/:/g'

'cmd.shells:'

        salt '*' cmd.shells

'cmd.tty:'

        salt '*' cmd.tty tty0 'This is a test'

        salt '*' cmd.tty pts3 'This is a test'

'cmd.which:'

        salt '*' cmd.which cat

grains选项:


salt '*' grains.ls                    # 查看grains分类

salt '*' grains.items                      # 查看grains所有信息

salt '*' grains.item osrelease                  # 查看grains某个信息

说明:state模块是salt state的管理模块,可以通过state模块简单的对minion操作sls状态


salt 'node1.com' state.highstate            # 更新指定minons的所有sls状态

salt 'node1.com' state.running              # 查看当前运行的sls状态

相关例子:


[root@master ~]# salt \* saltutil.running

node02.saltstack.com:

    |_

      ----------

      arg:

          -  egrep -v ^#

      fun:

          cmd.run

      jid:

          20170221141733009548

      pid:

          5922

      ret:

      tgt:

          *

      tgt_type:

          glob

      user:

          root

    |_

      ----------

      arg:

          - egrep -v ^#

      fun:

          cmd.run

      jid:

          20170221141748160358

      pid:

          5927

      ret:

      tgt:

          *

      tgt_type:

          glob

      user:

          root

node01.saltstack.com:

    |_

      ----------

      arg:

          -  egrep -v ^#

      fun:

          cmd.run

      jid:

          20170221141733009548

      pid:

          6252

      ret:

      tgt:

          *

      tgt_type:

          glob

      user:

          root

    |_

      ----------

      arg:

          - egrep -v ^#

      fun:

          cmd.run

      jid:

          20170221141748160358

      pid:

          6256

      ret:

      tgt:

          *

      tgt_type:

          glob

      user:

          root

[root@master ~]# salt \* saltutil.kill_job 20170221141748160358

node01.saltstack.com:

    Signal 9 sent to job 20170221141748160358 at pid 6256

node02.saltstack.com:

    Signal 9 sent to job 20170221141748160358 at pid 5927

[root@master ~]# salt \* saltutil.kill_job 20170221141733009548

node02.saltstack.com:

    Signal 9 sent to job 20170221141733009548 at pid 5922

node01.saltstack.com:

    Signal 9 sent to job 20170221141733009548 at pid 6252

[root@master ~]# salt \* saltutil.running

node01.saltstack.com:

node02.saltstack.com:

[root@master ~]# salt-run manage.versions 

Master:

    2015.5.10

Up to date:

    ----------

    node01.saltstack.com:

        2015.5.10

    node02.saltstack.com:

        2015.5.10

[root@RS1 states]# salt-run manage.status

down:

up:

    - minion.saltstack.com

    - minion2.saltstack.com

[root@RS1 ~]# salt-run manage.versions

#查看salt的所有master和minion的版本信息

Master:

    2015.5.10

Up to date:

    ----------

    minion.saltstack.com:

        2015.5.10

    minion2.saltstack.com:

        2015.5.10

[root@RS1 ~]# salt '*' test.ping -v


# 使用-v参数,能够查看到job的jid


Executing job with jid 20170214142709337088

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

minion.saltstack.com:

    True

minion2.saltstack.com:

    True

说明:每执行一个任务,都会有一个对应的jid

[root@RS1 ~]# salt '*' saltutil.running


# 查看minion当前正在运的jobs


minion2.saltstack.com:

    |_

      ----------

      arg:

      fun:

          state.highstate

      jid:

          20170214143846076337

      pid:

          5488

      ret:

      tgt:

          *

      tgt_type:

          glob

      user:

          root

minion.saltstack.com:

    |_

      ----------

      arg:

      fun:

          state.highstate

      jid:

          20170214143846076337

      pid:

          6384

      ret:

      tgt:

          *

      tgt_type:

          glob

      user:

          root

[root@RS1 ~]# salt '*' saltutil.kill_job 20170214143846076337

#取消正在执行的某个jid,例如:20170214143846076337

[root@master ~]# salt-run jobs.list_jobs

20170221155927733273:

    ----------

    Arguments:

    Function:

        state.running

    StartTime:

        2017, Feb 21 15:59:27.733273

    Target:

        node01.saltstack.com

    Target-type:

        glob

    User:

        root

20170221160325920754:

    ----------

    Arguments:

    Function:

        sys.doc

    StartTime:

        2017, Feb 21 16:03:25.920754

    Target:

        *

    Target-type:

        glob

    User:

        root

20170221161556599324:

    ----------

    Arguments:

        - cat

    Function:

        cmd.which

    StartTime:

        2017, Feb 21 16:15:56.599324

    Target:

        *

    Target-type:

        glob

    User:

        root

20170221161641114901:

    ----------

    Arguments:

    Function:

        grains.ls

    StartTime:

        2017, Feb 21 16:16:41.114901

    Target:

        *

    Target-type:

        glob

    User:

        root

目的:用Saltstack工具去部署批量服务器,自动化安装(卸载)服务(比如MySQL)。


[root@node2 ~]# ll

总用量 304228

-rw-r--r-- 1 root root 311516309 3月  10 2015 mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz

-rwxr-xr-x 1 root root      6628 3月  25 12:52 MySQL_二进制安装.sh

-rwxr-xr-x 1 root root       590 3月  25 12:53 MySQL_二进制卸载.sh

[root@node2 ~]#

1、查看Master和minion状态。


Master node2 192.168.1.221

minion node4 192.168.1.223

1.1)查看master状态信息:



[root@node2 ~]# netstat -atupn|grep --color -E '4505|4506'

tcp        0      0 0.0.0.0:4505                0.0.0.0:*                   LISTEN      2897/python2.6      

tcp        0      0 0.0.0.0:4506                0.0.0.0:*                   LISTEN      2915/python2.6      

tcp        0      0 192.168.1.221:4505          192.168.1.223:58448         ESTABLISHED 2897/python2.6      

tcp        0      0 192.168.1.221:4506          192.168.1.223:53904         ESTABLISHED 2915/python2.6      

[root@node2 ~]#

1.2)查看当前的salt key信息(minion)我只配置了一个:


[root@node2 ~]# salt-key -L

Accepted Keys:

node4

Denied Keys:

Unaccepted Keys:

Rejected Keys:

[root@node2 ~]#

1.3)查看minion状态信息:


[root@node2 ~]# salt 'node4' cmd.run 'netstat -atupn|grep python'

node4:

    tcp        0      0 192.168.1.223:53904         192.168.1.221:4506          ESTABLISHED 2846/python2.6      

    tcp        0      0 192.168.1.223:58448         192.168.1.221:4505          ESTABLISHED 2846/python2.6

[root@node2 ~]#

1.4)分发Shell脚本和包并授权:

1.4.1)常用cp模块介绍:(其它模块可看我其它相关博客)


cp.get_file   从主服务器下载目录


cp.get_dir    从主服务器下载文件


cp.get_url    从服务器下载指定URL文件


[root@node2 ~]# salt 'node4' cp.get_file salt://mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz /root/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz

node4:

    /root/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz

[root@node2 ~]#

[root@node2 ~]# salt 'node4' cp.get_file salt://MySQL_install.sh /root/MySQL_install.sh

node4:

    /root/MySQL_install.sh

[root@node2 ~]# salt 'node4' cp.get_file salt://MySQL_remove.sh /root/MySQL_remove.sh

node4:

    /root/MySQL_remove.sh

[root@node2 ~]#


1.4.2)minion查看;


[root@node4 ~]# ll

总用量 304232

-rw-r--r-- 1 root root 311516309 3月  25 14:06 mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz

-rw-r--r-- 1 root root      6628 3月  25 14:09 MySQL_install.sh

-rw-r--r-- 1 root root       590 3月  25 14:10 MySQL_remove.sh

[root@node4 ~]#

1.4.3)脚本加权:


[root@node2 ~]# salt 'node4' cmd.run 'chmod +x /root/*.sh'

node4:

[root@node2 ~]#

1.5)脚本安装:

1.5.1)安装


[root@node2 ~]# salt 'node4' cmd.run '/root/MySQL_install.sh'

node4:

    ?[37;32m  开始MySQL的安装! ?[0m

    ?[37;32m MySQL安装目录已经创建完成![/usr/local/mysql下] ?[0m

    ########################################################!

    ?[37;32m MySQL需要的的用户和组创建完成! ?[0m

    ########################################################!

    安装MySQL需要的基本依赖包!

    ?[37;32m MySQL需要的基本依赖包已安装完成! ?[0m

    ########################################################!

    初始化MySQL!

    ?[37;32m MySQL初始化成功! ?[0m

    ########################################################!

    更改MySQL权限属组权限

    ?[37;32m 更改MySQL目录权限属组权限成功! ?[0m

    ########################################################!

    创建并配置mysql的启动文件!

    ?[37;32m MySQL启动文件已经创建配置完成! ?[0m

    ########################################################!

    导入优化好的my.cnf到/etc/下

    ?[37;32m MySQL的配置文件已准备完毕! ?[0m

    ########################################################!

    启动MySQL服务

    ?[37;32m MySQL服务启动成功! ?[0m

    ########################################################!

    配置MySQL的root账号密码!

    ?[37;32m MySQL的root默认账号密码是renzhiyuan ?[0m

    ########################################################!

[root@node2 ~]#

1.5.2)卸载:


[root@node2 ~]# salt 'node4' cmd.run '/root/MySQL_remove.sh'

node4:

    ?[37;32m 开始MySQL卸载! ?[0m

    ########################################################!

    ?[37;32m MySQL卸载成功! ?[0m

    ########################################################!

[root@node2 ~]#



saltstack-master配置文件详解

vim /etc/salt/master  



interface: 192.168.28.141       #绑定到本地的某个网络地址 

publish_port: 4505              #默认端口4505,设置master与minion通信端口 

user: root                      #运行salt进程的用户 

max_open_files: 100000          #master可以打开的最大句柄数 

worker_threads: 5               #启动用来接收或应答minion的线程数 

ret_port: 4506                  #master用来发送命令或接受minions的命令执行返回信息

pidfile: /var/run/salt-master.pid #指定master的pid文件位置 

root_dir: /                     #该目录为salt运行的根目录,改变它可以使salt从另外一个目录运行,好比chroot 

pki_dir: /etc/salt/pki/master   #存放pki认证密钥 

cachedir: /var/cache/salt       #存放缓存信息,salt工作执行的命令信息 

verify_env: True                #启动验证和设置权限配置目录 

keep_jobs: 24                   #保持工作信息的过期时间,单位小时 

job_cache: True                 #设置master维护的工作缓存.当minions超过5000台时,它将很好的承担这个大的架构 

timeout: 5                      #master命令执可以接受的延迟时间 

output: nested                  #salt命令的输出格式 

minion_data_cache: True         #关于minion信息存储在master上的参数,主要是pilar和grains数据 

auto_accept: False              #默认值False. master自动接受所有发送公钥的minion 

file_recv: False                #允许minion推送文件到master上 

file_recv_max_size: 100         #默认值100,设置一个hard-limit文档大小推送到master端 

state_top: top.sls              #状态入口文件 

renderer: yaml_jinja            #使用渲染器用来渲染minions的状态数据 

failhard: False                 #当单个的状态执行失败后,将会通知所有的状态停止运行 



saltstack的master以及minion的安装


master:

查看主机解析(如果内网有自己的DNS主从,那就更省事情了)


[root@master ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.10.10.140mastermaster.saltstack.com

10.10.10.141node01node01.saltstack.com

10.10.10.142node02node02.saltstack.com

安装外部epel源,然后安装salt-master


[root@master ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm


[root@master ~]# yum -y install salt-master


[root@master ~]# /etc/init.d/salt-master start


Starting salt-master daemon:                               [确定]

[root@master ~]# chkconfig --add salt-master

[root@master ~]# chkconfig salt-master on

[root@master ~]# chkconfig --list | grep salt-master

salt-master    0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭

[root@master ~]# netstat -tunlp | grep python

tcp        0      0 0.0.0.0:4505                0.0.0.0:*                   LISTEN      2907/python2.6      

tcp        0      0 0.0.0.0:4506                0.0.0.0:*                   LISTEN      2927/python2.6


备注:

a) SaltStack是基于python进行开发,server端监听的是4505以及4506两个端口

b) SaltStack master启动后默认监听4505和4506两个端口。


4505(publish_port)为saltstack的消息发布系统,


4506(ret_port)为saltstack客户端与服务端通信的端口。


c) 如果使用lsof 查看4505端口,会发现所有的minion在4505端口持续保持在ESTABLISHED状态。


[root@master ~]# lsof -i :4505

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

salt-mast 2907 root   12u  IPv4  16492      0t0  TCP *:4505 (LISTEN)

[root@master ~]# lsof -i :4506

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

salt-mast 2927 root   20u  IPv4  16519      0t0  TCP *:4506 (LISTEN)

进入salt的目录,查看目录结构:


[root@master ~]# cd /etc/salt/

[root@master salt]# tree

.

├── master

├── pki

│   └── master

│       ├── master.pem

│       ├── master.pub

│       ├── minions

│       ├── minions_autosign

│       ├── minions_denied

│       ├── minions_pre

│       ├── minions_rejected

│       └── ssh

│           ├── salt-ssh.rsa

│           └── salt-ssh.rsa.pub

├── roster

├── roster.bak

└── roster.org

8 directories, 8 files

备注:/etc/salt/master这个文件,为saltstack master的主配置文件

salt master端的几个重要命令说明:


[root@master ~]# rpm -ql salt-master

/etc/rc.d/init.d/salt-master        # salt-master服务器启动脚本

/etc/salt/master               # salt master配置文件

/usr/bin/salt                 # salt master核心操作命令

/usr/bin/salt-cp                # salt文件传输命令

/usr/bin/salt-key              # salt证书管理命令

/usr/bin/salt-master            # salt master服务命令

/usr/bin/salt-run              # salt master runner命令

/usr/bin/salt-unity

/usr/share/man/man1/salt-cp.1.gz

/usr/share/man/man1/salt-key.1.gz

/usr/share/man/man1/salt-master.1.gz

/usr/share/man/man1/salt-run.1.gz

/usr/share/man/man1/salt-unity.1.gz

/usr/share/man/man7/salt.7.gz

minion:

安装和配置minion端


[root@node01 ~]#  rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

[root@node01 ~]#  yum -y install salt-minion


[root@node01 ~]# /etc/init.d/salt-minion start


Starting salt-minion daemon:                               [确定]

[root@node01 ~]# chkconfig --list | grep salt

salt-minion    0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭

[root@node01 ~]# tree /etc/salt/

/etc/salt/

├── minion

├── minion.d

├── minion_id

└── pki

    └── minion

        ├── minion.pem

        └── minion.pub

3 directories, 4 files

You have new mail in /var/spool/mail/root


[root@node01 ~]# cd /etc/salt/


修改前备份minion端配置文件(运维要养成好习惯)


[root@node01 salt]# cp minion minion.bak


设置master的名称:(这里也可以写为master: 10.10.10.140)

[root@node01 salt]# sed -i "16s/#master: salt/master: master.saltstack.com/" /etc/salt/minion

设置minion端的ID

[root@node01 salt]# sed -i "78s/#id:/id: minion.saltstack.com/" /etc/salt/minion


[root@node01 salt]# diff /etc/salt/minion /etc/salt/minion.bak 

16c16

< master: master.saltstack.com

---

> #master: salt

78c78

< id: node01.saltstack.com

---

> #id:

[root@node01 salt]# egrep -v '#|^$' /etc/salt/minion |uniq

id: node01.saltstack.com


[root@node01 salt]# /etc/init.d/salt-minion restart

Stopping salt-minion daemon:                               [确定]

Starting salt-minion daemon:  

                             [确定]

在master端接受指定的key:


[root@master ~]# salt-key -L

Accepted Keys:

Denied Keys:

Unaccepted Keys:

node01.saltstack.com

Rejected Keys:

说明:使用salt-key -L表明查看key的信息


[root@master ~]# salt-key -a node01.saltstack.com

The following keys are going to be accepted:

Unaccepted Keys:

node01.saltstack.com

Proceed? [n/Y] Y

Key for minion node01.saltstack.com accepted.

说明:如上所示,在服务端允许node01.saltstack.com成为被信任的key

[root@master ~]# salt-key -L

Accepted Keys:

node01.saltstack.com

Denied Keys:

Unaccepted Keys:

Rejected Keys:


salt minion端的几个重要命令说明:


[root@node01 ~]# rpm -ql salt-minion

/etc/rc.d/init.d/salt-minion        # salt minion服务启动脚本

/etc/salt/minion               # salt minion配置文件

/usr/bin/salt-call               # salt call拉取命令

/usr/bin/salt-minion            # salt minion服务命令

/usr/share/man/man1/salt-call.1.gz

/usr/share/man/man1/salt-minion.1.gz

使用salt推送几个常用的命令进行测试:


[root@master ~]# salt '*' test.ping

node01.saltstack.com:

    True

说明:返回值为True,表明执行的结果是正确的

[root@master ~]# salt 'node01.saltstack.com' cmd.run 'df -h'

node01.saltstack.com:

    Filesystem      Size  Used Avail Use% Mounted on

    /dev/sda5        14G  8.4G  4.5G  66% /

    tmpfs           932M   84K  932M   1% /dev/shm

    /dev/sda1       190M   42M  139M  23% /boot

    /dev/sda3       2.0G   18M  1.8G   1% /tmp

[root@master ~]# salt 'node01.saltstack.com' cmd.run 'ntpdate -u 10.203.10.20'

node01.saltstack.com:

    15 Feb 13:37:12 ntpdate[9245]: step time server 10.203.10.20 offset -28800.128648 sec

补充信息:salt-cp是个非常常用的命令,下面举例说明下常见的用法


[root@master ~]# echo "welcome to China">>test.txt

[root@master ~]# salt-cp '*' test.txt /tmp/

{'node01.saltstack.com': {'/tmp/test.txt': True},

 'node02.saltstack.com': {'/tmp/test.txt': True}}

[root@master ~]# salt '*' cmd.run 'cat /tmp/test.txt'

node01.saltstack.com:

    welcome to China

node02.saltstack.com:

    welcome to China

[root@master ~]# salt-cp -E 'node[0-9][1-9].saltstack.com' test.txt /tmp/test2.txt

{'node01.saltstack.com': {'/tmp/test2.txt': True},

 'node02.saltstack.com': {'/tmp/test2.txt': True}}

[root@master ~]# salt-cp -G 'os:CentOS' test.txt /tmp/test3.txt

{'node01.saltstack.com': {'/tmp/test3.txt': True},

 'node02.saltstack.com': {'/tmp/test3.txt': True}}

到此,salt的master以及minion端的安装就已完成


saltstack项目实战_安装nginx

创建nginx所需目录

[root@node1 ~]# cd /data/etc/salt/

[root@node1 salt]# mkdir -p nginx/files

[root@node1 salt]# cd nginx/files/

[root@node1 files]# wget http://nginx.org/download/nginx-1.11.3.tar.gz

[root@node1 salt]# tree nginx/

nginx/

|-- conf.sls

|-- files

|   |-- nginx

|   |-- nginx-1.11.3.tar.gz

|   |-- nginx.conf

|   |-- nginx_log_cut.sh

|   `-- vhost.conf

|-- init.sls

|-- install.sls

`-- vhost.sls

[root@node1 salt]# cat nginx/init.sls

include:

  - nginx.install

  - nginx.conf

  - nginx.vhost

[root@node1 salt]# cat top.sls

base:

  '*':

    - nginx.init

2. 安装nginx文件


[root@node1 nginx]# vim install.sls

nginx_source:

  file.managed:

    - name: /usr/local/src/nginx-1.11.3.tar.gz

    - unless: test -e /usr/local/src/nginx-1.11.3.tar.gz

    - user: root

    - group: root

    - source: salt://nginx/files/nginx-1.11.3.tar.gz

 

nginx_pkg:

  pkg.installed:

    - pkgs:

      - openssl-devel

      - pcre-devel

      - zlib-devel

      - unzip

 

nginx_user:

  user.present:

    - name: www

    - createhome: False

    - shell: /sbin/nologin

 

nginx_extrace:

  cmd.run:

    - cwd: /usr/local/src

    - names:

      - tar zxf nginx-1.11.3.tar.gz && chown -R root:root nginx-1.11.3

    - unless: test -d /usr/local/src/nginx-1.11.3

    - require:

      - pkg: nginx_pkg

 

nginx_compile:

  cmd.run:

    - name: cd /usr/local/src/nginx-1.11.3 && ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-http_realip_module && make && make install

    - unless: test -d /usr/local/nginx

    - require:

      - cmd: nginx_extrace

      - user: nginx_user

 

create_dir:

  cmd.run:

    - names:

      - chown -R www:www /usr/local/nginx/html && mkdir -p /usr/local/nginx/conf/vhost

    - unless: test -d /usr/local/nginx/conf/vhost

    - require:

      - cmd: nginx_compile

3. 管理nginx配置文件


[root@node1 nginx]# cat conf.sls

include:

  - nginx.install               -> 引用nginx目录下install.sls文件

 

{% set nginx_user = 'www' %}

 

nginx_conf:

  file.managed:                 -> nginx主配置文件

    - name: /usr/local/nginx/conf/nginx.conf

    - source: salt://nginx/files/nginx.conf

    - template: jinja

    - defaults:

      nginx_user: ` nginx_user `

      num_cpus: {{ grains['num_cpus'] }}

 

nginx_service:                  -> nginx服务管理

  file.managed:

    - name: /etc/init.d/nginx

    - user: root

    - group: root

    - mode: 755

    - source: salt://nginx/files/nginx

  cmd.run:

    - names:

      - /sbin/chkconfig --add nginx && /sbin/chkconfig nginx on

    - unless: /sbin/chkconfig --list nginx

  service.running:

    - name: nginx

    - enable: True

    - reload: True

    - watch:

      - file: /usr/local/nginx/conf/vhost/*.conf

 

nginx_log_cut:

  file.managed:

    - name: /usr/local/nginx/sbin/nginx_log_cut.sh

    - source: salt://nginx/files/nginx_log_cut.sh

  cron.present:

    - name: sh /usr/local/nginx/sbin/nginx_log_cut.sh

    - user: root

    - minute: 10

    - hour: 0

    - require:

      - file: nginx_log_cut

4. 使用pillar适合针对不同的主机动态生成配置文件


[root@node1 ~]# cd /data/etc/salt/pillar/

[root@node1 pillar]# cat top.sls

base:

  '*':

    - vhost

[root@node1 pillar]# cat vhost.sls

vhost:

  {% if 'node2' in grains['id'] %}     -> 如果id中有node2字符, 使用www配置文件, 反之使用bbs.conf

  - name: www

    target: /usr/local/nginx/conf/vhost/www.conf

  {% else %}

  - name: bbs

    target: /usr/local/nginx/conf/vhost/bbs.conf

  {% endif %}

5. 生成虚拟主机配置文件


[root@node1 pillar]# cd /data/etc/salt/nginx/

[root@node1 nginx]# cat vhost.sls

include:

  - nginx.install

 

{% for vhostname in pillar['vhost'] %}

{{ vhostname['name'] }}:

  file.managed:

    - name: {{ vhostname['target'] }}

    - source: salt://nginx/files/vhost.conf

    - target: {{ vhostname['target'] }}

    - template: jinja

    - defaults:

      server_name: {{grains['fqdn']}}

      log_name: {{vhostname['name']}}

    - watch_in:

      service: nginx

{% endfor %}

6. nginx主配置文件模版


[root@node1 nginx]# vim files/nginx.conf

user ` nginx_user `;

worker_processes {{grains['num_cpus']}};

error_log logs/nginx_error.log notice;

pid logs/nginx.pid;

worker_rlimit_nofile 65535;

 

events{

        use epoll;

        worker_connections 65535;

}

 

http{

        include       mime.types;

        default_type  application/octet-stream;

        charset  utf-8;

        server_names_hash_bucket_size 128;

        client_header_buffer_size 32k;

        large_client_header_buffers 4 32k;

        client_max_body_size 128m;

        sendfile on;

        tcp_nopush     on;

        keepalive_timeout 60;

        tcp_nodelay on;

        server_tokens off;

        client_body_buffer_size  512k;

        gzip on;

        gzip_min_length  1k;

        gzip_buffers     4 16k;

        gzip_http_version 1.1;

        gzip_comp_level 2;

        gzip_types      text/plain application/x-javascript text/css application/xml;

        gzip_vary on;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                          '$status $body_bytes_sent "$http_referer" '

                          '"$http_user_agent" "$http_x_forwarded_for" "$host"' ;

 

        include vhost/*.conf;

}

7. nginx服务管理脚本


[root@node1 nginx]# cat files/nginx

#!/bin/sh

# chkconfig: - 30 21

# description: http service.

# Source Function Library

. /etc/init.d/functions

# Nginx Settings

 

NGINX_SBIN="/usr/local/nginx/sbin/nginx"

NGINX_CONF="/usr/local/nginx/conf/nginx.conf"

NGINX_PID="/usr/local/nginx/logs/nginx.pid"

RETVAL=0

prog="Nginx"

 

start() {

        echo -n $"Starting $prog: "

        mkdir -p /dev/shm/nginx_temp

        daemon $NGINX_SBIN -c $NGINX_CONF

        RETVAL=$?

        echo

        return $RETVAL

}

 

stop() {

        echo -n $"Stopping $prog: "

        killproc -p $NGINX_PID $NGINX_SBIN -TERM

        rm -rf /dev/shm/nginx_temp

        RETVAL=$?

        echo

        return $RETVAL

}

 

reload(){

        echo -n $"Reloading $prog: "

        killproc -p $NGINX_PID $NGINX_SBIN -HUP

        RETVAL=$?

        echo

        return $RETVAL

}

 

restart(){

        stop

        start

}

 

configtest(){

    $NGINX_SBIN -c $NGINX_CONF -t

    return 0

}

 

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  reload)

        reload

        ;;

  restart)

        restart

        ;;

  configtest)

        configtest

        ;;

  *)

        echo $"Usage: $0 {start|stop|reload|restart|configtest}"

        RETVAL=1

esac

exit $RETVAL

8. nginx日志切割脚本


[root@node1 nginx]# cat files/nginx_log_cut.sh

#!/bin/bash

logs_path=/usr/local/nginx/logs

yesterday=`date -d "yesterday" +%F`

mkdir -p $logs_path/$yesterday

cd $logs_path

for nginx_logs in `ls *log` ;do

    mv $nginx_logs ${yesterday}/${yesterday}-${nginx_logs}

    kill -USR1  `cat /data/src/nginx/logs/nginx.pid`

done

9. 虚拟主机配置文件


[root@node1 nginx]# cat files/vhost.conf

server

        {

                listen       80;

                server_name ` server_name `;      -> 调用vhosts.sls中配置

                index index.html index.htm ;

                root  html;

                #location ~ .*\.(php|php5)?$

                #        {

                #                try_files $uri =404;

                #                fastcgi_pass  unix:/tmp/php-cgi.sock;

                #                fastcgi_index index.php;

                #                include fcgi.conf;

                #        }

                location /status {

                       stub_status on;

                }

                location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

                        {

                                expires      30d;

                        }

                location ~ .*\.(js|css)?$

                        {

                                expires      1d;

                        }

                access_log  logs/` log_name `-access.log  main;

        }


10. SaltStack install Nginx


[root@node1 nginx]# salt 'node2' state.highstate test=True       -> 无报错既可

[root@node1 nginx]# salt 'node2' state.highstate  

[root@node1 nginx]# curl 172.168.200.211 -I

HTTP/1.1 200 OK

Server: nginx

Date: Mon, 29 Aug 2016 08:28:25 GMT

Content-Type: text/html; charset=utf-8

Content-Length: 612

Last-Modified: Mon, 29 Aug 2016 07:55:02 GMT

Connection: keep-alive

ETag: "57c3ea56-264"

Accept-Ranges: bytes

saltstack项目实战_安装mysql

1.1安装mysql

2.2查看salt-master、salt-minion配置文件

[root@node1 ~]# grep -Ev '^#|^$' /etc/salt/master

interface: 0.0.0.0

file_roots:

  base:

    - /data/etc/salt

  prod:

    - /data/etc/salt/prod

log_file: /data/logs/salt/master

[root@node2 ~]# grep -Ev '^#|^$' /etc/salt/minion

master: 172.168.200.210

id: node2

log_file: /data/logs/salt/minion

2.3 查看salt mysql目录结构


[root@node1 ~]# cd /data/etc/salt

[root@node1 salt]# tree mysql/

mysql/

|-- conf.sls                    -> mysql salt配置文件

|-- files

|   |-- my.cnf                  -> mysql配置文件

|   |-- mysql-5.6.32.tar.gz     -> mysql软件包

|   `-- mysqld                  -> mysql启动脚本

|-- init.sls                    -> salt初始化文件

`-- install.sls                 -> mysql install文件

2.4 编写 mysql sls文件


[root@node1 salt]# cat top.sls

base:

  '*':

    - mysql.init

[root@node1 salt]# cd mysql/

[root@node1 mysql]# cat init.sls

include:

  - mysql.install

  - mysql.conf

[root@node1 mysql]# cat install.sls

#mysql pkg.install

mysql_pkg:

  pkg.installed:

    - names:

      - gcc

      - gcc-c++

      - autoconf

      - automake

      - openssl

      - openssl-devel

      - zlib

      - zlib-devel

      - ncurses-devel

      - libtool-ltdl-devel

      - cmake

 

#install source mysql

mysql_source:

  file.managed:

    - name: /usr/local/src/mysql-5.6.32.tar.gz

    - unless: test -e /usr/local/src/mysql-5.6.32.tar.gz

    - source: salt://mysql/files/mysql-5.6.32.tar.gz

 

#tar source mysql

extract_mysql:

  cmd.run:

    - cwd: /usr/local/src

    - names:

      - tar zxf mysql-5.6.32.tar.gz

      - chown -R root:root /usr/local/src/mysql-5.6.32

    - unless: tests -d /usr/local/src/mysql-5.6.32

    - require:

      - file: mysql_source

 

#useradd for mysql

mysql_user:

  user.present:

    - name: mysql

    - uid: 1024

    - createhome: False

    - gid_from_name: True

    - shell: /sbin/nologin

 

#mysql source install

mysql_commpile:

  cmd.run:

    - name: cd /usr/local/src/mysql-5.6.32 && cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6 -DMYSQL_DATADIR=/usr/local/mysql-5.6/data -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.6/data/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DENABLED_LOCAL_INFILE=ON -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH-BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGING=1 -DWITH_FAST_MUTEXES=1 -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFIL=1 -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_DEBUG=0 && make && make install && /usr/local/mysql-5.6/scripts/mysql_install_db --basedir=/usr/local/mysql-5.6/ --datadir=/usr/local/mysql-5.6/data/ --user=mysql

    - require:

      - cmd: extract_mysql

      - pkg: mysql_pkg

    - unless: test -d /usr/local/mysql-5.6

 

#mysql initialize

#mysql_initialize:

#  cmd.run:

#    - cwd: /usr/local/mysql-5.6/scripts/

#    - names:

#      - ./mysql_install_db --basedir=/usr/local/mysql-5.6/ --datadir=/usr/local/mysql-5.6/data/ --user=mysql

   

[root@node1 mysql]# cat conf.sls

include:

  - mysql.install

 

#mysql for config

mysql_cnf:

  file.managed:

    - name: /usr/local/mysql-5.6/my.cnf

    - user: root

    - mode: 755

    - source: salt://mysql/files/my.cnf

 

#myql server

mysql_service:

  file.managed:

    - name: /etc/init.d/mysqld

    - source: salt://mysql/files/mysqld

    - user: root

    - mode: 755

  cmd.run:

    - names:

      - /sbin/chkconfig --add mysqld

      - /sbin/chkconfig --level 35 mysqld on

    - unless: /sbin/chkconfig --list mysqld    

2.5 mysql配置文件


[root@node1 ~]# cd /data/etc/salt/mysql/files/

[root@node1 files]# cat my.cnf

[mysqld]

socket=/usr/local/mysql-5.6/data/mysql.sock

datadir=/usr/local/mysql-5.6/data

symbolic-links=0

log-error=/var/log/mysql_error.log

pid-file=/usr/local/mysql-5.6/data/mysqld.pid

slow-query-log-file = /var/log/mysql_slow_querys.log

skip-name-resolve

skip-grant-tables


2.6 mysql启动脚本添加下面路径

[root@node1 files]# cat mysqld

#!/bin/sh


 

basedir=/usr/local/mysql-5.6/

datadir=/usr/local/mysql-5.6/data/


2.7 模拟执行salt

1

[root@node1 salt]# salt 'node2' state.highstate  test=True    -> 无报错即可



[root@node1 salt]# salt 'node2' state.highstate   ->开始安装mysql