saltstack ——分布式远程执行系统

一、saltstack的简介

SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建,默认监听4505端口。saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。。

saltstack是运维人员提高工作效率、规范业务配置与操作的利器。

二、saltstack的安装部署

server11安装salt-master
server12、server13安装salt-minion

在minion端编辑/etc/salt/minion
master: 172.25.11.11
在这里插入图片描述
并永久开启salt-minion此服务

在master端:

salt-key -L查看连接授权
salt-key -A允许所有key值

在salt-key -L会显示server12、server13
在这里插入图片描述安装lsof可以查看minion是否连接成功
yum install lsof -y
lsof -i :4505
在这里插入图片描述
master端测试与minion端的连接:
salt ’ * ’ test.ping
salt ’ * ’ cmd.run "ip addr"测试用salt
在这里插入图片描述
ps ax只显示进程不显示名称
在这里插入图片描述
yum install python-setproctitle.x86_64 -y
systemctl restart salt-master.service
在执行ps ax会显示名称
在这里插入图片描述

三、saltstack远程执行命令

远程执行shell命令

salt ‘server12’ sys.doc pkg查看模块文档
salt server12 pkg.info_installed lftp安装服务
salt server12 service.stop httpd关闭服务

在这里插入图片描述
server12 --> targets
Targets也可以使用正则表达式:
salt -E ‘server[1-3]’ test.ping
Targets也可以指定列表:
salt -L ‘server2,server3’ test.ping

编写远程执行模块

1.创建模块目录:
(/srv/salt为默认数据目录,根目录,所有saltstack文件都是基于此目录的,没有要创建)
mkdir /srv/salt/_modules

2.编写模块文件:(python语句)
def df():
return __ salt __[‘cmd.run’](‘df -h’)

3.同步模块:
salt server12 saltutil.sync_modules

运行测试:
salt server12 mydisk.df
在这里插入图片描述

YAML语法用法&SaLt State 文件

YAML语法:

规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs
规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。

  • list_value_one
  • list_value_two

SaLt State 文件:
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.

配置管理

创建一个sls文件:
vim /srv/salt/apache/install.sls
实现远程安装httpd
在这里插入图片描述

指定主机执行:
salt server12 state.sls apache.install
apache.install:表示为默认目录/srv/salt 下的apache下的install.sls文件(sls一般不写)
在这里插入图片描述
在这里插入图片描述

apache:
  pkg.installed:
    - pkgs:
        - httpd:
        - php:
        - lftp
  file.managed:
    - source: salt://apache/files/httpd.conf 源文件地址
    - name:  /etc/httpd/conf/httpd.conf 同步的目标文件地址
  service.running:
    - name: httpd
    - enable: true
    - reload: true  若监控到文件发生变化时,触发reload服务,若没加此项,则默认重启服务
    - watch:
        - file: apache  监控apache状态下的file


运行测试:
在这里插入图片描述
文件的更新改变是通过比较两文件的md5校验码来决定的
当检测到源文件与目标文件的md5校验码不同时,此时就会修改使目标文件改称与源文件相同,这样md5校验码也就相同了。

Top文件:

实现在不同的节点部署不同的动作

编辑 /srv/salt/top.sls

base:
  '*':
    - apache

批量执行:(高级状态)
salt '*' state.highstate

四、Jinja模板

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

jinja模板使用方式:

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

/mnt/file:
  file.append:
    {% if grains['fqdn'] == 'server12' %}
    - text: server12
    {% elif grains['fqdn'] == 'server13' %}
    - text: server13
    {% endif %}

运行测试:salt ‘*’ state.sls test
在这里插入图片描述
引用变量:
直接引用grains变量:
Listen {{ grains[‘ipv4’][1] }}
直接引用pillar变量:
Listen {{ pillar[‘ip’] }}

Jinja在文件的使用:
编辑 /srv/salt/httpd.sls

/etc/httpd/conf/httpd.conf:
  file.managed:
  - source: salt://httpd.conf
  - template: jinja
  - context:
    bind: {{ grains['ipv4'][-1] }}
    PORT: {{ pillar['port'] }}

在源文件/srv/salt/httpd.conf中引用它定义的变量
在这里插入图片描述
运行测试: salt server12 state.sls httpd
server12httpd配置文件的值就是刚定义的
只开启此网卡的80端口,访问本地将被拒绝
在这里插入图片描述
import方式,可在state文件之间共享:
定义变量文件:
vim lib.sls
{% set port = 80 %}
导入模板文件:
vim httpd.conf
{% from ‘lib.sls’ import port %}

Listen {{ prot }}

五、grains与pillar详解

都是用来编写数据系统的,grains是静态的,pillar是动态的

grains

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

应用场景信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。
信息查询用于查询minion端的IP、FQDN等信息。

官方网页:
http://docs.saltstack.cn/topics/grains/index.html

默认可用的grains:

查看所有grains模块salt ‘*’ grains.ls
查看每一项的值salt ‘*’ grains.items
取单项的值salt server13 grains.item fqdn
自定义grains项的不同种方法:

法一:
minion端
编辑配置文件/etc/salt/minion文件

grains:
  roles:
    - apache

重启salt-minion,否则数据不会更新:
systemctl restart salt-minion
在这里插入图片描述

法二:
minion端
/etc/salt/grains

roles:
  - nginx

在master端同步数据:
因为是静态的所以要手动刷新同步
salt server13 saltutil.sync_grains

查询自定义项:
salt server13 grains.item roles
在这里插入图片描述

法三:
master端
/srv/salt/_grains下编写模块
vim mygrains.py

def my_grain():
        grains = {}
        grains['salt'] = 'stack'
        grains['hello'] = 'world'
        return grains

同步模块:salt ‘*’ saltutil.sync_grains
在minion端/var/cache/salt下能看到同步过来的mygrain.py模块
在这里插入图片描述
运行测试:
在这里插入图片描述

grains匹配运用:

在target中匹配minion:
salt -G roles:apache cmd.run hostname
在这里插入图片描述
在top文件中匹配:
/srv/salt/top.sls
base:
‘roles:apache’:
- match: grain
- apache
‘roles:nginx’:
- match: grain
- nginx
其中roles:apache匹配的是server12;roles:apache匹配的是server13

示例:

在匹配到的主机里分别部署作不同的动作,在server12里部署apache,server13里部署nginx,top.sls如上边所示。

在apache下编写引导文件init.sls

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql
  file.managed:
    - source: salt://apache/files/httpd.conf
    - name: /etc/httpd/conf/httpd.conf
  service.running:
    - name: httpd
    - enable: true
    - watch:
      - file: apache

在nginx下编写install.sls
安装方面:

nginx-install:
  pkg.installed:
    - pkgs:
      - gcc
      - pcre-devel
      - openssl-devel
  file.managed:
    - source: salt://nginx/files/nginx-1.18.0.tar.gz
    - name: /mnt/nginx-1.18.0.tar.gz
  cmd.run:
    - name: cd /mnt && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
    - creates: /usr/local/nginx

配置方面:

编写int.sls
include:
  - nginx.install
/usr/local/nginx/conf/nginx.conf:
  file.managed:
    - source: salt://nginx/files/nginx.conf

nginx-service:
  user.present:
    - name: nginx
    - shell: /sbin/nologin
    - home: /usr/local/nginx
    - createhome: false
  file.managed:
    - source: salt://nginx/files/nginx.service
    - name: /usr/lib/systemd/system/nginx.service
  service.running:
    - name: nginx
    - enable: true
    - reload: true
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf

运行测试:
salt ‘*’ state.highstate
在这里插入图片描述
在这里插入图片描述

在不同的minion端检测,可见所需已达到
在这里插入图片描述

Pillar

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

声明pillar 基础目录在/srv/pillar,没有需要新建

在/srv/pillar编辑package.sls

{%if grains['fqdn'] == 'server13' %}
package: nginx
{% elif grains['fqdn'] == 'server12' %}
package: httpd
{% endif %}

并编写top.sls文件,让匹配到的主机都做package.sls里的动作

base:
  '*':
    - package

salt '*' pillar.items
在这里插入图片描述

salt '*' pillar.item  package
salt -I package:nginx test.ping --> server13
salt -I package:httpd test.ping --> server12

单独看以及匹配是看不到的
需要刷新一下
salt '*' saltutil.refresh_pillar
在这里插入图片描述
引用变量:

法一:在文件里定义

在/srv/pillar编辑package.sls

{%if grains['fqdn'] == 'server13' %} 
package: nginx
{% elif grains['fqdn'] == 'server12' %}
port: 8080
bind: 172.25.11.12
{% endif %}

在/srv/salt/apache/init.sls中引用在pillar中定义的变量

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql
  file.managed:
    - source: salt://apache/files/httpd.conf
    - name: /etc/httpd/conf/httpd.conf
    - template: jinja
    - context:
      PORT: {{ pillar['port'] }}
      BIND: {{ pillar['bind'] }}
  service.running:
    - name: httpd
    - enable: true
    - watch:
      - file: apache

在原模板salt://apache/files/httpd.conf里引用jinja模板定义的变量:
在这里插入图片描述

运行测试:salt server12 state.sls apache
server12端:
在这里插入图片描述
法二:导入lib.sls
此处引用的是init.sls里的变量名称,init.sls又引用了pillar定义的变量
用lib.sls定义变量。此种方式优先级更高一些
{% set PORT = 80 %}

原模板httpd.conf里第一行加上导入port变量从lib.sls里面
在这里插入图片描述
运行测试:
会发现匹配到的主机他的httpd端口为80,是引用的lib.sls里的,说明它优先级更高。
在这里插入图片描述
在这里插入图片描述

六、salt-syndic配置

大型企业管理多台机器时,操作者会使用一个topmaster来掌控底下的master,之间的信息传递由syndic(秘书的作用)完成,从而简接管控其下的minion端。

配置个server14:
topmaster:
先配好salt源,安装salt-master
编辑/etc/salt/master
order_masters: True
在这里插入图片描述
master端:
安装yum install salt-syndic.noarch -y
syndic_master: 172.25.11.14
指定syndic的master端为server14(topmaster)
在这里插入图片描述

systemctl restart salt-master.service 
systemctl enable --now salt-syndic.service 

topmaster端:
salt-key -L 查看下级master的连接授权
salt-key -A 授权允许
salt ‘*’ cmd.run hostname
在这里插入图片描述
出现的是两个minion主机名

  • GET
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值