一、基础介绍

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轻松扩展。

网络设备自动化运维平台_SaltStack


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_02

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

注意- 后有空格

网络设备自动化运维平台_网络设备自动化运维平台_03

重启服务

[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_04

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