一、What is Saltstack

1、Salt介绍

Salt,汉语意思是盐。

Salt对于运维攻城狮来说,就像盐对人体体征一样重要;哈哈哈,我是这么意淫的。

SaltStack是一个服务器基础架构集中化管理平台,具有远程执行、配置管理、云管理等功能。

SaltStack是基于Python语言实现的;所以对于熟悉python的运维来说,那非常有亲切感,容易上手,而且yaml格式也类似于python的缩进,并且非常严格,刚入门的时候非常酸爽,因为你一不小心,多一个或者少一个空格,就容易出错,排错还挺费劲。

通过部署SaltStack环境,我们可以做到对成千上万台服务器批量执行命令;可以根据不同的业务线进行配置集中化管理、文件分发、服务器数据采集、操作系统基础以及软件包的管理,总之非常方便。

SaltStack是运维攻城狮们提高工作效率,规范化配置和操作的利器。有了它,你就可以吃着火锅,唱着歌,愉快地工作了。

2、特点

(1)部署简单、方便;

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

(3)主从集中化管理;

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

(5)master和minion基于证书认证,安全;

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

3、四种运行方式

(1)Local,即在本地运行

(2)Master/Minion模式, C/S模式

(3)Syndic 代理模式

(4)Salt SSH模式,这种模式不用安装minion 也可以收集。

二、Salt安装

1、环境准备

IP地址		主机名			操作系统192.168.56.11	linux-node1		CentOS7192.168.56.12	linux-node2		CentOS7

2、安装salt

打开http://repo.saltstack.com/,这是SaltStack自己的repo库, 进去后,你可以看到基于各种平台的安装方法

安装SaltStack的repository

yum install https://repo.saltstack.com/yum/redhat/salt-repo-2016.3-1.el7.noarch.rpm

两台机器上都安装repo源。

接下来安装Salt

yum install -y salt-master salt-minion注:在node1上安装master和minion,在node2上只安装minion

3、配置salt

启动master

systemctl start salt-master

启动minion,先进行配置,让minion知道它的老大是谁,谁在管它

vi /etc/salt/minion修改master: 192.168.56.11    #冒号后有空格,切记id:每台服务器有一个唯一标识符号;默认可以不做配置,为主机名启动minionsystemctl start salt-minion

查看minion的id

[root@linux-node1 ~]# cd /etc/salt/[root@linux-node1 /etc/salt]# lltotal 112-rw-r----- 1 root root  2626 Jun 11 04:43 clouddrwxr-xr-x 2 root root     6 Jun 14 04:42 cloud.conf.ddrwxr-xr-x 2 root root     6 Jun 14 04:42 cloud.deploy.ddrwxr-xr-x 2 root root     6 Jun 14 04:42 cloud.maps.ddrwxr-xr-x 2 root root     6 Jun 14 04:42 cloud.profiles.ddrwxr-xr-x 2 root root     6 Jun 14 04:42 cloud.providers.d-rw-r----- 1 root root 39184 Jul 24 04:41 masterdrwxr-xr-x 2 root root    38 Jul 24 04:44 master.d-rw-r----- 1 root root 31601 Jun 29 09:45 miniondrwxr-xr-x 2 root root    27 Jun 24 19:01 minion.d-rw-r--r-- 1 root root    23 Jun 24 18:54 minion_iddrwxr-xr-x 4 root root    32 Jun 24 18:42 pki-rw-r----- 1 root root 26460 Jun 11 04:43 proxy-rw-r----- 1 root root   344 Jun 11 04:43 roster[root@linux-node1 /etc/salt]# cat minion_id linux-node1.example.compki目录是minion第一次启动后创建的目录。使用tree命令查看pki目录,可以看到minion和master两个目录。在minion目录下有minion.pem和minion.pub。minion会把自己的公钥发给master。

查看master下目录情况

cd /etc/salt/master/pki/在pki下同样有两个目录master和minion在master目录下,在master同意添加minion之前,minion的公钥是存放在minions_pre目录下的,而且是以minion的ID存放公钥。纳管minion方法使用salt-key查看master下有哪些minion执行salt-key -a linux-node*然后执行salt-key,查看发生了什么变化[root@linux-node1 /etc/salt/pki]# salt-key Accepted Keys:linux-node1.example.comlinux-node2.example.comDenied Keys:Unaccepted Keys:Rejected Keys:再次查看公钥位置,会发现公钥已经被存放到/etc/salt/master/pki/minions[root@linux-node1 /etc/salt/pki]# tree ../pki/../pki/├── master│   ├── master.pem│   ├── master.pub│   ├── minions│   │   ├── linux-node1.example.com│   │   └── linux-node2.example.com│   ├── minions_autosign│   ├── minions_denied│   ├── minions_pre│   └── minions_rejected└── minion    ├── minion_master.pub    ├── minion.pem    └── minion.pub

注意:minion上也有master的公钥,这样他们就可以通信了。

[root@linux-node2 salt]# cd pki/[root@linux-node2 pki]# tree.├── master└── minion    ├── minion_master.pub    ├── minion.pem    └── minion.pub

4、远程执行

例1、salt '*' test.ping'*'在shell里面是有意义的,所有用引号引起来。此处是master远程执行的目标test是一个模块ping是模块里的一个方法,用于master和minion的通信。[root@linux-node1 /etc/salt/pki]# salt '*' test.pinglinux-node2.example.com:    Truelinux-node1.example.com:    True例2、[root@linux-node1 /etc/salt/pki]# salt 'linux-node1*' cmd.run 'w'linux-node1.example.com:     08:03:10 up 10:17,  2 users,  load average: 0.21, 0.14, 0.08    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT    root     tty1                      06:56    1:05m  0.18s  0.18s -bash    root     pts/0    192.168.56.1     07:13    6.00s  1.51s  1.38s /usr/bin/python /usr/bin/salt linux-node1* cmd.run w例3、[root@linux-node1 /etc/salt/pki]# salt 'linux-node1*' cmd.run 'ls -l /tmp'linux-node1.example.com:    total 32    drwxr-xr-x 2 root   root       6 Jul 17 19:39 hsperfdata_root    -rw-rw-r-- 1 zabbix zabbix     0 Jul 17 19:33 localhost-mysql_cacti_stats.txt    -rw------- 1 root   root    1411 May 27 10:35 localhost.crt    -rw------- 1 root   root    1675 May 27 10:35 localhost.key    -rw-rw-r-- 1 zabbix zabbix    43 Jul 17 19:35 netstat.tmp    drwxr-xr-x 3 root   root      17 Jul 19 07:39 pear    -rw-r--r-- 1 root   root    1188 Jul 24 00:20 php_errors.log    -rw-rw-r-- 1 zabbix zabbix 16308 Jul 17 17:58 sms.log    drwx------ 3 root   root      16 Jul 23 21:46 systemd-private-1718f11d5b814680841058906c1429c8-cobblerd.service-x1ZIHQ    drwx------ 3 root   root      16 Jun 24 11:07 systemd-private-ee2a5374182b40fb83bb256efa24f62b-cobblerd.service-hF5d1q    drwx------ 3 root   root      16 Jun 24 11:04 systemd-private-ee2a5374182b40fb83bb256efa24f62b-httpd.service-1ehcOR    drwx------ 3 root   root      16 Jun 24 11:08 systemd-private-ee2a5374182b40fb83bb256efa24f62b-mariadb.service-qOJnmO[root@linux-node1 /etc/salt/pki]# 例4、重启zabbix-agent[root@linux-node1 /etc/salt/pki]# salt 'linux-node1*' cmd.run 'systemctl restart zabbix-agent'linux-node1.example.com:这里没有返回,其实跟linux差不多,没有消息就是好消息