官方文档地址:http://repo.saltstack.com/#rhel

4.1、saltstatck介绍:

用户要一致,这里使用的是root用户;

用于批量管理成百上千的服务器;

并行的分发,使用python开发,提供丰富的api接口;

Saltstack的master端监听4505与4506端口,4505为master和minion认证通信端口,4506为master用来发送命令或者接收minion的命令执行返回信息;

当客户端启动后,会主动连接master端注册,然后一直保持该TCP连接,而master通过这条TCP连接对客户端进行控制。如果连接断开,master对客户端

将不能进行控制,但是当客户端检查到连接断开后,会定期向master端请求注册连接;

1、saltstack运行方式:

①Local②Master/Minion③master④Salt SSH

2、saltstack三大功能:

①远程执行②配置管理③云管理

3、saltstack数据系统:

①Grains (静态数据)②pillar (动态数据)

4、saltstack配置管理:

①SLS(YAML、Jinja)②Highstate③States Mod

5、Saltstack几个重要的组件:

(1)grains:

grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等静态信息。grains的信息是静态的,并不会时时变更,

它只是在 minion 启动时收集到的;

(2)pillar:

pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,

还可以定义变量等;

(3)state:

它是saltstack的最核心功能,通过预先指定好的sls文件对被控主机进行管理:包/文件/网络配置/系统服务/系统用户等;

6、服务器分配:

本实验用的是saltstack的Master/Minion模式;


服务器名称

ip地址

controller-node1(主)

172.16.1.90

slave-node1(从)

172.16.1.91




4.2、软件安装:

1、安装saltstack yum源,主从一致:

[root@controller-node1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm

2、主节点安装salt-master:

[root@controller-node1 ~]# yum install salt-master

3、从节点安装slat-minion:

[root@slave-node1 ~]# yum install salt-minion

4.3、saltstack配置文件配置:

1、主节点:

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

interface: 172.16.1.90

publish_port: 4505

#默认值;

user: root

#默认值;

ret_port: 4506

#默认值;

timeout: 15

#saltstack执行命令的超时时间,默认是5秒;

state_top: top.sls

#默认值;

file_roots:

base:

- /srv/salt/base

dev:

- /srv/salt/dev

test:

- /srv/salt/test

prod:

- /srv/salt/prod

pillar_roots:

base:

- /srv/pillar/base

dev:

- /srv/pillar/dev

test:

- /srv/pillar/test

prod:

- /srv/pillar/prod

[root@controller-node1 ~]# mkdir -p /srv/salt/{base,dev,test,prod}

[root@controller-node1 ~]# tree /srv/salt/

/srv/salt/

├── base

├── dev

├── prod

└── test

4 directories, 0 files

[root@controller-node1 ~]# mkdir -p /srv/pillar/{base,dev,test,prod}

[root@controller-node1 ~]# tree /srv/pillar/

/srv/pillar/

├── base

├── dev

├── prod

└── test

4 directories, 0 files

2、从节点:

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

master: 172.16.1.90

master_port: 4506

#默认值;

user: root

#默认值;

id: 172.16.1.91

4.4、启动saltstack服务并加入到开机自启动:

1、主节点:

[root@controller-node1 ~]# systemctl start salt-master

[root@controller-node1 ~]# systemctl enable salt-master

[root@controller-node1 ~]# netstat -tunlp | grep "45"

tcp 0 0 172.16.1.90:4505 0.0.0.0:* LISTEN 1962/python

tcp 0 0 172.16.1.90:4506 0.0.0.0:* LISTEN 1968/python

[root@controller-node1 ~]# lsof -ni:4505

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

salt-mast 12990 root 16u IPv4 64670 0t0 TCP 172.16.1.90:4505 (LISTEN)

salt-mast 12990 root 18u IPv4 68274 0t0 TCP 172.16.1.90:4505->172.16.1.91:60502 (ESTABLISHED)

2、从节点:

[root@slave-node1 ~]# systemctl start salt-minion.service

[root@slave-node1 ~]# systemctl enable salt-minion.service

[root@slave-node1 ~]# netstat -tunlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1052/sshd

tcp6 0 0 :::22 :::* LISTEN 1052/sshd

[root@slave-node1 ~]# lsof -ni:4505

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

salt-mini 1888 root 21u IPv4 29671 0t0 TCP 172.16.1.91:60502->172.16.1.90:4505 (ESTABLISHED)

4.5、将从节点加入到主节点:

1、列出saltstack当前节点状况:

[root@controller-node1 ~]# salt-key -l all

Accepted Keys:

Denied Keys:

Unaccepted Keys:

172.16.1.91

Rejected Keys:

2、将从节点加入:

[root@controller-node1 ~]# salt-key -a 172.16.1.91 #支持通配符,比如 salt-key -a 172.*

The following keys are going to be accepted:

Unaccepted Keys:

172.16.1.91

Proceed? [n/Y] y

Key for minion 172.16.1.91 accepted.

[root@controller-node1 ~]# salt-key -l all

Accepted Keys:

172.16.1.91

Denied Keys:

Unaccepted Keys:

Rejected Keys:

3、补充:

1、saltstack salt-key动作命令(支持通配符):

[root@controller-node1 ~]# salt-key --help

-l ARG:列出公钥;

pre、un和unaccepted将列出未接受公钥的minion;

acc或accepted将列出已接受公钥的minion;

rej或rejected将列出被拒绝接收公钥的minion;

den或denied将列出被拒绝接收公钥的minion;

all将列出所有键;

-L: --list-all列出所有公钥;

-a ACCEPT:接受指定minion的公钥,默认范围是Unaccepted Keys;

    --include-rejected

    --include-denied

-A:接受所有minion为未接受的公钥,默认范围是Unaccepted Keys;

--include-all #包括rejected和denied、unaccepted;

    --include-rejected

    --include-denied

-r REJECT:拒绝接受指定minion的公钥,默认范围是Unaccepted Keys;

--include-accepted

  --include-denied

-R:拒绝所有minion的公钥,默认范围是Unaccepted Keys;

  --include-all #包括accepted和denied、unaccepted;

    --include-accepted

    --include-denied

-p PRINT: 打印指定的minion的公钥,默认范围是所有区域;

-P:打印所有minion的公钥,默认范围是所有区域;

-d:DELETE:删除指定的minion的公钥,默认范围是所有区域;

-D:删除所有minion的公钥,默认范围是所有区域;

#删除的minion公钥会被放到Unaccepted Keys区域下;

2、saltstack master和minion的认证过程:

(1)master在第一次启动时会在/etc/salt/pki/(空目录)目录下生成master、minion两个目录,在master目录下会生成

master.pem(私钥)和master.pub(公钥)秘钥对和其它的目录;

(2)minion在第一次启动时会在/etc/salt/pki/(空目录)目录下生成master、minion两个目录,在minion目录下会生成

minion.pem(私钥)和minion.pub(公钥)秘钥对和其它的目录,并将自己的公钥发送给master;

(3)在未将minion注册到master时,minion的公钥会被放在master端的/etc/salt/pki/minions_pre/目录下并以

在minion配置文件中配置的id为名称,当minion加入到master后,minion的公钥会被放在master端的

/etc/salt/pki/minions/目录下,并将自己的公钥发送给minion,存放在minion的/etc/salt/pki/minion/目录下,这样便完

成了master和minion的认证,master和minion使用公钥和私钥进行加密,使用的是aes(高级加密标准)的加密算法,非常的

安全;

(4)如果minion配置文件中的id需要改变的解决办法:

1)停止minion服务;

2)在master端使用'salt-key -d <name>'删除公钥在master上;

提示:如果没有执行上面一步,即使删除了minion的公钥,那么minion也会将公钥发送给master

这样就会导致删不掉minion的公钥;

3)删除minion /etc/salt/pki/目录下的所有内容;

4)修改minion配置文件中的id;

5)启动minion服务;

(5)master和minion认证目录:

1)master:

[root@controller-node1 ~]# tree /etc/salt/pki/

/etc/salt/pki/

├── master

│   ├── master.pem

│   ├── master.pub

│   ├── minions

│   │   └── 172.16.1.91

│   ├── minions_autosign

│   ├── minions_denied

│   ├── minions_pre

│   └── minions_rejected

└── minion

2)minion:

[root@slave-node1 ~]# tree /etc/salt/pki/

/etc/salt/pki/

├── master

└── minion

├── minion_master.pub

├── minion.pem

└── minion.pub

(6)根据master和minion的认证原理,可以对master的/etc/salt/目录和/srv/目录进行备份,如果

出现master服务器损坏的情况下可以进行还原,还原步骤如下:

1)关闭salt-master服务:

[root@controller-node1 ~]# systemctl stop salt-master.service

2)还原备份的目录,在还原之前需要对现有的目录进行备份;

3)启动salt-master服务:

[root@controller-node1 ~]# systemctl start salt-master.service

3)忽略salt-master监听总线;

[root@controller-node1 ~]# salt '*' cmd.run 'uptime' --async

4)还原成功,可以正常使用;

4.6、常用远程执行命令;

1、远程命令格式:

命令 目标 模块 参数

2、常用命令:

(1)远程测试:

[root@controller-node1 ~]# salt '*' test.ping

#单引号表示转义,也可以使用\*或"*"

(2)cmd密令:

[root@controller-node1 ~]# salt '*' cmd.run 'uptime'

#cmd命令可以执行linux中一切的命令;

(3)软件安装命令:

[root@controller-node1 ~]# salt '*' pkg.install 'httpd'

(4)网络命令:

[root@controller-node1 ~]# salt '*' network.active_tcp

[root@controller-node1 ~]# salt '*' network.arp

[root@controller-node1 ~]# salt '*' network.connect 172.16.1.91 80

[root@controller-node1 ~]# salt '*' network.get_hostname

[root@controller-node1 ~]# salt '*' network.default_route

(4)服务命令:

[root@controller-node1 ~]# salt '*' service.get_enabled

[root@controller-node1 ~]# salt '*' service.get_disabled

[root@controller-node1 ~]# salt '*' service.start 'httpd'

[root@controller-node1 ~]# salt '*' service.reload 'httpd'

[root@controller-node1 ~]# salt '*' service.stop 'httpd'

[root@controller-node1 ~]# salt '*' service.status 'httpd'

(2)查看top.sls中使用的sls,只能查看/srv/salt/base/目录下的sls;

[root@controller-node1 ~]# salt '*' state.show_top

(3)远程拷贝命令:

[root@controller-node1 ~]# salt-cp '*' /etc/passwd /tmp/

4.7、配置管理:

1、yaml语法说明:

(1)yaml类似于xml文件;

(2)缩进:除第一层不用缩进外,每层之间是两个空格的缩进,不能使用tab键;

(3)冒号:除以冒号结尾或路径外,后面必须要有一个空格;

(4)短横线:表示列表,短横线后面必须要有一个空格;

(5)井号:表示注释;

2、编写安装apache服务的描述文件:

缺点:不自动化,执行时还需要通知哪台机器执行;

[root@controller-node1 ~]# mkdir /srv/salt/base/web/ -p

[root@controller-node1 ~]# vim /srv/salt/base/web/apache.sls

apache-install:

#id,随便写,但是必须要唯一;

pkg.installed:

#远程执行软件安装命令;

- name: httpd

#安装的软件名称;


apache-service:

service.running:

#远程执行软件服务命令;

- name: httpd

#启动httpd;

- enable: True

#将软件加入到开机自启动

#说明,以上配置从上到下依次执行,如果服务已完成则行;

[root@controller-node1 ~]# salt '172.16.1.91' state.sls web.apache

#默认环境是base,换环境需要加saltenv=prod;

3、编写自动化配置:

说明:使用top.sls自动化文件进行配置,该配置文件必须在/srv/salt/base/下面;

[root@controller-node1 ~]# vim /srv/salt/base/top.sls

base:

#调用base环境下的sls;

'172.16.1.91':

#允许哪些机器执行操作,支持通配符;

- web.apache

#sls的名称;

[root@controller-node1 ~]# salt '*' state.highstate

#虽然说是让所有的节点执行工作,但是如果top.sls中没有定义一些节点的执行内容,那么该节就不会执行命令,最小化原则;

4、配置文件执行测试(test=True):

它会告诉你它会干什么,但是不会具体实施,颜色会不同;

[root@controller-node1 ~]# salt '172.16.1.91' state.sls web.apache test=True

[root@controller-node1 ~]# salt '*' state.highstate test=True

4.8、saltstack的数据存储系统Grains和pillar:

1、Grains和pillar的区别:


数据存储类型

存储位置

类型

采集方式

场景

Grains

minion

静态

minion启动时,可以手动刷新生效

1、获取信息 2、匹配

pillar

master

动态

指定,实时生效

1、敏感数据配置 2、匹配





2、Grains(谷粒):

Grains存放着salt-minion启动时收集的信息,是静态的信息,在minion上设置,以key-value的形式保存且为明

文,用来保存隐秘的数据是不安全的,设置后需要同步minion上的grains才能生效,Grains应用场景为信息查询;

(1)获取所有的grains信息:

[root@controller-node1 ~]# salt '172.16.1.91' grains.items

(2)获取指定grains信息:

[root@controller-node1 ~]# salt '172.16.1.91' grains.get 'ip4_interfaces:eth1'

172.16.1.91:

- 172.16.1.91

[root@controller-node1 ~]# salt '*' grains.get 'serialnumber'

172.16.1.91:

VMware-56 4d df f4 02 29 4e 45-6f c7 af 78 9d ef a2 44

[root@controller-node1 ~]# salt '*' grains.get 'osrelease'

172.16.1.91:

7.5.1804

(3)远程执行中匹配目标,使用grains匹配minion(缺点:不能指定多个条件且不可控):

[root@controller-node1 ~]# salt -G 'os:CentOS' cmd.run 'uptime'

172.16.1.91:

13:54:02 up 3:50, 1 user, load average: 0.00, 0.01, 0.05

#在所有的minion中grains值为'os:CentOS'的minion执行uptime命令;

(4)在top.sls中匹配使用:

[root@controller-node1 ~]# cat /srv/salt/base/top.sls

base:

'os:CentOS':

- match: grain

- web.apache

(5)grains的自定义需求:

1)在minion上创建grains文件:

[root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'touch /etc/salt/grains'

2)在minion的grains文件中定义item项:

[root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'echo "ip_eth1: 172.16.1.91" >/etc/salt/grains'

3)同步minion的grains:

[root@controller-node1 ~]# salt '172.16.1.91' saltutil.sync_grains

4)获取minion中自定义的item项:

[root@controller-node1 ~]# salt '172.16.1.91' grains.get 'ip_eth1'

172.16.1.91:

172.16.1.91

3、Pillar(柱):

pillar和grains一样是saltstack一个重要的数据存储系统,以key-value形式保存数据,对数据进行了加密,很安全,

主要放一些敏感的数据,比如密码、变量,且只能在top.sls中使用,pillar是在master上设置的,且是针对minion定

义的一些信息,设置后立即生效;

(1)获取minion所有的pillar:

[root@controller-node1 ~]# salt '172.16.1.91' pillar.items

172.16.1.91:

----------

#默认没有是因为master的配置文件中'#pillar_opts: False'选项是没有开启的,不推荐打开;

(2)如何设置pillar:

1)编写pillar安装文件(minion分类):

apache.sls

{% if grains['os'] == 'CentOS' %}

#在pillar中引入grains进行参数判断;

apache: httpd

#key:apache,value:httpd(要安装的软件名称);

{% elif grains['os'] =='Debian' %}

apache: apache2

{% endif %}

2)编写top.sls文件(minion范围):

[root@controller-node1 ~]# cat /srv/pillar/base/top.sls

base:

'172.16.1.91':

- apache

3)获取设置的pillar:

[root@controller-node1 ~]# salt '*' pillar.items

172.16.1.91:

----------

apache:

httpd

4)在状态文件中引用pillar(安装):

[root@controller-node1 ~]# cat /srv/salt/base/web/apache.sls

apache-install:

pkg.installed:

apache'] }}


apache-service:

service.running:

apache'] }}

- enable: True

5)修改/srv/salt/base/top.sls(自动化):

[root@controller-node1 ~]# cat /srv/salt/base/top.sls

base:

'*':

- web.apache

6)执行

[root@controller-node1 ~]# salt '*' state.highstate

7)说明:

test=True和top.sls中的grains匹配在pillar中正常使用;

4.9、将saltstack的返回值写到数据库:

1、在master上安装数据库:

[root@controller-node1 ~]# yum install -y mariadb-server

[root@controller-node1 ~]# systemctl start mariadb

[root@controller-node1 ~]# systemctl enable mariadb

2、配置slatstack库:

(1)创建库和表:

参考文档:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html

[root@controller-node1 ~]# mysql -uroot -p123456

MariaDB [(none)]>


CREATE DATABASE salt DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;


USE salt;


CREATE TABLE `jids` (

`jid` varchar(255) NOT NULL,

`load` mediumtext NOT NULL,

UNIQUE KEY `jid` (`jid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `salt_returns` (

`fun` varchar(50) NOT NULL,

`jid` varchar(255) NOT NULL,

`return` mediumtext NOT NULL,

`id` varchar(255) NOT NULL,

`success` varchar(10) NOT NULL,

`full_ret` mediumtext NOT NULL,

`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

KEY `id` (`id`),

KEY `jid` (`jid`),

KEY `fun` (`fun`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `salt_events` (

`id` BIGINT NOT NULL AUTO_INCREMENT,

`tag` varchar(255) NOT NULL,

`data` mediumtext NOT NULL,

`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

`master_id` varchar(255) NOT NULL,

PRIMARY KEY (`id`),

KEY `tag` (`tag`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


MariaDB [salt]> show tables;

+----------------+

| Tables_in_salt |

+----------------+

| jids |

| salt_events |

| salt_returns |

+----------------+

3 rows in set (0.00 sec)

3、给库进行授权:

MariaDB [salt]> grant all on salt.* to salt@'172.16.1.%' identified by '123456';

MariaDB [salt]> flush privileges;

4、安装mysql的python模块:

[root@controller-node1 ~]# yum install -y MySQL-python

5、在master的配置文件中添加连接数据库的配置:

[root@controller-node1 ~]# vim /etc/salt/minion #部分配置修改;

cachedir: /var/cache/salt/master

#cache存储路径;

keep_jobs: 12

#mysql返回cache保存的时间,默认是24小时,建议改小,不然saltstack会占用磁盘;

#return: mysql

master_job_cache: mysql

mysql.host: '172.16.1.90'

mysql.user: 'salt'

mysql.pass: '123456'

mysql.db: 'salt'

mysql.port: 3306

6、重启salt-master:

[root@controller-node1 ~]# systemctl restart salt-master.service

7、测试:

[root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'uptime' -v

Executing job with jid 20190729112956524977

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


172.16.1.91:

11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05

[root@controller-node1 ~]# salt-run jobs.lookup_jid 20190729112956524977

172.16.1.91:

11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05

[root@controller-node1 ~]# mysql -uroot -p123456

MariaDB [salt]> select * from salt_returns\G;

*************************** 1. row ***************************

fun: cmd.run

jid: 20190729112956524977

return: " 11:29:56 up 1:09, 1 user, load average: 0.00, 0.01, 0.05"

id: 172.16.1.91

success: 1

full_ret: {"fun_args": ["uptime"], "jid": "20190729112956524977", "return": " 11:29:56 up 1:09, 1 user,

load average: 0.00, 0.01, 0.05", "retcode": 0, "success": true, "cmd": "_return", "_stamp": "2019-07-29T03:29:56.836808",

"fun": "cmd.run", "id": "172.16.1.91"}alter_time: 2019-07-29 11:29:56

8、补充:

(1)以上的mysql返回方法是master的返回,常用;

(2)在minion配置mysql返回,不常用:

1)在minion上安装MySQL-python:

[root@controller-node1 ~]# salt '*' pkg.install 'MySQL-python'

2)在minino的配置文件中添加如下参数:

[root@slave-node1 ~]# vim /etc/salt/minion

#return: mysql

mysql.host: '172.16.1.90'

mysql.user: 'salt'

mysql.pass: '123456'

mysql.db: 'salt'

mysql.port: 3306

2)在命令行使用'--return mysql参数指定返回':

[root@controller-node1 ~]# salt '172.16.1.91' cmd.run 'uptime' --return mysql

4.10、