首页 » 云计算 » saltstack用法介绍

saltstack用法介绍

 
文章目录

saltstack的使用(二)

master与salt之间的通信模式

master与minion之间的通信模式1_Page-1.png

saltstack的工作原理

201512111449827427497125.png

 

一、如何使用saltstack?

  1. 我们首先打开master的配置文件

[root@salt-master ~]# vim /etc/salt/master

(省略若干…………)

416 file_roots:

417   base:

418     – /srv/salt

可以知道/srv/salt就是配置文件放置的位置

2.这个目录是不存在的,需要创建,进入,然后写一个sls模块,可以理解为:

比如说我是神笔马良,我要画一个东西,那么总该有个位置让我来画吧,写状态配置,现在我要写一个配置,意思就是安装一个Apache,然后把这个服务启动起来,固定写法就是.sls

(注意空格,写完以后进行检查,方法就是:set list  à显示所有字符)

[root@salt-master ~]# mkdir /srv/salt

[root@salt-master ~]# vim /srv/salt/apache.sls

apache-install:$                             ß$表示空格,是我使用命令:set:list以后出现的

pkg.installed:$

– names:$

– httpd$

– httpd-devel$

$

apache-services:$

service.running:$

– name:httpd

– enable: True$

– reload: True$

上面的意思就是:

实现2个功能,安装和启动

其中:

pkg.installed 中pkg是模块 installed是方法  names 安装2个包,会使用yum安装上

apache-services 是一个名称 service.running中service是一个模块,running是方法,name(注意没有s)名称,必须指定,不然minion找不到就会报错,因为它不知道需要启动谁,最后2个就是开机自启动和可以重载。

我们来实战演示一遍

master端执行命令:

[root@salt-master salt]# salt ‘*’ state.sls apache

解析这条语句的意思:

salt:  命令

‘*’: 所有minion

state.sls: 模块有个sls的方法

apache: 附件的一个参数

在执行上面命令以后,我们可以在另外一台机器上面进行查看,究竟它做了一些什么

minion端:

# ps aux |grep yum

root     16332  0.7  0.3 265904 63960 ?        S    09:59   0:01 /usr/bin/python /usr/bin/yum -y install httpd-devel    ß正在yum安装Apache服务

root     16959  0.0  0.0 103248   864 pts/1    S+   10:04   0:00 grep yum

我们可以看看返回结果:

salt-master:       ß这个是因为我在master端也安装了一个minion,意思就是说这个主机也归master管理

———-

ID: apache-install        ßID名称

Function: pkg.installed          ß模块+方法

Name: httpd            ß名称

Result: True              ß返回结果,成功

Comment: Package httpd is already installed.

Started: 10:12:34.672798

Duration: 868.51 ms

Changes:

 

执行成功以后,我们去minion端去查看这个是否把服务启动起来

[root@salt-minion ~]# lsof -i:80

COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME

httpd   16969   root    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

httpd   16973 apache    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

httpd   16974 apache    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

httpd   16975 apache    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

httpd   16976 apache    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

httpd   16977 apache    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

httpd   16978 apache    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

httpd   16979 apache    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

httpd   16980 apache    4u  IPv6 3912882      0t0  TCP *:http (LISTEN)

我们测试一下刚才那个state能不能重复使用,我手动把服务停,然后再执行哪条语句

[root@salt-minion ~]# /etc/init.d/httpd stop

Stopping httpd:                                            [  OK  ]

[root@salt-minion ~]# lsof -i:80

master执行语句

[root@salt-master salt]# salt ‘*’ state.sls apache

然后在查看服务

[root@salt-minion ~]# lsof -i:80

COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME

httpd   17098   root    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

httpd   17101 apache    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

httpd   17102 apache    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

httpd   17103 apache    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

httpd   17104 apache    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

httpd   17105 apache    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

httpd   17106 apache    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

httpd   17107 apache    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

httpd   17108 apache    4u  IPv6 3916533      0t0  TCP *:http (LISTEN)

 

那么有个问题:

如果我一台机器有多个状态呢,这个时候我们就要使用高级状态了。

需要去写一个topfile,默认情况下,我们使用高级状态会有一个入口文件,这个入口文件里,我可以写清楚,这台机器是什么状态,那台机器是什么状态,那么我执行语句的时候就直接来入口文件读取就行了,这样呢我就你不用配置了。

默认情况下叫做top.sls  默认必须放在base环境下,目录在/srv/salt下

[root@salt-master salt]# pwd

/srv/salt

[root@salt-master salt]# cat top.sls

base:

‘*’:

– apache

解释一下上面语句的意思:

所有的机器都要执行Apache这个状态模块

[root@salt-master salt]# salt ‘*’ state.highstate

需要注意的是:如果minion端事先已经安装了服务,那么它不会重复安装

它的执行过程就是:先从入口文件开始读,即topfile开始读,它要你干嘛你就去干嘛

至此,我们上面就演示了2个内容,一是远程执行,二是状态管理

 

二、什么是base环境?

base环境就是基础环境,所有机器都要执行的状态才会写到base环境里:

比如说我所有机器都要初始化,都要安装zabbix-agent,所有机器都需要调整内核参数,所有机器都要安装epel包,这些都是要放在base环境里面的。

三、grains和pillar

接下来我们要了解的就是saltstack的数据系统:grains和pillar

grains:

谷物的意思,它是一个组件,存放在minion端,用于minion启动的时候收集系统信息,只有在minion启动的时候才会进行收集,然后就不会变化,只有再次重启,才会再次进行收集,如果更改了一些信息,那么必须重启才会去收集。

用于信息的查询:比如说我所有机器的base环境

[root@salt-master salt]# salt ‘*’ grains.ls    ß把所有的grains的名称列出来

salt-master:

– SSDs

– cpu_flags

– cpu_model

 

[root@salt-master salt]# salt ‘*’ grains.items    ß把所有grains的内容显示出来

下面贴2个取值的效果对比

[root@salt-master salt]# salt ‘*’ grains.item fqdn

salt-master:

———-

fqdn:

salt-master

salt-minion:

———-

fqdn:

salt-minion

[root@salt-master salt]# salt ‘*’ grains.get fqdn

salt-master:

salt-master

salt-minion:

salt-minion

 

比如说,我现在想去查看我所有机器的IP

[root@salt-master salt]# salt ‘*’ grains.get ip_interfaces

salt-master:

———-

eth1:

– 10.10.20.138

– fe80::250:56ff:fe95:30a3

lo:

– 127.0.0.1

– ::1

salt-minion:

———-

eth0:

– 10.10.20.135

– fe80::250:56ff:fe95:5a05

lo:

– 127.0.0.1

– ::1

[root@salt-master salt]# salt ‘*’ grains.get ip_interfaces:eth0

salt-master:

salt-minion:

– 10.10.20.135

– fe80::250:56ff:fe95:5a05

 

第二个场景:可以用来匹配minion

比如说我们环境很复杂,有centos也有debain,但是呢我只想在centOS上面执行命令,那么就可以使用grains的os的值来区别是不是centos

这里需要加一个参数 – G

[root@salt-master salt]# salt -G os:centos cmd.run ‘w’

salt-master:

11:25:32 up 36 days, 17:02,  2 users,  load average: 0.08, 0.02, 0.01

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

admin    pts/0    192.168.2.72     09:27    1.00s  1.12s  0.03s sshd: admin [pr

admin    pts/1    192.168.2.72     09:59    1:11m  0.08s  0.03s sshd: admin [pr

salt-minion:

11:25:32 up 35 days, 56 min,  1 user,  load average: 0.10, 0.03, 0.01

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

xiedi    pts/3    192.168.2.72     09:27   19:54   0.16s  0.07s sshd: xiedi [pr

 

同时,我们还可以自定义grains。这个需要修改配置文件来进行定义

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

83 grains:

84   roles:

85     – webserver

86     – memcache

重启生效

[root@salt-minion ~]# /etc/init.d/salt-minion restart

验证

[root@salt-master salt]#  salt -G ‘roles:memcache’ cmd.run ‘echo hahah’

salt-minion:

hahah

同样我们可以写一个memcache.sls来安装它

这个是在配置文件里面进行的修改,如果你觉得不方便,那么也可以在建立一个/etc/salt/grains,它默认会在这个里面去读取

[root@salt-minion ~]# cat /etc/salt/grains

web: nginx

[root@salt-minion ~]# /etc/init.d/salt-minion restart            ß记住一定要重启minion服务

Stopping salt-minion daemon:                               [  OK  ]

Starting salt-minion daemon:                               [  OK  ]

 

[root@salt-master salt]# salt -G web:nginx cmd.run ‘w’             ß这个错误是因为我们有重启minion服务

No minions matched the target. No command was sent, no jid was assigned.

ERROR: No return received

[root@salt-master salt]# salt -G web:nginx cmd.run ‘w’

salt-minion:

11:35:04 up 35 days,  1:05,  1 user,  load average: 0.10, 0.04, 0.01   ß重启以后正常

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

xiedi    pts/3    192.168.2.72     09:27   10.00s  0.20s  0.07s sshd: xiedi [pr

ß需要注意的地方就是:因为我在配置文件定义了roles,那么在文件 /etc/salt/grains里面的定义名称就不能相同

 

grains的用法

  1. 收集系统底层信息
  2. 远程执行匹配minion
  3. 在top file里面来匹配minion,匹配哪些机器需要执行什么状态

举例:

[root@salt-master salt]# cp /srv/salt/top.sls{,.ori}

[root@salt-master salt]# cat /srv/salt/top.sls

base:

‘web:nginx’:

– match: grain

– apache

ß意思就是我用grains来进行匹配,告诉它,所有的grain web的值是nginx的执行apache这个状态

[root@salt-master salt]# salt ‘*’ state.highstate      ß执行命令

 

扩展:

可以基于grains写一个cmdb,用于收集信息,然后入库。

 

pillar:

pillar是一个字典,可以用Python来进行定制,它也是 一个key-value

用途:

1、  敏感数据,设密码

2、  处理变量,差异性

 

实战:

第一步:如何定义pillar的数据

打开master的配置文件,设置一个入口

[root@salt-master salt]# vim /etc/salt/master

529 pillar_roots:

530   base:

531     – /srv/pillar

pillar也有top file ,它可以指定哪个minion能看到哪个,必须要放在base环境下

第二步:我们创建它,然后写一个jinjia模板

[root@salt-master salt]# mkdir /srv/pillar

[root@salt-master salt]# cat /srv/pillar/apache.sls

{% if grains[‘os’] == ‘CentOS’ %}

apache: httpd

{% elif grains[‘os’] == ‘Debian’ %}

apache: apache2

{% endif %}

pillar是可以引用grains的,上面的意思就是:

如果机器是centOS,那么看到的Apache名称就叫做httpd

如果机器是Debian,那么看到的Apache名称就叫做Apache2

 

然后,我们写一个top.sls来执行哪个minion可以看到apache.sls

例如:我只希望salt-minion看到apache.sls

[[root@salt-master salt]# cat /srv/pillar/top.sls

base:

‘salt-minion’:

– apache

意思就是,只让salt-minion这个机器看这个模块

验证

[root@salt-master salt]# salt ‘*’ pillar.items

salt-minion:

———-

apache:

httpd

salt-master:

———-

例如:我希望所有的机器都能看到apache.sls

[root@salt-master salt]# cat /srv/pillar/top.sls

base:

‘*’:

– apache

[root@salt-master salt]# salt ‘*’ pillar.items

salt-master:

———-

apache:

httpd

salt-minion:

———-

apache:

httpd

 

pillar主要是用在配置管理,我们可以用pillar来定义一些参数,来定位具体的主机

刷新以后再执行命令

[root@salt-master salt]# salt ‘*’ saltutil.refresh_pillar

salt-master:

True

salt-minion:

True

[root@salt-master salt]# salt -I ‘apache:httpd’ test.ping

salt-master:

True

salt-minion:

True

 

四、grain与pillar的区别

名称 存储位置 数据类型 数据采集更新方式 应用
grains minion端 静态数据 minion启动时收集,也可以使用saltutil.sync_grains进行刷新 存储minion基本数据。比如用于匹配minion,自身数据可以用来做资产管理等。
pillar master端 动态数据 在master端定义,指定给对应的minion。可以使用saltutil.refresh_pillar刷新 存储master指定的数据,只有指定的minion可以看到。用于敏感数据保存。

 

 

五、远程执行

举个例子:

[root@salt-master salt]# salt ‘*’ cmd.run ‘w’

salt-master:

13:45:23 up 36 days, 19:22,  2 users,  load average: 0.01, 0.01, 0.00

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

admin    pts/0    192.168.2.72     09:27    1.00s  1.35s  0.03s sshd: admin [pr

admin    pts/1    192.168.2.72     09:59    3:31m  0.08s  0.03s sshd: admin [pr

salt-minion:

13:45:23 up 35 days,  3:16,  1 user,  load average: 0.00, 0.00, 0.00

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

xiedi    pts/3    192.168.2.72     09:27    1:38m  0.22s  0.07s sshd: xiedi [pr

命令解释:

salt : 命令

‘*’: 指定目标

cmd.run: 模块+方法

‘w’:   参数

这些结果我们可以放到数据库或者memcache里面

通过上面的例子,可以总结为:目标、模块、返回。

目标

官网: https://docs.saltstack.com/en/latest/#salt-in-depth

  1. 基于minion 的ID来进行匹配

https://docs.saltstack.com/en/latest/topics/targeting/globbing.html#targeting-glob

[root@salt-master salt]# salt ‘salt-minion’ cmd.run ‘w’

salt-minion:

13:56:36 up 35 days,  3:27,  1 user,  load average: 0.00, 0.00, 0.00

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

xiedi    pts/3    192.168.2.72     09:27    1:49m  0.22s  0.07s sshd: xiedi [pr

  1. IP匹配

[root@salt-master salt]# salt -S ‘10.10.20.135’ test.ping

salt-minion:

True

  1. 混合使用

匹配目标,选几个常用的即可,可以直接下载官方文档PDF,需要使用的时候查看即可。

模块

service模块

https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.service.html#module-salt.modules.service

1、查看服务是否运行

[root@salt-master salt]# salt ‘*’ service.available sshd

salt-master:

True

salt-minion:

True

 

2、返回所有活动的TCP链接

 

[root@salt-master salt]# salt ‘*’ network.active_tcp

 

模块的访问控制ACL

生产中使用时,salt针对用户和模块支持访问控制,需要在master里面进行配置

[root@salt-master salt]# vim /etc/salt/master

245 #client_acl:

246 #  larry:

247 #    – test.ping

248 #    – network.*

修改为

245 client_acl:

246   xiedi:

247     – test.ping

248     – network.*

重启master让其生效

[root@salt-master salt]# /etc/init.d/salt-master restart    ß重启以后等一会在执行命令

创建用户xiedi 给密码123456 给权限

[root@salt-master salt]# chmod 755 /var/cache/salt/ /var/cache/salt/master/ /var/cache/salt/master/jobs/ /var/run/salt /var/run/salt/master/   ß给用户权限

#chmod 777 /var/log/salt/master

[root@salt-master ~]# su – xiedi

[xiedi@salt-master ~]$ salt ‘*’ test.ping

salt-master:

True

salt-minion:

True

[xiedi@salt-master ~]$ salt ‘*’ cmd.run ‘echo haha’      ß权限限制了

Failed to authenticate! This is most likely because this user is not permitted to execute commands, but there is a small possibility that a disk error occurred (check disk/inode usage).

 

基于minion来加模块

比如:我只希望这个用户只能在salt-minion上面执行命令test.ping

第一步:修改master配置

[root@salt-master ~]# vim /etc/salt/master

249   user01:

250     – salt-minion:

251       – test.ping

第二步:重启并验证

[root@salt-master ~]# su – user01

[user01@salt-master ~]$ salt ‘salt-minion’ test.ping

salt-minion:

True

[user01@salt-master ~]$ salt ‘salt-minion’ cmd.run ‘w’            ß尝试使用别的命令,提示执行不了

Failed to authenticate! This is most likely because this user is not permitted to execute commands, but there is a small possibility that a disk error occurred (check disk/inode usage).

 

设置黑名单

修改master的配置文件

[root@salt-master ~]# vim /etc/salt/master

259 #client_acl_blacklist:

260 #  users:

261 #    – root

262 #    – ‘^(?!sudo_).*$’   #  all non sudo users        ß 禁止root命令,禁止未使用 sudo

263 #  modules:

264 #    – cmd         ß禁止使用cmd命令

 

返回

我们知道,执行完saltstack的任何命令,可以将结果返回到某个地方,可以返回到MySQL数据库

现在,我们来测试将输出结果到MySQL数据库

配置文件参考官网:http://docs.saltstack.cn/zh_CN/latest/ref/returners/all/salt.returners.mysql.html#module-salt.returners.mysql

 

第一步:安装MySQL数据库

yum install mysql-server mysql mysql-devel

第二步:安装python-mysqldb这个包,不然写不进去

[root@salt-master ~]# yum install MySQL-python

第三步: 创建库和表

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;

 

DROP TABLE IF EXISTS `salt_events`;

CREATE TABLE `salt_events` (

`id` BIGINT NOT NULL AUTO_INCREMENT,

`tag` varchar(255) NOT NULL,

`data` varchar(1024) NOT NULL,

`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`),

KEY `tag` (`tag`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

use salt;

show tables;

grant all on salt.*  to salt@’%’ identified by ‘salt’;

flush privileges;

上面的意思就是:

我们创建了一个salt数据库,库里面有3张表,返回就写到salt表里面

记住,返回数据是minion直接返回的,所以所有的minion都要安装MySQL-python这个包,要保证minion跟数据库是通的

第四步:修改minion的配置文件,在末尾添加如下

# vim /etc/salt/minion

#by xiedi

mysql.host: ‘10.10.20.138’

mysql.user: ‘salt’

mysql.pass: ‘salt’

mysql.db: ‘salt’

mysql.port: 3306

重启minion服务,刷新pillar,然后执行命令

[root@salt-master ~]# salt ‘*’ saltutil.refresh_pillar

salt-master:

True

salt-minion:

True

[root@salt-master ~]# salt ‘*’ test.ping –return mysql

salt-master:

True

salt-minion:

True

连上master的数据库

[root@salt-master ~]# mysql -h 10.10.20.138 -u salt –psalt

查看执行的命令,是否在数据库salt的表salt_returns里

mysql> use salt

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> show tables;

+—————-+

| Tables_in_salt |

+—————-+

| jids           |

| salt_events    |

| salt_returns   |

+—————-+

3 rows in set (0.00 sec)

 

mysql> select * from salt_returns;

+———–+———————-+——–+————-+———+—————————————————————————————————————————————–+———————+

| fun       | jid                  | return | id          | success | full_ret                                                                                                                                | alter_time          |

+———–+———————-+——–+————-+———+—————————————————————————————————————————————–+———————+

| test.ping | 20151211154012198042 | true   | salt-master | 1       | {“fun_args”: [], “jid”: “20151211154012198042”, “return”: true, “retcode”: 0, “success”: true, “fun”: “test.ping“, “id”: “salt-master”} | 2015-12-11 15:40:12 |

+———–+———————-+——–+————-+———+—————————————————————————————————————————————–+———————+

1 row in set (0.00 sec)

原文链接:saltstack用法介绍,转载请注明来源!

0