saltstack配置

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位。SaltStack提供了一个动态基础设施通信总线用于编排,远程执行、配置管理等等。

简介

SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位。SaltStack提供了一个动态基础设施通信总线用于编排,远程执行、配置管理等等。


SaltStack、Ansible、Puppet比较


1、SaltStack(一般用于大于1000台服务器的公司环境)


  saltStack由Python编写,为server-client模式的系统,自己本身支持多master。

  运行模式为master端下发指令,客户端接收指令执行。

  saltstack依赖于zeromq消息队列,采用yaml格式编写配置文件,比较简单。

  支持api及自定义python模块,能轻松实现功能扩展。


2、Ansible(应用于1000台以下服务器的环境)   

          类似与saltstack,基于python开发,关注的重点是精简和快速。

  不需要在节点安装代理软件,通过ssh执行所有功能,安装运行简单。

  其模块可以用任何语言开发,采用yaml格式编写配置文件。

  没有客户端,较难扩展。


3、Puppet(慢慢的被市场淘汰)

  puppet由Ruby编写,为server-client模式的系统。

  运行时由客户端定时去获取自己的配置文件进而应用更改。

  也可以通过master的push命令即可触发变更。

     将命令,文件,服务等抽象成资源,概念比较统一,时间悠久,文档较多。

     就可用操作,模块,用户界面等等功能而言,是三者之中最全面的。

     安装部署难度一般,配置清单相对于其他工具较复杂。


#############################################################################

官网:www.saltstack.com

安装:repo.saltstack.com

文档:docs.saltstack.com

国内:www.saltstack.cn


saltstack

saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。

 Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。


运行方式:

Local  本地运行,交付管理

Master/Minion   <<<   常用方式  

Salt SSH   不需要客户端


3.基本架构

在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。


salt架构中的一种就是master > minion。


在远程执行系统中,salt用python通过函数调用完成任务。


运行salt依赖包:

python

zeromq

pyzmp

pycrypto

msgpack-python

yaml

jinja2


######################################################################


1.安装saltstack

(1)配置官方yum源

rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub

curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo


(2)开始安装salt

查看salt包

yum list salt


安装salt-master

yum install salt-master -y


安装salt-minion

yum install salt-minion -y


(3)salt端口

安装好salt之后开始配置,salt-master默认监听两个端口:

4505   publish_port 提供远程命令发送功能

4506   ret_port     提供认证,文件服务,结果收集等功能

确保客户端可以通信服务器的此2个端口,保证防火墙允许端口通过。因此在测试环境直接关闭防火墙。


(4)配置文件

salt-master的配置文件是/etc/salt/master

salt-minion的配置文件是/etc/salt/minion

配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面

配置salt-master

[root@master ~]# grep -v ^# /etc/salt/master|grep -v ^$

interface: 0.0.0.0  #绑定到本地的0.0.0.0地址

publish_port: 4505  #管理端口,命令发送

user: root      #运行salt进程的用户

worker_threads: 5  #salt运行线程数,线程越多处理速度越快,不要超过cpu个数

ret_port: 4506  #执行结果返回端口

pidfile: /var/run/salt-master.pid #pid文件位置

log_file: /var/log/salt/master  #日志文件地址


#自动接收minion的key

auto_accept: False


配置salt-minion文件

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

master: 192.168.1.102

master_port: 4506

user: root

id: slave

acceptance_wait_time: 10

log_file: /var/log/salt/minion


(5)启动salt-master和salt-minion

systemctl start salt-minion

systemctl start salt-master


#检查salt状态

systemctl status salt-minion

systemctl status salt-master


(6)在master上接收minion秘钥

在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。


在salt-master执行

salt-key命令用于管理mionion秘钥

[root@master ~]# salt-key -L

Accepted Keys:

Denied Keys:

Unaccepted Keys:

slave    #此时已经出现slave

Rejected Keys:

此时slave已经出现在unaccepted keys中,说明minion已经和master联系,并且master已经获取了minion的公钥,等待下一步指令。


检查master和minion的秘钥匹配

在master上执行

[root@master ~]# salt-key -f slave

Unaccepted Keys:

slave:  0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea

然后可以在minion上获取minion的秘钥


[root@slave ~]# salt-call --local key.finger

local:

   0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea


因此可确认秘钥匹配,在master上接收秘钥

[root@master ~]# salt-key -a slave

The following keys are going to be accepted:

Unaccepted Keys:

slave

Proceed? [n/Y] y

Key for minion slave accepted.

确认接收秘钥后,检验minion秘钥是否被接收


[root@master ~]# salt-key -L

Accepted Keys:

slave

Denied Keys:

Unaccepted Keys:

Rejected Keys:

秘钥接收完成后,就可以执行第一条salt啦


salt-key常用命令

只有Master接受了Minion Key后,才能进行管理。具体的认证命令为salt-key常用的有如下命令。


[root@linux-node1 ~]# salt-key -L

Accepted Keys:  #已经接受的key

Denied Keys:    #拒绝的key

Unaccepted Keys:#未加入的key

Rejected Keys:#吊销的key


#常用参数

-L  #查看KEY状态

-A  #允许所有

-D  #删除所有

-a  #认证指定的key

-d  #删除指定的key

-r  #注销掉指定key(该状态为未被认证)


#在master端/etc/salt/master配置

auto_accept: True   #如果对Minion信任,可以配置master自动接受请求


#############################################################################


首先知道master和minion都安装了什么文件,然后才知道怎么操作

1.master端

rpm -ql salt-master

/etc/salt/master      # salt master主配置文件

/usr/bin/salt           #salt master 核心操作命令

/usr/bin/salt-cp       #salt 文件传输命令

/usr/bin/salt-key    #salt证书管理

/usr/bin/salt-master    #salt master 服务命令

/usr/bin/salt-run          #salt master runner命令


2.slave端

[root@slave  ~]$rpm -ql salt-minion

/etc/salt/minion     #minion配置文件

/usr/bin/salt-call    #拉取命令

/usr/bin/salt-minion   #minion服务命令

/usr/lib/systemd/system/salt-minion.service   #minion启动脚本


#############################################################################


日常命令参数

1.test

[root@master ~]# salt '*' test.ping

slave:

   True


# salt 是一个命令

# * 表示目标主机, 在这里代表所有目标主机

# test.ping是salt远程执行的一个模块下面的方法。

这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活。


test模块实际上还有许多其他的函数


test其他函数

测试下test.echo


[root@master 192.168.199.155 ~]$salt '*' test.echo 'hello'

slave:

   hello

 

test.fib生成斐波那契数列

菲波那切数列定义是第0项是0,第1项是1,数列从第3项开始,每一项等于前两项之和。

[root@master 192.168.199.155 ~]$salt '*' test.fib 50

slave:

   |_

     - 0

     - 1

     - 1

     - 2

     - 3

     - 5

     - 8

     - 13

     - 21

     - 34

   - 1.09672546387e-05


小结

此前在机器上安装了salt minion和salt master,进行了最简单的连接,然后master接受了minion的秘钥,运行了第一条test.ping命令


2.命令组成结构

在命令行输入的命令都是         执行模块

等到命令写入到文件中就叫做        状态模块


salt --help #即可查看salt帮助

[root@master 192.168.199.155 ~]$salt --help

Usage: salt [options] '<target>' <function> [arguments]


salt命令 参数 目标 salt模块的函数 远程执行的参数


(1)完整的五部分命令

#--summary参数显示salt命令的概要

[root@master ~]$salt --summary '*' cmd.run 'hostname'

slave:

   slave


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

Summary

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

# of Minions Targeted: 1

# of Minions Returned: 1

# of Minions Did Not Return: 0

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


(2)列出所有salt的sys模块

#与系统交互的sys模块

[root@master  ~]$salt 'slave' sys.list_modules


#############################################################################


远程执行命令模块

1.cmd是超级模块,所有shell命令都能执行

[root@master 192.168.11.72 ~]$salt 'slave' cmd.run 'ps -ef|grep python'


2.远程安装nginx

#在minion上安装nginx

[root@master 192.168.11.72 ~]$salt 'slave' pkg.install "nginx"

#卸载minion上的nginx

[root@master 192.168.11.72 ~]$salt 'slave' pkg.remove "nginx"

#检查pkg包的版本

[root@master 192.168.11.72 ~]$salt 'slave' pkg.version "nginx"


3.远程管理服务模块

管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块


[root@master 192.168.11.72 ~]$salt 'slave' service.start "nginx"

slave:

   True

[root@master 192.168.11.72 ~]$salt 'slave' service.status "nginx"

slave:

   True

[root@master 192.168.11.72 ~]$salt 'slave' service.stop "nginx"

slave:

   True


#############################################################################


salt命令

--out控制salt命令结果输出的格式


JSON


[root@master ~]$salt --out=json '*' cmd.run_all 'hostname'

{

   "slave": {

       "pid": 2268,

       "retcode": 0,

       "stderr": "",

       "stdout": "slave"

   }

}


YAML


[root@master 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname'

slave:

 pid: 2289

 retcode: 0

 stderr: ''

 stdout: slave


#############################################################################


YAML语法:

在学习saltstack过程中,第一要点就是States编写技巧,简称SLS文件。这个文件遵循YAML语法。

json xml yaml 数据序列化格式

yaml容易被解析,应用于配置文件


salt的配置文件是yaml配置文件,不能用tab

saltstack,k8s,ansible都用的yaml格式配置文件


语法规则

   大小写敏感

   使用缩进表示层级关系  

   缩进时禁止tab键,只能空格

   缩进的空格数不重要,相同层级的元素左侧对其即可

   # 表示注释行


yaml支持的数据结构

   对象: 键值对,也称作映射 mapping 哈希hashes 字典 dict    冒号表示 key: value   key冒号后必须有空格

   数组: 一组按次序排列的值,又称为序列sequence 列表list     短横线  - list1

   纯量: 单个不可再分的值


对象:键值对

yaml

   first_key:

     second_key:second_value


python

   {

       'first_key':{

           'second_key':'second_value',

       }

   }


YAML是YAML Ain't Markup Language的首字母缩写,YAML的语法简单,

结构体通过空格展示

项目使用 '-' 代表

键值对通过 ':' 分割

YAML语法遵循固定的缩进风格,表示数据层级结构关系,saltstack需要每个缩进级别由2个空格组成,禁止用tabs!!!

Python中的字典是简单的键值对,go语言中称作哈希表map

字典的key通过冒号分割


key在YAML中表现形式是一个冒号结果的字符串

my_key: my_value

转化到python语法中,上述命令为

{'my_key':'my_value'}


value还可以通过缩进和key关联,四个空格!!

my_key:

   my_value

转化为python语法同样的

{'my_key':'my_value'}


YAML语法中字典是可以嵌套的

one_dict_key:

   two_dict_key:value_dict

转化为python语法

{

 'one_dict_key':{

   'two_dict_key':'value_dict'

 }

}


短横杠

YAML语法表示列表,使用一个横杠加一个空格

多个项使用同样的缩进级别作为同一个列表的部分

- list_value_one

- list_value_two

- list_value_three

列表可以作为一个键值对的value,例如一次性要安装多个软件

my_dict:

 - l1

 - l2

 - l3

转化为python代码理解就是

{

 'my_dict':['l1','l2',;l3]

}


#############################################################################


之前执行的远程命令,都是一个过程式的,类似一段shell或者python脚本执行,执行一次触发一次相同的功能。


那么大量的minion上运行远程命令就必须使用salt提供的“状态管理”了,状态是对minion的一种描述和定义,运维不需要关心部署是如何完成的,只需要描述minion需要达到什么状态。


state模块部署nginx

1.master端

(1)vim /etc/salt/master

#打开注释,写入以下,必须严格遵循语法,空格

file_roots:

base:

   - /srv/salt/base

dev:

  - /srv/salt/dev

test:

  - /srv/salt/test

prod:

  - /srv/salt/prod


重启服务:systemctl restart salt-master


(2)此步骤在master和minion都需要执行,都需要文件夹,和nginx.sls文件

[root@master  ~]$mkdir -p /srv/salt/{base,dev,test,prod}


[root@slave   ~]$mkdir -p /srv/salt/{base,dev,test,prod}


(3)这个nginx.sls状态文件,在master和minion上都得有

[root@master /srv/salt/base]$cat nginx.sls

nginx-install:

 pkg.installed:

   - name: nginx


nginx-service:

 service.running:

   - name: nginx

   - enable: True


nginx.sls描述文件

sls配置文件都遵循YAML语言描述

第一条命令使用了pkg.install安装命令,相对于运行了yum install,而此时state模块会判断nginx是否安装了,如果没有安装就进行安装,安装了就什么都不做。

状态描述都会遵循这个原则,只有检测到真实状态和所需状态不一就会执行此功能,这种性质叫做幂等性。

此时用state模块部署nginx软件,通过我们编写的nginx.sls描述性配置文件,命令行调用state模块的sls函数。


(4)启动命令,此时slave已经安装且存活了nginx,进行状态管理

[root@master  /srv/salt/base]$salt 'slave' state.sls nginx

可以去slave测试关闭nginx,删除nginx,重新执行命令,一样可以安装启动nginx


(5)通过master检查slave的nginx状态

[root@master]$salt 'slave' cmd.run 'ps -ef|grep nginx'



##########################################################################


salt采集静态信息

如果你入职了,你的老板让你收集公司300台服务器的相关硬件信息,你是一台台登录呢?还是选择用salt收集呢?又或者用python的salt-api写脚本呢


Grains

Grains 是saltstack组件中非常重要之一,在配置部署时候经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。

Minions的Grains信息是Minion启动时采集汇报给Master的

Grains是以 key  value形式存储的数据库,可以看做Host的元数据(metadata)

Grains保存着收集到的客户端的详细信息

如果slave机器数据变化,grains就过期了

在生产环境中需要自定义Grains,可以通过:

   Minion配置文件

   Grains相关模块定义

   Python脚本定义


salt 'slave' sys.doc grains #查看grains的命令用法



Grains人为是描述minion本身固有的静态属性数据,列出主机所有Grains数据

[root@master ~]$salt 'slave' grains.items


salt 'slave' grains.ls  #列出所有grains方法


1.检索某些数据

[root@master ~]$salt 'slave' grains.item os id host

slave:

   ----------

   host:

       slave

   id:

       slave

   os:

       CentOS


利用Grains静态信息定位主机

salt '*' grains.item key1 key2 key3


salt '*' -G

#定位Cenots的机器

[root@master ~]$salt -G 'os:CentOS' test.ping

slave:

   True

 

#定位操作系统系统是7系列的机器

[root@master ~]$salt -G 'osrelease:7*' test.ping

slave:

True


#找出ip地址

salt '*' grains.item fqdn_ip4


因此用grains.items列出所有的数据匹配主机,以及根据单一信息定位数据,Grains还可以自定义来满足不同的需求。


2.自定义设置Grains数据


#设置数据

[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_num 8

slave:

   ----------

   cpu_num:

       8

#查询数据


[root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_num

slave:

   ----------

   cpu_num:

       8

在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains


[root@slave 192.168.11.71 ~]$cat /etc/salt/grains

cpu_num: 8


#对于复杂的数据结构,可以添加灵活的JSON语法

[root@master  ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]'

slave:

   ----------

   cpu_info:

       - Intel

       - Xeon

       - 10

[root@master ~]$salt 'slave' grains.item cpu_info

slave:

   ----------

   cpu_info:

       - Intel

       - Xeon

       - 10


此时可以检查minion服务器上的grains文件


[root@slave ~]$cat /etc/salt/grains

cpu_info:

- Intel

- Xeon

- '10'

cpu_num: 8

因此Grains数据写入配置文件后,重启salt-minion服务,数据也不会丢失


#想要删除可以通过grains.delval命令删除,或者去minion的配置文件删除配置一样完成操作(或者删除文件)


方法一,清空值

[root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_info

slave:

   None

[root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_num

slave:

   None


方法二 删除minion的grains配置文件,重启服务

[root@slave 192.168.11.71 ~]$rm -rf /etc/salt/grains

[root@slave 192.168.11.71 ~]$!sys

systemctl restart salt-minion


检查结果删除成功


#############################################################################


Pillar

Pillar也是saltstack组件中非常重要的组件之一,称作数据管理中心,经常配合states在大规模的配置管理中使用。


Pillar是动态的,存储在master端,提供和给minion端


Pillar在SaltStack中主要的作用是存储和定义配置管理中需要的一些数据,比如软件版本号,用户账号密码等,保证敏感数据不被其他minion看到


存储格式与Grains类似,都是YAML格式


在master配置文件中有一段Pillar settings选项专门定义Pillar的参数

cat /etc/salt/master  

#此配置代表pillar的工作根目录,在/srv/pillar下,然后可以新建sls文件

#pillar_roots:

#  base:

#    - /srv/pillar


默认pillar的工作目录在/srv/pillar目录下,执行如下代码

mkdir -p /srv/pillar

#指定环境,标记,引用packages.sls和services.sls

vim /srv/pillar/top.sls

base:

 '*':

     - packages

     - services


vim /srv/pillar/packages.sls

nginx:

   packages-name: nginx

   version: 1.12.2


vim /srv/pillar/services.sls

nginx:

   port: 80

   user: root


检查我们设置的pillar值


[root@master 192.168.199.155 /srv/pillar]$salt '*' pillar.item nginx

slave:

   ----------

   nginx:

       ----------

       packages-name:

           nginx

       port:

           80

       user:

           root

       version:

           1.12.2


pillar与Grains对比

类型     数据采集方式   应用场景                   定义位置

Grains   静态         minion启动时收集  数据查询  目标选择  配置管理   minion

Pillar   动态         master进行自定义  目标选择  配置管理  敏感数据   master


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
Web App开发 应用服务中间件 nginx
saltstack批量部署并配置nginx
最近应别的部门要求研究了一下saltstack,感觉很好用哈!虽然我现在生产环境用的puppet,想以后逐渐用这个去替代puppet,至于ansible还没研究,以后有时间再看看吧! 一、Saltstack是什么? saltstack是一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。
1850 0
SaltStack Syndic配置
参考URL: http://www.ttlsa.com/saltstack/saltstack-syndic-example/   虽然中心master看不到 minion的key 但是还是可以直接指导minion id干活。
769 0
|
Web App开发 应用服务中间件 nginx
基于saltstack实现的配置集中化管理
  Saltstack是一个具备puppet与func功能为一身的集中化管理平台,saltstack基于python实现,功能十分强大,各模块融合度及复用性极高,官方极力推荐作为云计算平台的基础架构。
820 0