Linux企业运维——Saltstack

本文详细介绍了Linux企业环境中常用的自动化运维工具Saltstack,包括其核心功能、通信机制、安装配置过程,以及远程执行、grains和pillar的深入解析。此外,还探讨了Jinja模板的应用、Job管理、salt-ssh与salt-syndic的使用,以及salt-api的配置和使用,旨在帮助读者全面掌握Saltstack的实战技巧。
摘要由CSDN通过智能技术生成

一、什么是Saltstack?

1.Saltstack简介

saltstack是一个新的基础平台管理工具,只需要花费数分钟即可运行起来,可以支撑管理上万台服务器的规模,数秒钟即可完成数据传递。对于不同的业务进行集中管理,分发文件,采集数据,软件包管理等; saltstack是使用python语言开发的,同时也支持restAPI方便二次开发以及和它平台集成,同时官方也发布了一个Web管理界面halite

2.Salt的核心功能

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

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

在这里插入图片描述

二、saltstack通信机制

SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队
列通信,默认监听4505端口。
在这里插入图片描述Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听
4506端口
在这里插入图片描述

三、saltstack安装与配置

这里我们使用三台主机
server1作为master安装salt-master.noarch
server2、server3作为slave安装salt-minion.noarch

1.配置镜像源

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

• 设置官方YUM仓库: yum install https://repo.saltstack.com/yum/redhat/salt-repo-
latest.el7.noarch.rpm

salt.repo官方仓库源码

\\\
[salt-latest-repo]
name=salt
baseurl=http://repo.saltproject.io/py3/redhat/7/x86_64/latest
skip_if_unavailable=True
failovermethod=priority
enabled=1
enabled_metadata=1
gpgcheck=0
gpgkey=https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub,https://repo.saltproject.io/py3/redhat/7/x86_64/latest/base/RPMGPG-KEY-CentOS-7
\\\

CentOS-Base.repo源码

配置AliyunCentOS镜像用于解决saltstack依赖性

\\\
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#
 
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#enabled=0 
#released updates 
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#enabled=0 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#enabled=0 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
\\\

2.安装salt

在master端设置:

yum install -y salt-master.noarch  #安装master端
systemctl enable salt-master   #设置master自启动
systemctl start salt-master    #启动master服务

在minion端配置:
配置salt文件设定控制服务器并重启

yum install salt-minion.noarch -y     #安装minion端

vim /etc/salt/minion
\\\
master: 172.25.7.1     #设置master主机的ip为控制服务器
\\\

systemctl enable salt-minion    #设置开机启动
systemctl start salt-minion.service  #启动minion服务 

在这里插入图片描述
添加key,master端执行命令允许minion连接:

salt-key -L     #-L查看key
salt-key -A     #-A添加key
salt-key -L

在这里插入图片描述

master端测试与minion端的连接:

salt '*' test.ping

在这里插入图片描述

四、saltstack远程执行

远程执行shell命令

Salt命令由三个主要部分构成:
salt ‘’ [arguments]

Target:
///
target: 指定哪些minion, 默认的规则是使用glob匹配minion id
#salt '*' test.ping
Targets也可以使用正则表达式:
#salt -E 'server[1-3]' test.ping
Targets也可以指定列表:
#salt -L 'server2,server3' test.ping
funcation:
///
funcation是module提供的功能,Salt内置了大量有效的functions.
#salt '*' cmd.run 'uname -a'
arguments:
///
arguments通过空格来界定参数:
#salt 'server2' sys.doc pkg  #查看模块文档
#salt 'server2' pkg.install httpd
#salt 'server2' pkg.remove httpd

salt内置的执行模块列表可以在官方文档查看
• http://docs.saltstack.cn/ref/modules/all/index.html

在这里插入图片描述

编写远程执行模块

编辑master配置文件:

vim /etc/salt/master
///
file_roots:
base:
- /srv/salt
///

systemctl restart salt-master   #重启master服务

编写模块文件:

mkdir /srv/salt/_modules   #创建模块目录

vim /srv/salt/_modules/mydisk.py   #编写模块文件
///
def df():
return __salt__['cmd.run']('df -h')
///

同步模块:
salt server2 saltutil.sync_modules
运行模块:
salt server2 mydisk.df

在这里插入图片描述
在这里插入图片描述

配置管理

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

• sls文件命名:
sls文件以”.sls”后缀结尾
注意: 在调用时不用写.sls后缀

使用子目录来做组织是个很好的选择
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls
就是表示apache.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将
被用来表示 apache

五、grains详解

grains简介

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

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

信息查询

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

默认可用的grains:
salt ‘’ grains.ls
在这里插入图片描述查看每一项的值:
salt '
’ grains.items
在这里插入图片描述

取单项的值:
salt server2 grains.item ipv4

在这里插入图片描述

自定义grains项

1.在/etc/salt/minion中自定义grains项:

vim /etc/salt/minion
///
grains:
roles:
- apache
///

在这里插入图片描述
更改完数据需要注意必须重启salt-minion,否则数据不会更新
systemctl restart salt-minion

2.在/etc/salt/grains中自定义grains项:

vim /etc/salt/grains:
///
deployment: datacenter1
///
salt server3 saltutil.sync_grains    #同步数据

salt server3 grains.item deployment    #查询自定义项

编写grains模块

在salt-master端创建_grains目录,编写模块,并同步到minion端

mkdir /srv/salt/_grains

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

salt '*' saltutil.sync_grains      #同步grains到minion端

在这里插入图片描述

在这里插入图片描述

这里编写时可以去官网查找模板例子
在这里插入图片描述

grains匹配运用

在target中匹配minion:
salt -G roles:apache cmd.run hostname

在top文件中匹配:
vim /srv/salt/top.sls
///
base:
'roles:apache':
- match: grain
- apache.install
///

在这里插入图片描述

六、pillar详解

pillar简介

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

声明pillar

定义pillar基础目录,并重启salt-master服务

vim /etc/salt/master
///
pillar_roots:
base:
- /srv/pillar
///

mkdir /srv/pillar    #建立目录
/etc/init.d/salt-master restart  #重启salt-master服务

自定义pillar项

vim /srv/pillar/top.sls
///
base:
'*':
- packages
///
vim /srv/pillar/packages.sls
///
{% if grains['fqdn'] == 'server3' %}
package: httpd
{% elif grains['fqdn'] == 'server2' %}
package: mairadb
{% endif %}
///

刷新pillar数据:
salt ‘*’ saltutil.refresh_pillar

查询pillar数据:
salt ‘’ pillar.items
salt '
’ pillar.item roles

pillar数据匹配

1.命令行中匹配:
salt -I ‘roles:apache’ test.ping

2.state系统中使用:

vim /srv/salt/apache.sls
///
apache:
pkg.installed:
- name: {{ pillar['package'] }}
///

七、Jinja模板

Jinja模板简介

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

Jinja模板使用方式

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

vim /srv/salt/test.sls
///
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server3' %}
package: nginx
{% elif grains['fqdn'] == 'server2' %}
package: apache
{% endif %}
///

在这里插入图片描述

2.Jinja在普通文件的使用:

vim /srv/salt/apache.sls
///
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd.conf
- template: jinja
- context:
bind: 172.25.0.2
///

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

• 定义变量文件:

vim lib.sls
{% set port = 80 %}

• 导入模板文件:

vim httpd.conf
{% from 'lib.sls' import port %}
...
Listen {{ prot }}

4.引用变量

• 直接引用grains变量:
• Listen {{ grains[‘ipv4’][1] }}
• 直接引用pillar变量:
• Listen {{ pillar[‘ip’] }}

• 在state文件中引用:

- template: jinja
- context:
bind: {{ pillar['ip'] }}

八、Job管理

Job简介

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

Job cache

Job缓存默认保存24小时:
vim /etc/salt/master
///
master_job_cache: master
///
在这里插入图片描述

master端Job缓存目录:
• /var/cache/salt/master/jobs

在这里插入图片描述

把Job存储到数据库

在这里插入图片描述

修改master端配置:

vim /etc/salt/master
///
return: mysql
mysql.host: 'localhost'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
///

systemctl restart salt-master   #重启salt-master服务

在这里插入图片描述

安装mysql数据库,初始化脚本,导入数据模板并授权

yum install -y mariadb-server MySQL-python
mysql_secure_installation   #执行数据库初始化脚本
mysql -p < salt.sql   #导入数据模板
grant all on salt.* to salt@localhost identified by 'salt';  #创建数据库授权

salt.sql模板源码:

/////
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;
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;
///////

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

九、salt-ssh与salt-syndic

salt-ssh简介

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

salt-ssh安装与配置

yum install -y salt-ssh   #安装salt-ssh
#配置roster文件,默认的本地路径是 /etc/salt/roster
server2:
host: 172.25.0.2
user: root

测试:
salt-ssh ‘*’ test.ping -i //询问密码加 -i
vim ~/.ssh/config
StrictHostKeyChecking no

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的目录要保持一致。

在这里插入图片描述

salt-syndic配置

topmaster端: 设置为server4
下级master端: 设置为server1

vim /etc/salt/master
syndic_master: 172.25.0.4        #指向topmaster

将server1上的仓库源传给server4,便于下载
yum install -y salt-syndic
在这里插入图片描述在这里插入图片描述

vim /etc/salt/master
order_masters: True   #作为顶级master
systemctl start salt-master

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

在这里插入图片描述
systemctl restart salt-master
systemctl start salt-syndic
顶级master只知道有一个下级master,但是可以直接同各国* 对所有slave操作
在这里插入图片描述
在这里插入图片描述

十、salt-api配置

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

salt-api配置

安装salt-api,生成证书

yum install -y salt-api python-cherrypy
cd /etc/pki/tls/private
openssl genrsa 2048 > localhost.key
cd /etc/pki/tls/certs
make testcert     //根据提示填写相关信息即可

salt-api配置

创建用户认证文件:

 useradd -s /sbin/nologin saltapi
 echo westos | passwd --stdin saltapi
 vim /etc/salt/master.d/eauth.conf
 ///
 external_auth:
pam:
saltapi:
- .*
- '@wheel'
- '@runner'
///

激活rest_cherrypy模块,重启服务

vim /etc/salt/master.d/api.conf
///
rest_cherrypy:
host: 172.25.0.1
port: 8000
ssl_crt: /etc/pki/tls/certs/localhost.crt
ssl_key: /etc/pki/tls/private/localhost.key
///

systemctl restart salt-master
systemctl start salt-api

salt-api使用

获取认证token:

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

推送任务:

curl -sSk https://172.25.0.1:8000 \
-H 'Accept: application/x-yaml' \
-H 'X-Auth-Token: 77e2b1de04b0dbc0a4bf11900712b83e4fa2c241'\   
-d client=local \
-d tgt='*' \
-d fun=test.ping       
##token值是上面命令获取的toekn值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值