一、安装
master:
yum -y install salt-master
minion:
yum -y install salt-minion
二、配置
只需要配置minion端即可
[root@linux-node2 ~]# grep ^[a-z] /etc/salt/minion
master: ip地址
id(默认是使用python获取fqdn名字,也可以不配置)
三、认证(salt认证是经过加密的)
master:
[root@linux-node1 ~]# cd /etc/salt/pki/master/
[root@linux-node1 master]# ls
master.pem master.pub minions minions_autosign minions_denied minions_pre minions_rejected
minion:
[root@linux-node2 ~]# cd /etc/salt/pki/minion/
[root@linux-node2 minion]# ls
minion.pem minion.pub(会把公钥发给master)
以下命令都是在master端执行(认证的命令):
[root@linux-node1 ~]# salt-key -L #列出所有的minion
[root@linux-node1 ~]# salt-key -A #同意所有的minion
[root@linux-node1 ~]# salt-key -a linux* #同意含有linux的minion
[root@linux-node1 ~]# salt-key -D #删除所有的minion
[root@linux-node1 ~]# salt-key -d linux* #删除所有含有linux的minion
查看salt版本:
[root@linux-node2 ~]# salt-call --version
salt-call 2015.5.10 (Lithium)
四、远程执行命令
1、[root@linux-node1 ~]# salt '*' test.ping
linux-node2.example.com:
True
linux-node3.example.com:
True
备注:test是一个模块,ping是test模块中的一个方法
2、[root@linux-node1 ~]# salt '*' cmd.run 'uptime' #cmd.run 可以执行所有的shell命令
linux-node2.example.com:
17:59:34 up 19 min, 1 user, load average: 0.01, 0.02, 0.05
linux-node3.example.com:
17:59:34 up 19 min, 1 user, load average: 0.01, 0.02, 0.05
3、[root@linux-node1 ~]# salt '*' cmd.run 'df -h'
五、使用salt配置管理
1、修改master的配置文件:(base环境是必须的)
418 file_roots:
419 base:
420 - /srv/salt #这个是base环境的目录2、[root@linux-node1 ~]# mkdir /srv/salt
3、[root@linux-node1 ~]# systemctl restart salt-master4、写状态配置
[root@linux-node1 ~]# cd /srv/salt/
[root@linux-node1 salt]# cat apache.sls
apache-install: #这个是自定义的名称,但是必须唯一
pkg.installed:
- names:
- httpd
- httpd-devel
apache-service: #这个是自定义的名称,但是必须唯一
service.running:
- name: httpd
- enable: True
- reload: True5、执行
[root@linux-node1 salt]# salt ‘*’ state.sls apache #在所有机器上6、查看
[root@linux-node2 ~]# ps -ef | grep httpd7、写一个高级的,就是一个入口文件,默认名称为top.sls,默认放在base环境下(/srv/salt),也就是基础环境
base:
‘*’:
- apache
备注:必须制定base环境,*指代所有的机器,apache指的是执行apache.sls这个配置8、执行:[root@linux-node1 salt]# salt ‘*’ state.highstate
六、salt的数据系统(Gains和Pillar)
名称 | 存储位置 | 数据类型 | 数据采集更新方式 | 应用 |
---|---|---|---|---|
Gains | minion端 | 静态数据 | minion启动时定义,也可以使用saltutil.sync_grains进行刷新 | 存储minion基本数据。比如用于匹配minion,自身数据可以用来做资产管理等 |
Pillar | master端 | 动态数据 | 在master端定义,指定给对应的minion。可以使用saltutil.refresh_pillar刷新 | 存储master指定的数据,只有制定的minion可以看到。用于敏感数据存储 |
状态模块:状态间关系
功能:条件判断,主要用于cmd状态模块
常用方法:
onlyif:检查的命令,仅当"onlyif"选项指向的命令返回true时才执行name定义的命令
unless:检查的命令,仅当"unless"选项指向的命令返回false时才执行name定义的命令
状态依赖关系模块:requisites
常用方法:
require 我依赖某个状态
require_in 我被某个状态依赖
watch 我关注某个状态
watch_in 我被某个状态关注
七、salt的数据系统 Grains(静态数据)
1、作用:①收集系统底层信息 ②在远程执行命令中匹配minion ③在top file里面匹配minion
2、Grains:收集minion启动时的数据信息,这个是放在minion端,只有在minion启动的时候才会收集,只有minion重新启动的时候才会重新收集
3、命令
[root@linux-node1 ~]# salt '*' grains.ls #把所有的grains的key列出来
[root@linux-node1 ~]# salt '*' grains.items #列出所有内容
[root@linux-node1 ~]# salt '*' grains.item fqdn #显示单个内容
[root@linux-node1 ~]# salt '*' grains.get fqdn #显示单个内容
[root@linux-node1 ~]# salt '*' grains.get ip_interfaces:eth0 #显示eth0
4、匹配minion(所有centos上执行命令)
[root@linux-node1 ~]# salt '*' grains.get os #查看操作系统
[root@linux-node1 ~]# salt -G os:CentOS cmd.run 'w' #在所有centos机器上执行命令
-G:使用grains进行匹配
salt -G 'cpuarch:x86_64' grains.item num_cpus
salt -G 'os:CentOS' test.ping
salt -G 'ec2_tags:environment:*production*'
5、自定义grains(在minion的配置文件)
修改minion的配置文件
88 grains:
89 roles:
90 - webserver
91 - memcache
[root@linux-node1 ~]# salt -G 'roles:memcache' cmd.run 'w' #在所有角色是memcache的机器上执行命令
备注:也可以自定义一个文件(/etc/salt/grains),
[root@linux-node1 ~]# cat /etc/salt/grains
name: nginx
[root@linux-node1 ~]# systemctl restart salt-minion
[root@linux-node1 ~]# salt -G name:nginx cmd.run 'w'
7、在top file中匹配minion
[root@linux-node1 ~]# cat /srv/salt/top.sls
base:
'name:nginx' #这里没有空格
- match: grain #使用grains进行匹配
- apache
备注:名称是nginx执行apache.sls
八、salt的数据系统 Pillar(给minion执行想要的数据,在master端设置)
1、作用:各种输出都是字典 ①敏感数据 ②处理变量,差异性 ③做配置管理时候,自定义一些参数 ④定义主机
2、首先在master的配置文件中把pillar打开,并重启master服务
554 pillar_opts: True
[root@linux-node1 ~]# salt '*' pillar.items #查看
3、首先设一个入口文件,在master的配置文件中设置
pillar_opts: False #将这个关掉
531 pillar_roots:
532 base:
533 - /srv/pillar #设置pillar的目录
4、执行的时候哪一个minion能看到:要在top.sls中定义(这个是pillar的top,和在base环境下写的没有关系)
[root@linux-node1 ~]# cat /srv/pillar/top.sls
base:
'*':
- apache
[root@linux-node1 ~]# cat /srv/pillar/apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
5、执行命令
[root@linux-node1 ~]# salt '*' saltutil.refresh_pillar #刷新下
[root@linux-node1 ~]# salt '*' pillar.items #查看
linux-node2.example.com:
----------
apache:
httpd
[root@linux-node1 ~]# salt -I 'apache:httpd' test.ping #测试,使用pillar用 -I 指定
九、salt的远程执行
语法: salt '<target>' <function> [arguments]
包括的内容:
目标(target)
模块(modules)
返回(return)
1、target[https://docs.saltstack.com/en/latest/topics/tutorials/modules.html#target]
①根据minion id进行匹配 salt 'linux-node2.example.com' cmd.run 'w'
②根据shell通配符进行匹配
salt '*' test.ping
salt '*.example.org' test.ping
salt -G 'os:Ubuntu' test.ping #使用grains进行匹配,使用-G
salt -E 'virtmach[0-9]' test.ping #使用正则表达式必须使用 -E 参数
salt -L 'foo,bar,baz,quo' test.ping #list,罗列出来
salt -S '192.168.88.134' test.ping #使用IP和子网段尽心匹配
salt -C 'S@10.0.0.0/24 and G@os:CentOS' test.ping #混合使用使用 -C
salt -C 'G@os:Ubuntu and webser* or E@database.*' test.ping #混合使用使用 -C (and or not)
③在top里面使用正则
base:
'web-(prod|devel)':
- match: pcre
- webserver
2、模块
①service
salt '*' service.available sshd #判断当前服务是否在运行
salt '*' service.get_all #显示正在运行的服务
salt '*' service.reload <service name>
salt '*' service.restart <service name>
②network
salt '*' network.active_tcp #返回所有活动的tcp链接
salt '*' network.arp #返回arp
salt '*' network.interface eth0 #返回指定的ip地址
。。。。。
3、模块的acl访问控制(client_acl)
①授权
chmod 755 /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master
②修改master的配置文件
247 client_acl:
248 tom:
249 - test.ping
250 - network.*
让tom用户只能运行test.ping 和network下面的所有方法
client_acl:
tom:
- test.ping
- network.*
user01:
- linux-node2*:
- test.ping
备注:让user01用户只能在linux-node2*机器上运行 test.ping
设置黑名单(client_acl_blacklists,master的配置文件):
4、返回,将其记录到mysql中[https://docs.saltstack.com/en/latest/ref/returners/all/index.html]
①安装python-mysqldb的模块,直接使用yum安装即可
②创建数据库,并授权 grant all on salt.* to salt@'192.168.88.0/24' identified by 'salt';
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX jid ON jids(jid) USING BTREE;
DROP TABLE IF EXISTS `salt_returns`;
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;
DROP TABLE IF EXISTS `salt_events`;
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;
③yum -y install MySQL-python (返回数据是minion返回,所以所有的minion都要安装这个包)
④在minion的配置文件中添加以下内容:
mysql.host: 'salt'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306
salt '*' saltutil.refresh_pillar
salt '*' test.ping --return mysql
master_job_cache:mysql
salt '*' test.ping