一、基础介绍
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状态。
minion与master之间的通信模式如下
SaltStack 安装配置过程
服务端 10.10.100.39
hostname test1.com master
被控制端10.10.100.46
hostname test2.com minion
1、配置FQDN,让ip和主机名对应
[root@test1 ~]# vim /etc/hosts
10.10.100.39 test1 test1.com
10.10.100.46 test2 test2.com
[root@test2 ~]# vim /etc/hosts
10.10.100.39 test1 test1.com
10.10.100.46 test2 test2.com
要求通过域名能够解析到IP
[root@test2 ~]# ping test1.com
PING test1 (10.10.100.39) 56(84) bytes of data.
64 bytes from test1 (10.10.100.39): icmp_seq=1 ttl=64 time=1.38 ms
64 bytes from test1 (10.10.100.39): icmp_seq=2 ttl=64 time=0.293 ms
64 bytes from test1 (10.10.100.39): icmp_seq=3 ttl=64 time=0.212 ms
64 bytes from test1 (10.10.100.39): icmp_seq=4 ttl=64 time=0.229 ms
[root@test1 ~]# ping test2.com
PING test2 (10.10.100.46) 56(84) bytes of data.
64 bytes from test2 (10.10.100.46): icmp_seq=1 ttl=64 time=0.201 ms
64 bytes from test2 (10.10.100.46): icmp_seq=2 ttl=64 time=0.806 ms
64 bytes from test2 (10.10.100.46): icmp_seq=3 ttl=64 time=0.306 ms
关闭防火墙和selinux
[root@test1 ~]# systemctl stop firewalld
服务组件安装
安装 epel源
[root@test1 ~]# yum -y install epel-release
安装服务端和被监控端服务
[root@test1 ~]# yum -y install salt-master salt-minion
被控端:安装被监控端服务
[root@test2 ~]# yum -y install epel-release && yum -y install salt-minion
服务启动
配置主控服务
[root@test1 ~]# vim /etc/salt/minion
master: 10.10.100.39 ##说明服务端的地址(16行)
修改python编写的配置文件千万注意缩进(空格)
启动主控端服务
[root@test1 ~]# systemctl start salt-master
[root@test1 ~]# systemctl start salt-minion
[root@test1 ~]# ps -aux |grep python
root 9167 0.0 0.4 573928 19116 ? Ssl 10:20 0:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root 23750 0.0 0.6 321200 27660 ? Ss 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23759 0.3 0.7 411400 28524 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23760 0.0 0.5 403128 23244 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23761 0.0 0.6 403128 27072 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23764 0.0 0.5 321200 22652 ? S 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23767 0.3 0.8 1066644 34712 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23768 0.3 0.8 1066700 34768 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23771 0.3 0.8 1066740 34800 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23774 0.3 0.8 1066704 34836 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23775 0.3 0.8 1066436 34648 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 23778 0.0 0.5 698056 23196 ? Sl 13:59 0:00 /usr/bin/python /usr/bin/salt-master
root 24393 0.0 0.3 234888 15648 ? Ss 14:01 0:00 /usr/bin/python /usr/bin/salt-minion
root 24396 0.2 0.6 533252 26456 ? Sl 14:01 0:00 /usr/bin/python /usr/bin/salt-minion
root 24479 0.0 0.0 112728 972 pts/0 S+ 14:03 0:00 grep --color=auto python
配置被控端服务
[root@test2 ~]# vim /etc/salt/minion
master: 10.10.100.39 ##说明服务端的地址(16行)
修改python编写的配置文件千万注意缩进(空格)
[root@test2 ~]# systemctl start salt-minion
[root@test2 ~]# ps -aux |grep python
root 7058 0.0 1.7 573820 17128 ? Ssl 10:20 0:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root 17417 0.9 1.5 234776 15664 ? Ss 14:04 0:00 /usr/bin/python /usr/bin/salt-minion
root 17420 2.8 2.6 533684 26784 ? Sl 14:04 0:00 /usr/bin/python /usr/bin/salt-minion
root 17450 0.0 0.0 112724 984 pts/0 R+ 14:04 0:00 grep --color=auto python
配置认证
下面认证操作都是在test1上操作
[root@test1 ~]# salt-key -a test2.com
The following keys are going to be accepted:
Unaccepted Keys:
test2.com
Proceed? [n/Y] y
Key for minion test2.com accepted.
签名完成,可以在被监控端看到生成的密钥minion_master.pub
[root@test1 ~]# ll /etc/salt/pki/minion/
总用量 8
-r-------- 1 root root 1679 11月 8 14:01 minion.pem
-rw-r--r-- 1 root root 451 11月 8 14:01 minion.pub
[root@test1 ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
test1.com
Proceed? [n/Y] y
Key for minion test1.com accepted.
salt-key 可以使用-A 来签名所有主机,也可以使用-d 删除指定的主机
探测主机是否在线
saltstack 远程执行命令
[root@test1 ~]# salt '*' test.ping
test1.com:
True
test2.com:
True
查看分区等信息
[root@test1 ~]# salt '*' cmd.run 'df -h'
test1.com:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 1.6G 49G 4% /
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 16K 2.0G 1% /dev/shm
tmpfs 2.0G 12M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
/dev/mapper/centos-home 47G 33M 47G 1% /home
tmpfs 394M 0 394M 0% /run/user/0
test2.com:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 1.3G 49G 3% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 12K 487M 1% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
/dev/mapper/centos-home 47G 33M 47G 1% /home
tmpfs 98M 0 98M 0% /run/user/0
可以调用cmd.run 来执行其他的命令,比如负载,时间,主机名等等
这里的* 表示所有已经签名的客户端,也可以指定其中特定的一个,比如 xuegod64.com,但是这些客户端必须是在master上被接受认证的客户端,
如果有多个被监控的客户端,我们可以通过通配符,列表,正则等来一次性的控制多个主机,比如我们现在有两个客户端,web10 web11.可以写成:
salt ‘web*’或者salt ‘web1[01]’或者 salt -L ‘web10,web11’使用列表的时候,多个机器用逗号隔开
saltstack之grains介绍
GRAINS 组件是saltstack中非常重要的一个组件,其主要用于记录Minion的一些静态信息,如比:CPU、内存、磁盘、网络等。grains信息是每次客户端启动后自动上报给master的,一旦这些静态信息发生改变需要重启minion 或者 重新同步下 grains。
grains 是在minion启动收集到的一些信息,比如操作系统的类型,网卡IP,内存版本,CPU信息等
[root@test1 ~]# salt 'test2.com' grains.ls ##列出所有的grains项目名
test2.com:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- gpus
- host
- hwaddr_interfaces
- id
- init
- ip4_interfaces
- ip6_interfaces
- ip_interfaces
- ipv4
- ipv6
- kernel
- kernelrelease
- locale_info
- localhost
- lsb_distrib_id
- machine_id
- manufacturer
- master
- mdadm
- mem_total
- nodename
- num_cpus
- num_gpus
- os
- os_family
- osarch
- oscodename
- osfinger
- osfullname
- osmajorrelease
- osrelease
- osrelease_info
- path
- productname
- ps
- pythonexecutable
- pythonpath
- pythonversion
- saltpath
- saltversion
- saltversioninfo
- selinux
- serialnumber
- server_id
- shell
- systemd
- virtual
- zmqversion
列出所有的grains项和对应的值
[root@test1 ~]# salt 'test2.com' grains.items
test2.com:
----------
SSDs:
biosreleasedate:
04/13/2018
biosversion:
6.00
cpu_flags:
cpu_model:
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
cpuarch:
x86_64
domain:
com
fqdn:
test2.com
fqdn_ip4:
- 10.10.100.46
fqdn_ip6:
- fe80::6b1e:8346:2b6b:d78d
gpus:
|_
----------
model:
SVGA II Adapter
vendor:
unknown
host:
test2
hwaddr_interfaces:
----------
ens33:
00:0c:29:d5:55:ad
lo:
00:00:00:00:00:00
id:
test2.com
init:
systemd
ip4_interfaces:
----------
ens33:
- 10.10.100.46
lo:
- 127.0.0.1
ip6_interfaces:
----------
ens33:
- fe80::6b1e:8346:2b6b:d78d
lo:
- ::1
ip_interfaces:
----------
ens33:
- 10.10.100.46
- fe80::6b1e:8346:2b6b:d78d
lo:
- 127.0.0.1
- ::1
ipv4:
- 10.10.100.46
- 127.0.0.1
ipv6:
- ::1
- fe80::6b1e:8346:2b6b:d78d
kernel:
Linux
kernelrelease:
3.10.0-957.el7.x86_64
locale_info:
----------
defaultencoding:
UTF-8
defaultlanguage:
zh_CN
detectedencoding:
UTF-8
localhost:
test2.com
lsb_distrib_id:
CentOS Linux
machine_id:
b113a5c900114df984a869456b9e831d
manufacturer:
VMware, Inc.
master:
10.10.100.39
mdadm:
mem_total:
972
nodename:
test2.com
num_cpus:
1
num_gpus:
1
os:
CentOS
os_family:
RedHat
osarch:
x86_64
oscodename:
Core
osfinger:
CentOS Linux-7
osfullname:
CentOS Linux
osmajorrelease:
7
osrelease:
7.6.1810
osrelease_info:
- 7
- 6
- 1810
path:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
productname:
VMware Virtual Platform
ps:
ps -efH
pythonexecutable:
/usr/bin/python
pythonpath:
启动grains的信息并不是动态的,并不会时时变更,它只是在minion启动时收集到的,我们可以根据grains收集到的一些信息,做配置管理工作,可以支持自定义一些监控项
自定义grains
在被监控端test2.com上 添加grains
[root@test2 ~]# vim /etc/salt/grains ##此文件默认没有,需要创建
添加如下信息,监控项:对应的信息
role: zabbix_server
env: test
myname: testlinux
myhostname: test2.com
重启minion服务
[root@test2 ~]# systemctl restart salt-minion
可以再次执行salt ‘test2.com’ grains.items 查看是否存在自定义的项,或者使用
[root@test1 ~]# salt 'test2.com' grains.items
env:
test
fqdn:
test2.com
role:
zabbix_server 刚刚自定义的
saltstack之pillar
grains用于存储静态不易变更的数据,而pillar一般用来存储动态的、敏感的数据;通过minion端和master端都可以配置设置或获取grains信息,而pillar信息只能在master端配置,再到minion端执行
pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息,可以自定义变量等
自定义配置pillar过程
[root@test1 ~]# vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
# pillar_roots 前面加一个空格
创建pillar文件的存放目录
[root@test1 ~]# mkdir -p /srv/pillar
[root@test1 ~]# cd /srv/pillar/
[root@test1 pillar]# vim test.sls
conf: /etc/123.conf
mysname: saltstack-server
注意冒号后有空格
创建编写入口配置文件
[root@test1 pillar]# vim /srv/pillar/top.sls
base:
'test2.com'
- test
注意- 后有空格
重启服务
[root@test1 pillar]# systemctl restart salt-master
可以通过刷新来获取新的状态
[root@test1 pillar]# salt '*' saltutil.refresh_pillar
test1.com:
True
test2.com:
True
查看
[root@test1 pillar]# salt '*' pillar.items
test1.com:
----------
test2.com:
----------
conf:
/etc/123.conf
mysname:
saltstack-server
Saltstack 配置管理服务
1、配置安装apache
[root@test1 pillar]# vim /etc/salt/master
取消406-408行的注释
406 file_roots: #前面有空格
407 base:
408 - /srv/salt/
创建配置文件存储目录
[root@test1 pillar]# mkdir /srv/salt
[root@test1 pillar]# cd /srv/salt/
[root@test1 salt]# vim top.sls
base:
'test2.com':
- apache 这个要与任务名称一样
意思是指定客户端上执行apache的模块
重启服务
[root@test1 salt]# systemctl restart salt-master
创建编写apache模块的配置文件
[root@test1 salt]# vim /srv/salt/apache.sls
apache-service: ID名称
pkg.installed: 函数名称
- names:
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
注意:行对齐 -有空格
apache-service是ID的名称,自定义的。pkg.installed为包安装函数,下面是要安装的包的名字。service.running也是一个函数,来保证指定的服务启动,enable表示开机启动
配置好文件,执行
[root@test1 salt]# salt ‘test2.com’ state.highstate
查看当前的salt key信息
[root@test1 salt]# salt-key -L
Accepted Keys:
test1.com
test2.com
Denied Keys:
Unaccepted Keys:
Rejected Keys:
常用模块介绍
(1)、cp模块(实现远程文件、目录的复制,以及下载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
(2)、cmd模块(实现远程的命令行调用执行)
# salt '*' cmd.run 'netstat -ntlp'
(3)、cron模块(实现被控主机的crontab操作)
## 为指定的被控主机、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'
# salt '*' cron.raw_cron root
(4)、dnsutil模块(实现被控主机通用DNS操作)
## 为被控主机添加指定的hosts主机配置项
# salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 rocketzhang.qq.com
(5)、file模块(被控主机文件常见操作,包括文件读写、权限、查找、校验等)
# salt '*' file.get_sum /etc/resolv.conf md5
# salt '*' file.stats /etc/resolv.conf
更多功能可以看文档哈 ^_^
(6)、network模块(返回被控主机网络信息)
# salt '*' network.ip_addrs
# salt '*' network.interfaces
更多功能可以看文档哈 ^_^
(7)、pkg包管理模块(被控主机程序包管理,如yum、apt-get等)
# salt '*' pkg.install nmap
# salt '*' pkg.file_list nmap
(8)、service 服务模块(被控主机程序包服务管理)
# salt '*' service.enable crond
# salt '*' service.disable crond
# salt '*' service.status crond
# salt '*' service.stop crond
# salt '*' service.start crond
# salt '*' service.restart crond
# salt '*' service.reload crond