自动化运维之saltstack

一、saltstack介绍

saltstak是做自动化配置的。
saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据,是基于python开发的一套C/S自动化运维工具,通信采用了zeromq消息队列的(pu/sub)这是优势所在,速度会很快,默认监听4505端口,数据传输采用了AES(高级加密)保证安全性,认证采用了SSL方式。Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口
salt的核心功能如下:
使命令发送到远程系统是并行的而不是串行的
使用安全加密的协议
使用最小最快的网络载荷
提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
saltstak和ansible最大的区别是saltstak需要有客户端而ansible没有客户端

二、saltstack的安装与配置

解决一些软件包依赖性时,可以选择开源站点进行下载,例如阿里云使用的salt stack,可以在阿里云官方镜像站中下载
在这里插入图片描述安装软件包
在这里插入图片描述在这里插入图片描述
镜像软件包安装后在/etc/yum.repod.d中生成文件salt-latest.repo,将文件中的路径修改为如下形式;
在这里插入图片描述修改完成后就能够列出相应的软件包
在这里插入图片描述
master端设置:

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

在这里插入图片描述在这里插入图片描述minion端配置:

yum install -y salt-minion	#安装minion端
vim /etc/salt/minion
master: 172.20.10.2		#设置master主机的ip
systemctl enable salt-minion
systemctl start salt-minion

在这里插入图片描述
master端执行命令允许minion连接:
在这里插入图片描述在这里插入图片描述端口测试:
在这里插入图片描述

三、saltstack的远程执行

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

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

target: 指定哪些minion,targets也可以使用正则表达式和列表,举例如下:

在这里插入图片描述简单软件的安装删除
在这里插入图片描述在这里插入图片描述minion端测试
在这里插入图片描述从master端推送来的所有文件都会被保存到minion端的/var/cache/salt中

四、编写远程执行模块

在master端配置文件中的默认值如下:

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

如果继续使用默认值则可以不做修改,当更改了后需要重启master服务
在这里插入图片描述路径/srv/salt将成为整个salt的base路径,所有的定位都从此开始,即整个salt的根目录
编写远程执行模块的步骤如下:
1、创建模块目录:mkdir /srv/salt/_modules
2、编写模块文件: vim /srv/salt/_modules/mydisk.py
3、同步模块:salt server2 saltutil.sync_modules
4、运行模块:salt server2 mydisk.df
在这里插入图片描述
在这里插入图片描述

五、saltstack的配置管理

1、写一个sls文件

安装一个包时:
格式1如下:

vim /srv/salt/apache.sls
httpd:                 	# ID声明,当只安装这一个包时,声明必须为安装包的名称
  pkg:                  	# 状态声明
    - installed           	# 函数声明

格式2如下:

vim /srv/salt/apache.sls
httpd:                 	# ID声明,当只安装这一个包时,声明必须为安装包的名称
  pkg.installed                	# 类似于在命令行的操作,函数加执行动作

在这里插入图片描述安装多个包时,声明可以不为安装包的名称,多个包用pkgs
在这里插入图片描述

2、指定主机执行
salt server2 state.sls apache

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.
在这里插入图片描述

3、TOP文件

TOP文件的主要目的是可以实现对不同的主机进行不同的操作
格式如下:

base:
  'server2':
    - apache  #top文件中此处指定的为一个子目录或者一个.sls文件

  'server3':
    - nginx

批量执行:salt '*' state.highstate
相当于执行了salt server2 state.sls apache以及salt server3 state.sls nginx

六、saltstack中的grains与pillar

1、grains简介

Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新
由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。

2、grains信息查询用法

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

salt '*' grains.ls  #列出所有可以查询的键
salt '*' grains.items #查看每一项的值
salt server3 grains.item ipv4 #取得单项的值
salt server3 grains.item fqdn 
3、自定义grains项

在minion端文件/etc/salt/minion中定义:

grains:
  roles:
    - apache

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

systemctl  restart salt-minion

当在server2和server3中定义了角色之后可以在top文件中使用grains来匹配不同的minion端

base:
  'roles:apache':
    - match: grain
    - apache

  'roles:nginx':
    - match: grain
    - nginx
4、编写grains模块

格式:
1、在salt-master端创建_grains目录:mkdir /srv/salt/_grains
2、编写.py文件自定义grains模块:

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

3、同步grains到minion端:salt '*' saltutil.sync_grains

5、grains的匹配应用

1、在target中匹配minion:

salt -G roles:apache cmd.run hostname  #grains使用-G来进行匹配

2、在TOP文件中匹配minion

base:
  'roles:apache':
    - match: grain
    - apache

  'roles:nginx':
    - match: grain
    - nginx
6、pillar介绍

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

6.1 声明pillar

定义pillar的基础目录:
在文件/etc/salt/master中,默认定义的pillar基础目录为:

pillar_roots:
  base:
    - /srv/pillar

使用默认的设定时需要创建目录:mkdir /srv/pillar,如果更改了基础目录需要重启服务

6.2 自定义pillar项

1、创建top.sls文件:

vim /srv/pillar/top.sls
base:
  '*':
    - packages

2、创建packages.sls文件:

vim /srv/pillar/packages.sls
{% if grains['fqdn'] == 'server3' %}
package: nginx      #此处指的是安装包的名称,以便调用
{% elif grains['fqdn'] == 'server2' %}
package: httpd    
{% endif %}

3、在查新pillar数据的指令:

salt '*' pillar.items
salt -I 'roles:apache' test.ping

时需要刷新pillar数据:salt '*' saltutil.refresh_pillar
4、在state系统中使用pillar时:

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

七、jinja模板的使用

7.1 jinja模板简介

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

7.2 jinja模板用法之----使用控制结构包装条件
vim /srv/salt/test.sls
/mnt/testfile:
  file.append:  #文件追加
    {% if grains['fqdn'] == 'server2' %}  #如果主机名是server2,将字符server2追加到server2端/mnt/testfile中
    - text: server2
    {% elif grains['fqdn'] == 'server3' %}
    - text: server3
    {% endif %}
7.3 jinja模板用法之----在普通文件中使用
vim /srv/salt/apache.sls
/etc/httpd/conf/httpd.conf:
  file.managed:
  - source: salt://httpd.conf
  - template: jinja    #这一句定义一定要有,否则无法在下面定义变量
  - context:
    bind: 172.20.10.2

在配置文件/etc/httpd/conf/httpd.conf中引用定义的变量:

Listen {{ bind }}:80  #代表只监听172.20.10.2主机的80端口
7.3 jinja模板用法之----import导入方式

定义变量文件:

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

导入模板文件:

vim /etc/httpd/conf/httpd.conf
{% from 'lib.sls' import port %} #在配置文件的开头写入
...
Listen {{ prot }}	
7.3 jinja模板用法之----与pillar相结合

在pillar中定义如下:

vim /srv/pillar/packages.sls
{% if grains['fqdn'] == 'server3' %}
package: nginx      #此处指的是安装包的名称,以便调用
{% elif grains['fqdn'] == 'server2' %}
package: httpd  
port: 80  
{% endif %}

在普通文件中定义变量

vim /srv/salt/apache.sls
/etc/httpd/conf/httpd.conf:
  file.managed:
  - source: salt://httpd.conf
  - template: jinja    #这一句定义一定要有,否则无法在下面定义变量
  - context:
    bind: 172.20.10.2

在配置文件/etc/httpd/conf/httpd.conf中引用定义的变量:

Listen {{ bind }}{{ pillar['port']}}  #代表只监听172.20.10.2主机的80端口

八、Job管理

8.1 Job简介

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

vim /etc/salt/master
keep_jobs: 24

master端Job缓存目录:

/var/cache/salt/master/jobs

虽然有job缓存目录,但是数据查询时不方便,没有相应的查询机制,所以需要将数据保存在数据库中以便查询

8.2 把Job存储到数据库

主流的机制:由于saltstack执行时,所有的返回数据都会从minion端返回到master端,所以可以直接在master端连接数据库
在这里插入图片描述修改master端配置:

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

重启salt-master服务:

systemctl restart salt-master

安装mysql数据库:

yum install -y mariadb-server MySQL-python

导入数据模板:

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

--
-- Table structure for table `jids`
--

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;

--
-- Table structure for table `salt_returns`
--

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;

--
-- Table structure for table `salt_events`
--

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;

九、salt-ssh与salt-syndic

9.1 salt-ssh简介与安装

salt-ssh可以独立运行的,不需要minion端。
salt-ssh 用的是sshpass进行密码交互的。
以串行模式工作,性能下降。
安装:yum install -y salt-ssh
salt-ssh需要一个名单系统来确定哪些执行目标,所以需要配置roster文件,默认的本地路径是 /etc/salt/roster:

server2:
  host: 172.20.10.12
  user: root
server3:
  host:172.20.10.13
  user:root
9.2 salt-ssh测试
salt-ssh '*' test.ping

当minion端关闭时,也可以执行相应的操作

9.3 salt-syndic简介

syndic其实就是个代理,隔离master与minion。
Syndic必须要运行在master上,再连接到另一个topmaster上。
Topmaster 下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster。
topmaster并不知道有多少个minion。
syndic与topmaster的file_roots和pillar_roots的目录要保持一致。
在这里插入图片描述

9.4 salt-syndic配置

topmaster端:

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

重启服务:systemctl start salt-master
查看下级master的连接授权salt-key -L

下级master端:

yum install -y salt-syndic
vim /etc/salt/master
syndic_master: 172.25.0.4		#指向topmaster

启动

systemctl restart salt-master
systemctl start salt-syndic
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值