自动化运维saltstack
一、基础介绍
==========================================================================================
saltstack简单介绍
Saltstack是一种全新的基础设施管理方式,是一个服务器基础架构集中化管理平台,几分钟内便可运行起来,速度够快,服务器之间秒级通讯,扩展性好,很容易批量管理上万台服务器,显著降低人力与运维成本;它具备配置管理、远程执行、监控等功能,一般可以理解为简化版的puppet和加强版的func;通过部署SaltStack环境,可以在成千上万台服务器上做到批量执行命令,根据不同业务特性进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。SaltStack基于Python语言实现,结合轻量级消息队列(ZeroMQ)(SaltStack的通信模式总共分为2种模式:ZeroMQ、REAT,鉴于REAT目前还不是太稳定,通常会选择ZeroMQ模式)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
Saltstack运行模式
Local:本地,一台机器玩,不建议
Master/Minion:通过server/agent的方式进行管理,效率很高(批量管理1000台机器,25秒搞定)
Salt SSH:通过SSH方式进行管理,效率相对来说比较低(批量管理1000台机器,83秒搞定)
Saltstack三大功能
远程执行(执行远程命令)
配置管理(状态管理)
云管理
Saltstack特征
1)部署简单、方便;
2)支持大部分UNIX/Linux及Windows环境;
3)主从集中化管理;
4)配置简单、功能强大、扩展性强;
5)主控端(master)和被控端(minion)基于证书认证,安全可靠;
6)支持API及自定义模块,可通过Python轻松扩展。
Master与Minion认证
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发送指令了。
Master与Minion的连接
1)SaltStack master启动后默认监听4505和4506两个端口。4505(publish_port)为saltstack的消息发布系统,4506(ret_port)为saltstack客户端与服务端通信的端口。如果使用lsof 查看4505端口,会发现所有的minion在4505端口持续保持在ESTABLISHED状态。
2)minion与master之间的通信模式
二、SaltStack 安装配置过程
服务端:Xuegod63:
IP:192.168.0.63
Hostname:xuegod63.cn
被控端:xuegod64
IP:192.168.0.64
Hostname:xuegod64.cn
1、配置FQDN,让ip和主机名对应
[root@xuegod63 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.63 xuegod63 xuegod63.cn
192.168.0.64 xuegod64 xuegod64.cn
[root@xuegod64 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.64 xuegod64 xuegod64.cn
192.168.0.63 xuegod63 xuegod63.cn
2、两台机器都关闭防火墙和selinux
3、服务组件安装:
[root@xuegod63 ~]# yum install epel-release
[root@xuegod63 ~]# yum install salt-master salt-minion -y ##安装服务端和被监控端
[root@xuegod64 ~]# yum install epel-release -y && yum install salt-minion –y ##
被监控服务安装被监控端
这个如果提示,使用下面的操作
No package salt-master available.
No package salt-minion available.
Error: Nothing to do
安装服务端
sudo rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
sudo yum clean expire-cache
yum install salt-master -y # 我看到中间会安装python36
sudo yum install salt-minion -y
sudo yum install salt-ssh -y
sudo yum install salt-syndic -y
sudo yum install salt-cloud -y
sudo yum install salt-api -y
systemctl start salt-minion
systemctl enable salt-minion
systemctl enable salt-master.service && systemctl restart salt-master.service
安装客户端
sudo rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
sudo yum clean expire-cache
sudo yum install salt-minion -y
systemctl restart salt-minion
systemctl enable salt-minion
4、服务启动:
启动服务:
[root@xuegod63 ~]# vim /etc/salt/minion
在16行下面增加一行:
master: 192.168.0.63 ##说明服务端的地址
启动主控端服务:
root@xuegod63 ~]# vim /etc/salt/minion
[root@xuegod63 ~]# /etc/init.d/salt-master start
Starting salt-master daemon: [ OK ]
[root@xuegod63 ~]# /etc/init.d/salt-minion start
Starting salt-minion daemon: [ OK ]
启动被监控端服务:
[root@xuegod64 ~]# vim /etc/salt/minion
在16行下面增加一行:
master: 192.168.0.63 ##说明服务端的地址
启动被监控服务:
[root@xuegod64 ~]# /etc/init.d/salt-minion start
Starting salt-minion daemon: [ OK ]
启动完,可以查看下进程,可以看到相关服务是python来执行运行的
[root@xuegod63 ~]# ps aux|grep salt
root 1772 0.0 2.0 288104 21088 ? S 09:46 0:00 /usr/bin/python2.6 /usr/bin/salt-master –d
root 2166 0.1 2.5 442228 25216 ? S 09:46 0:00 /usr/bin/python2.6 /usr/bin/salt-minion –d
5、配置认证
下面认证操作都是在xuegod63上操作:
salt-key -a xuegod64.cn ##增加一个xuegod64的密钥认证
[root@xuegod63 ~]# salt-key -a xuegod64.cn
The following keys are going to be accepted:
Unaccepted Keys:
xuegod64.cn
Proceed? [n/Y] y
Key for minion xuegod64.cn accepted.
查看已经签名的客户端:
[root@xuegod63 ~]# salt-key
Accepted Keys:
xuegod64.cn
Denied Keys:
Unaccepted Keys:
xuegod63.cn
Rejected Keys:
签名完成,可以在被监控端看到生成的密钥minion_master.pub
[root@xuegod64 ~]# cd /etc/salt/pki/minion/
[root@xuegod64 minion]# ls
minion_master.pub minion.pem minion.pub
补充: salt-key 可以使用-A 来签名所有主机,也可以使用-d 删除指定的主机
6、saltstack 远程执行命令演示:
探测主机是否在线
[root@xuegod63 ~]# salt '*' test.ping
xuegod64.cn:
True
查看分区等信息:
[root@xuegod63 ~]# salt 'xuegod64.cn' cmd.run 'df -h'
xuegod64.cn:
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 2.0G 7.1G 22% /
tmpfs 491M 12K 491M 1% /dev/shm
/dev/sda1 2.9G 39M 2.7G 2% /boot
/dev/sda3 5.7G 12M 5.4G 1% /usr/local
可以调用cmd.run 来执行其他的命令,比如负载,时间,主机名等等
这里的* 表示所以已经签名的客户端,也可以指定其中特定的一个,比如 xuegod64.cn,但是这些客户端必须是在master上被接受认证的客户端,
如果有多个被监控的客户端,我们可以通过通配符,列表,正则等来一次性的控制多个主机,比如我们现在有两个客户端,web10 web11.可以写成:
salt ‘web*’或者salt ‘web1[01]’或者 salt -L ‘web10,web11’使用列表的时候,多个机器用逗号隔开
7、saltstack 之grains介绍
grains 是在minion启动收集到的一些信息,比如操作系统的类型,网卡IP,内存版本,CPU信息等
[root@xuegod63 ~]# salt 'xuegod64.cn' grains.ls ##列出所有的grains项目名称
xuegod64.cn:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
等等
[root@xuegod63 ~]# salt 'xuegod64.cn' grains.items ##列出所有的grains项和对应的值
xuegod64.cn:
----------
SSDs:
biosreleasedate:
05/20/2014
biosversion:
6.00
cpu_flags:
- fpu
- vme
- de
启动grains的信息并不是动态的,并不会时时变更,它只是在minion启动时收集到的,我们可以根据grains收集到的一些信息,做配置管理工作,可以支持自定义一些监控项
8、自定义grains
在被监控端xuegod64上添加grains:
[root@xuegod64 ~]# vim /etc/salt/grains ##此文件默认没有,需要创建
添加如下信息,监控项:对应的信息
role: zabbix_server
env: test
myname: xuegodlinux
myhostname: xuegod64.cn
重启minion服务
[root@xuegod64 ~]# /etc/init.d/salt-minion restart
可以再次执行salt 'xuegod64.cn' grains.items 查看是否存在自定义的项,或者使用
[root@xuegod63 ~]# salt 'xuegod64.cn' grains.item env 单独查看
我们可以借助grains的一些属性信息来执行一些命令
[root@xuegod63 ~]# salt -G env:test cmd.run 'w'
9、saltstack 之pillar介绍
pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息,可以自定义变量等
自定义配置pillar过程:
[root@xuegod63 ~]# vim /etc/salt/master
找到pillar_roots 这项,取消下面三行的注释
529 pillar_roots:
530 base:
531 - /srv/pillar
创建pillar文件的存放目录:
[root@xuegod63 ~]# mkdir /srv/pillar
创建配置文件,编辑如下内容:
[root@xuegod63 pillar]# vim test.sls
conf: /etc/123.conf
myname: saltstack-server
创建编写入口配置文件
[root@xuegod63 ~]# vim /srv/pillar/top.sls
base:
'xuegod64.cn':
- test
重启服务:
[root@xuegod63 pillar]# /etc/init.d/salt-master restart
可以通过刷新来获取新的状态
[root@xuegod63 pillar]# salt '*' saltutil.refresh_pillar
查看:
[root@xuegod63 pillar]# salt '*' pillar.items
xuegod64.cn:
----------
conf:
/etc/123.conf
myname:
saltstack-server
xuegod63.cn:
----------
pillar 同样可以用作salt的匹配对象,比如:
[root@xuegod63 pillar]# salt -I 'myname:saltstack-server' cmd.run 'w'
三、Saltstack 配置管理服务
1、 配置安装apache
[root@xuegod63 ~]# vim /etc/salt/master
取消406-408行的注释
406 file_roots:
407 base:
408 - /srv/salt/
创建配置文件存储目录
[root@xuegod63 ~]# mkdir /srv/salt
创建入口配置文件
[root@xuegod63 salt]# vim top.sls
base:
'xuegod64.cn':
- apache
意思是在所以的客户端上执行apache的模块
重启服务:
[root@xuegod63 salt]# /etc/init.d/salt-master restart
创建编写apache模块的配置文件
[root@xuegod63 salt]# vim /srv/salt/apache.sls
apache-service:
pkg.installed:
- names:
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
apache-service是ID的名称,自定义的。pkg.installed为包安装函数,下面是要安装的包的名字。service.running也是一个函数,来保证指定的服务启动,enable表示开机启动。
配置好文件,执行
[root@xuegod63 salt]# salt 'xuegod64.cn' state.highstate
xuegod64.cn:
----------
ID: apache-service
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 14:41:53.099793
Duration: 9075.212 ms
Changes:
----------
apr-util-ldap:
----------
new:
1.3.9-3.el6_0.1
查看被控端,已经安装成功。
2、 配置远程文件管理
创建一个文件管理的模块
[root@xuegod63 salt]# vim filetest.sls
file_test:
file.managed:
- name: /tmp/xuegodlinux.txt
- source: salt://test/xuegod.php
- user: root
- group: root
- mode: 644
在入口文件里添加模块
[root@xuegod63 salt]# vim top.sls
base:
'xuegod64.cn':
- apache
- filetest
测试执行:
[root@xuegod63 salt]# salt 'xuegod64.cn' state.highstate
----------
ID: file_test
Function: file.managed
Name: /tmp/xuegodlinux.txt
Result: True
Comment: File /tmp/xuegodlinux.txt updated
Started: 14:55:43.405748
Duration: 9.272 ms
Changes:
----------
diff:
New file
mode:
0644
3、配置文件夹管理:
创建一个文件夹管理的模块
[root@xuegod63 salt]# vim filedir.sls
file_dir:
file.recurse:
- name: /tmp/testdir
- source: salt://test
- user: root
- file_mode: 644
- dir_mode: 755
- mkdir: True
- clean: True
在入口文件里添加模块
[root@xuegod63 salt]# vim top.sls
base:
'xuegod64.cn':
- filedir
测试文件夹管理:
[root@xuegod63 salt]# salt 'xuegod64.cn' state.highstate
xuegod64.cn:
----------
ID: file_dir
Function: file.recurse
Name: /tmp/testdir
Result: True
Comment: Recursively updated /tmp/testdir
Started: 15:07:48.516708
Duration: 314.122 ms
Changes:
----------
/tmp/testdir/xuegod.php:
----------
diff:
New file
mode:
0644
Summary
------------
Succeeded: 1 (changed=1)
3、 saltstack远程执行命令
创建执行命令的配置文件
[root@xuegod63 salt]# vim cmd.sls
cmd_test:
cmd.run:
- unless: test -f /tmp/xuegodtext.txt
- names:
- touch /tmp/11.txt
- mkdir /tmp/1233
- user: root
在入口文件里添加模块
[root@xuegod63 salt]# vim top.sls
base:
'xuegod64.cn':
- cmd
测试执行命令:
[root@xuegod63 salt]# salt 'xuegod64.cn' state.highstate
xuegod64.cn:
----------
ID: cmd_test
Function: cmd.run
Name: mkdir /tmp/1233
Result: True
Comment: Command "mkdir /tmp/1233" run
Started: 15:24:59.832268
Duration: 297.728 ms
Changes:
----------
pid:
5309
retcode:
0
stderr:
stdout:
5、saltstack远程执行shell脚本
[root@xuegod63 salt]# vim shell.sls
shell_test:
cmd.script:
- source: salt://test/1.sh
- user: root
[root@xuegod63 salt]# cat test/1.sh
#!/bin/bash
touch /tmp/111222333.jsp
echo 'this is jsp page'>> /tmp/111222333.jsp
[root@xuegod63 salt]# vim top.sls
base:
'xuegod64.cn':
- shell
测试执行命令:
[root@xuegod63 salt]# salt 'xuegod64.cn' state.highstate