Linux -- SaltStack

本文详细介绍了SaltStack,一个用于配置管理和分布式远程执行的系统。内容涵盖SaltStack的核心功能、基本原理、安装步骤、远程执行机制、模块编写、Grains与Pillar的数据系统、Jinja模板的使用、Job管理、salt-ssh和salt-syndic的介绍,以及salt-api的配置和使用。通过对这些内容的了解,读者可以掌握如何利用SaltStack提高运维效率。

一. SaltStack简介

  • saltstack是一个配置管理系统,能够维护预定义状态的远程节点
  • saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据
  • saltstack是运维人员提高工作效率、规范业务配置与操作的利器

1. Salt的核心功能

  • 使命令发送到远程系统是并行的而不是串行的
  • 使用安全加密的协议
  • 使用最小最快的网络载荷
  • 提供简单的编程接口

Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。 

2.  Salt的基本原理

SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口

minion上线后先与master端通信,将pub key发过去,此时master端通过salt-key -L命令可以查看minion的key,通过salt-key -a添加连接

二.  SaltStack安装

官网:https://www.saltstack.com/

设置官方YUM仓库:

master端设置 :

yum install -y salt-master    #安装master端 

systemctl enable --now salt-master.service  #启动master并设置master自启动

minion  端配置: 

vim /etc/salt/minion master: 192.168.1.21       #设置master主机的ip 

systemctl enable --now salt-minion.service   ##启动minion并设置开机自启动

master端查看连接请求:

salt-key -L

master端执行命令允许minion连接:

salt-key -A  ##添加所有  -a可指定添加

查看结果:

master端测试与minion端的连接:

salt '*' test.ping

三. saltstack远程执行

1. Salt命令由三个主要部分构成:

salt '<target>' <function> [arguments]

target: 指定minion, 默认的规则是使用glob匹配minion id.

# salt '*' test.ping

Targets也可以使用正则表达式:

salt -E 'server1[2-3]' test.ping

Targets也可以指定列表:

salt -L 'server12,server13' test.ping

funcation是module提供的功能,Salt内置了大量有效的functions.

salt '*' cmd.run 'uname -a' 

arguments通过空格来界定参数:

salt 'server13' sys.doc pkg           #查看模块文档 

 

salt内置的执行模块列表:

http://docs.saltstack.cn/ref/modules/all/index.html

2. 编写远程执行模块

编辑master配置文件: 

vim /etc/salt/master 

重启master服务: 

systemctl restart salt-master.service 

创建模块目录: 

mkdir -p /srv/salt/_modules

编写模块文件:

vim /srv/salt/_modules/mydisk.py

同步模块: 

salt server12 saltutil.sync_modules

运行模块: 

salt server12 mydisk.df

 

YAML语法:

规则一: 缩进

Salt需要每个缩进级别由两个空格组成,不要使用tabs。

规则二: 冒号

字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。 my_key: my_value

规则三: 短横杠

想要表示列表项,使用一个短横杠加一个空格。   - list_value_one   - list_value_two
 

配置管理:

创建一个sls文件:

vim /srv/salt/apache.sls 

指定主机执行:

salt server2 state.sls apache

准备Top文件: 

vim /srv/salt/top.sls 

批量执行:

salt '*' state.highstate

   可以看到server12因为刚才安装过了,所以是绿色的,表示状态一致不需要进行,server13是蓝色的,成功安装httpd,这和ansible很相似 

 

Salt 状态系统的核心是SLS,或者叫SaLt State 文件。

SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。

sls文件命名:

  • sls文件以”.sls”后缀结尾,但在调用时是不需要写后缀的。
  • 使用子目录来做组织是个很好的选择。  
  • init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以``apache/init.sls`` 就是表示``apache``. 如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示apache.

四. grains与pillar

1. grains

a) grains简介

Grains是SaltStack的一个组件,存放在SaltStack的minion端。

当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。 由于grains是静态数据,因此不推荐经常去修改它。

应用场景:

  • 信息查询,可用作CMDB。
  • 在target中使用,匹配minion。
  • 在state系统中使用,配置管理模块。 

b) 信息查询:

用于查询minion端的IP、FQDN等信息。

默认可用的grains:

salt '*' grains.ls

查看每一项的值:

salt '*' grains.items          #items表示查看所有  
salt '*' grains.item ipv4      #只查看ip

c) 自定义grains项:

在/etc/salt/minion中定义:

minion(server1):

vim /etc/salt/minion 

重启salt-minion,否则数据不会更新:

查看:

salt server1 grains.item roles

在/etc/salt/grains中定义:

vim /etc/salt/grains

同步数据:

salt server1 saltutil.sync_grains

查询自定义项:

salt server1 grains.item deployment

d) 编写grains模块

在salt-master端创建_grains目录:

mkdir /srv/salt/_grains 
vim /srv/salt/_grains/my_grain.py 
  1 def my_grain():
  2     grains = {}
  3     grains['roles'] = 'nginx'
  4     grains['hello'] = 'world'
  5     return grains

同步grains到minion端:

salt '*' saltutil.sync_grains

e) grains匹配运用 

在target中匹配minion:

salt -G roles:memcache cmd.run hostname 
salt -G roles:nginx cmd.run hostname 

在top文件中匹配:

vim /srv/salt/top.sls 

2. pillar

a) 简介

  • pillar和grains一样也是一个数据系统,但是应用场景不同。
  • pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
  • pillar更加适合在配置管理中运用。

b) 声明pillar

定义pillar基础目录: 

vim /etc/salt/master 

mkdir /srv/pillar 

重启salt-master服务: 

systemctl restart salt-master.service

c)  自定义pillar项

vim /srv/pillar/top.sls

mkdir /srv/pillar/packages
vim /srv/pillar/packages/init.sls

刷新pillar数据:

salt '*' saltutil.refresh_pillar 

查询pillar数据:

salt '*' pillar.items 

d) pillar数据匹配

命令行中匹配:

salt -I 'package:httpd' test.ping
salt -I 'package:mairadb' test.ping

系统中使用pillar数据:

vim /srv/salt/apache.sls

salt server13 state.sls apache

五. Jinja模板

1. Jinja模板简介

Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。 通过jinja模板可以为不同服务器定义各自的变量。
两种分隔符: {% ... %} 和 {{ ... }},前者用于执行诸如 for 循环或赋值的语句,后者把表达式的结果打印到模板上。

2. Jinja模板使用方式

Jinja最基本的用法是使用控制结构包装条件: 

vim /srv/salt/testjinjia.sls

salt '*' state.sls testjinjia

Jinja在普通文件的使用:

复制一份http配置文件到salt目录下:

cp /mnt/httpd.conf /srv/salt/

修改模板文件(引用变量port):

vim /srv/salt/httpd.conf 

vim /srv/salt/apache.sls 

salt '*' state.sls apache

查看结果: 

cat /etc/httpd/conf/httpd.conf | grep '^Listen'

import方式,可在state文件之间共享: 

定义变量文件

vim lib.sls

导入

vim /srv/salt/httpd.conf 

 

salt '*' state.sls apache

 

六. Job管理

1. 简介

  • master在下发指令任务时,会附带上产生的jid。
  • minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行情况。
  • 指令执行完毕将结果传送给master后,删除该临时文件。

2. Job cache

Job缓存默认保存24小时:

vim /etc/salt/master 

master端Job缓存目录:

/var/cache/salt/master/jobs

3. Job持久化(存储到数据库)

 

修改master端配置:

vim /etc/salt/master

重启salt-master服务:

安装数据库以及相关插件:

yum install -y mariadb-server MySQL-python

MySQL-python插件必须安装,否则salt无法与mysql通信

启动数据库:

systemctl start mariadb.service 

安全初始化:

 mysql_secure_installation 

创建sql模板(官网文档上可以找到):

vim salt.sql

导入数据库:
 

mysql -p < salt.sql

数据库授权:

grant all on salt.* to salt@'192.168.1.%' identified by 'salt';

这里是因为master和数据库在同一主机,所以授权本机就可以,如果从minion上传数据库,那也要进行相应的授权

查看数据库:

执行一次远程任务:

查看数据库:

select * from salt_returns;

4. Job管理

查看所有minion当前正在运行的jobs(在所有minions上运行saltutil.running) 

salt-run jobs.active 

列出当前master jobs cache中所有job

salt-run jobs.list_jobs 

从master jobs cache中查询指定jid的运行结果

salt-run jobs.lookup_jid <jid>

七、salt-ssh与salt-syndic

1. salt-ssh

a) 简介

  • salt-ssh可以独立运行的,不需要minion端。
  • salt-ssh 用的是sshpass进行密码交互的。
  • 以串行模式工作,性能下降。 

安装salt-ssh:

yum install -y salt-ssh

b) salt-ssh配置

配置roster(相当于ansible的inventory清单)文件,默认的本地路径是 /etc/salt/roster  

vim /etc/salt/roster

测试:

salt-ssh '*' test.ping -i  ##连接询问加 -i 参数

或者编写配置文件添加以下内容

vim ~/.ssh/config

StrictHostKeyChecking no

salt-ssh是串行的,效率低下,是为了补充salt需要客户端的缺陷,但推荐使用ansible(不需要客户端),ansible相比salt-ssh效率提升很多

2. salt-syndic

a) salt-syndic简介

  • 如果大家知道zabbix proxy的话那就很容易理解了,syndic其实就是个代理,隔离master与minion。
  • Syndic必须要运行在master上,再连接到另一个topmaster上。
  • Topmaster 下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster。
  • topmaster并不知道有多少个minion。
  • syndic与topmaster的file_roots和pillar_roots的目录要保持一致。

b) salt-syndic配置 

topmaster端:

安装salt-master

yum install -y salt-master
vim /etc/salt/master           ##作为顶级master

systemctl start salt-master.service 

# salt-key -L                #查看下级master的连接授权

# salt-key -A 

下级master端 :

安装salt-syndic

yum install -y salt-syndic

vim /etc/salt/master 

指向topmaster

重启服务:

systemctl restart salt-master 
systemctl start salt-syndic

八. salt-api配置 

1. salt-api简介

SaltStack 官方提供有REST API格式的 salt-api 项目,将使Salt与第三方系统集成变得尤为简单。

官方提供了三种api模块:

  • rest_cherrypy
  • rest_tornado
  • rest_wsgi

官方链接:https://docs.saltstack.com/en/latest/ref/netapi/all/index.html#all-netapi-modules 

2. salt-api配置

安装salt-api:

yum install -y salt-api.noarch python-cherrypy.noarch

生成证书:

cd /etc/pki/tls/private 
openssl genrsa 2048 > localhost.key 

cd /etc/pki/tls/certs 
make testcert        //根据提示填写相关信息即可

创建用户认证文件:

useradd -s /sbin/nologin saltapi 
echo westos | passwd --stdin saltapi

vim /etc/salt/master.d/auth.conf

激活rest_cherrypy模块:

vim /etc/salt/master.d/api.conf 

重启服务:

systemctl restart salt-master 
systemctl start salt-api

3. salt-api使用

获取认证token:

curl -sSk https://192.168.1.24:8000/login    \
      -H 'Accept: application/x-yaml' \
      -d username=saltapi \
      -d password=redhat \
      -d eauth=pam

推送任务:

curl -sSk https://192.168.1.24:8000 \
     -H 'Accept: application/x-yaml' \
     -H 'X-Auth-Token: 244c45ae5e3329f085a930eeb2d8ebab479ba469'\
     -d client=local \
     -d tgt='*' \
     -d fun=test.ping

token值是上面命令获取的toekn值。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值