写在前面的话

上一节迷迷糊糊的说了一下配置管理,这一节主要谈谈我们常见的一些操作如何将他转换成配置文件的形式来实现。这样的好处在于,我们可以一次编写到处使用,不用每次再去编写复杂的命令。

配置回顾

在开始之前,我们需要回顾一下使用配置文件的步骤。

1. 需要在 /etc/salt/master 中开启存放配置文件目录的配置,再重启 master:

file_roots:
base:
- /srv/salt

2. 出于规范化的目的,我们可以创建这样的目录结构:

tree /srv/salt/

结果如图:

简单的谈下这样做的目的,我们再最外层做个 top.sls 配置,再 modules 目录中可以再度就行分层,比如 nginx 之类的配置我们就可以新建一个 nginx 目录,再在下面新建两个目录,一个用于存放配置,一个用于存放需要的安装包等文件。这样我们就可以一目了然。类似如下:

我们需要始终记住一句话,规范化管理,是我们使用 saltstack 的前提,也是我们作为运维区别于开发上服务器瞎几把乱搞的依据。

之所以这样说,是因为我也接手过那种以前没有运维的公司,去了以后登陆上服务器根本没法看,能跑就行,这不是一句玩笑。

执行命令

一切操作都是由简如奢的,所以我们先谈谈如果执行远程命令:

1. 先在 modules 下面新建测试目录和测试配置 /srv/salt/modules/test/cmd-test.sls

cmd-test:
cmd.run:
- unless: test -f /tmp/hello/test.txt
- names:
- mkdir /tmp/hello
- touch /tmp/hello/test.txt
- user: root

我们这里的操作就是,unless 判断远程服务器上面 /tmp/hello/test.txt 文件是否存在,如果不存在,则执行下面的命令。

unless 相反是 onlyif,我们可以这样记忆:onlyif 后面是 True 就执行,unless 后面是 False 就执行。

2. 在 /srv/salt/top.sls 中引用配置:

base:
'saltstack-node-03':
- modules.test.cmd-test

我们可以看到在调用配置的时候就类似 Python 模块调用,使用 . 来区分模块。

此时的目录结构如图:

3. 执行模块:

salt 'saltstack-node-03' state.highstate

结果如图:

当然,我们可以单独的去执行 cmd-test.sls 文件:

salt 'saltstack-node-03' state.sls modules.test.cmd-test

看看再度执行的结果:

因为文件已经存在,所以 cmd 其实是没有再度执行的,通过查看两个输出可以明显发现不一样。

我们可以到客户端查看结果:

执行脚本

在某些时候,其实单纯的写 sls 配置会让过程变得很复杂,比如我们源码安装 nginx,里面会涉及很多命令集合。大多时候对于安装 nginx 其实我们都是有自己的安装脚本。所以我们希望 salt 能够直接将脚本分发到需要执行的服务器并执行他,这样就完美了。

这里我们简单的做个测试,将 master 的脚本到指定的节点执行。

1. 新建相关目录:在 modules 下面建立本次测试的目录 shell-test,然后再该目录下新建 shell 目录存放我们本次测试的脚本,再外层存放本次测试的配置。

2. echo-test.sh 脚本内容如下:

#!/bin/bash

echo '{{ NAME }}' > /tmp/hello/test.txt

我们这里顺便使用一下之前学习的 jinja 模板。

3. shell-test.sls 配置内容如下:

nginx-test:
cmd.script:
- template: jinja
- defaults:
NAME: 'HELLO WORLD'
- source: salt://modules/shell-test/shell/echo-test.sh
- user: root

使用 cmd.script 执行脚本,引入 jinja 模板,传递变量 NAME。通过 source 指定我们的脚本文件。

4. 修改 top.sls 文件:

base:
'saltstack-node-03':
- modules.shell-test.shell-test

执行查看:

文件传输

还是以上面提到的编译安装 nginx 为例,我们在编译安装的时候需要用到 nginx 的源码包,但是我们又不希望每台机器都单独去上传源码包。所以我们就可以使用 master 来给需要执行的机器分发这个安装包。

1. 新建相关目录:

2. file-test.sls 配置内容:

{% set name = 'nginx-1.10.2.tar.gz' %} 
file-test:
file.managed:
- name: /tmp/{{ name }}
- source: salt://modules/file-test/package/{{ name }}
- user: root
- group: root
- mode: 777
cmd.script:
- template: jinja
- defaults:
NGINX_PACKAGE_NAME: {{ name }}
- source: salt://modules/file-test/shell/nginx-unzip.sh
- user: root

我们这里用到一个特别的用法,就是在 sls 配置开始定义变量然后给后面的调用:{% set name = 'nginx-1.10.2.tar.gz' %} 

调用方法就 jinja 模板的调用方法,name 是目的地址,包含文件名,所以我们可以使用这个方法顺便文件重命名。

后面我们执行脚本。并传递 jinja 变量给脚本。在文件传输过程中我们顺便修改了文件的权限。

3. nginx-unzip.sh 脚本内容:

#!/bin/bash

cd /tmp/ && tar -zxf {{ NGINX_PACKAGE_NAME }}

4. top.sls 内容:

base:
'saltstack-node-03':
- modules.file-test.file-test

执行结果:

目录传输

有的时候传输的文件太多,每个都单独传输的话写的麻烦,所以我们希望将他放在一个目录下一起传到需要的节点。这时候就牵扯到传递目录。

1. 此时的目录结构:

file-dir 是我们本次用于测试的目录,下面有两个目录 d1 和 d2,d1 是空目录,d2 下面有文件 t2,外面有文件 t1。

2. dir-test.sls 的内容:

dir-test:
file.recurse:
- name: /tmp/hahaha
- source: salt://modules/dir-test/file-dir
- user: root
- group: root
- file_mode: 777
- dir_mode: 644
- mkdir: True
- clean: True

简单的做个说明,我们可以通过 file_mode dir_mode 单独指定发送后文件个目录的权限。clean 为 True 的目的是第二次执行,如果 master 删除了文件,minion 端也跟着删除。

3. top.sls 文件:

base:
'saltstack-node-03':
- modules.dir-test.dir-test

执行结果:

查看 node3 节点:

我们发现空目录 d1 没有传输,这就是 saltstack 需要注意的,传输目录,空目录不传输。

此时我们删除 master 上面的 t1 文件,再度执行会发现:

有一个明显的删除动作,这就是我们配置 clean 的作用,此时查看 node3 就发现被删除了。

定时任务

有的时候我们需要给一批机器添加类似这样的定时任务,删除某个目录下多少天之前的日志文件,如果我们一台一台的去配置,服务器少还好,多了会挂掉。所以这里引入了在 saltstack 中如何添加定时任务,当然使用 cmd.run 也是可以的,但我们总的专业点嘛。

1. 查看目录结构:

2. cron-test.sls 内容:

cron-test:
cron.present:
- name: echo "`date`" >> /tmp/1.txt
- user: root
- minute: '*/1'
- hour: '*'
- daymonth: '*'
- month: '*'
- dayweek: '*'

我们这里设置的每分钟执行一次。

3. top.sls 的内容:

base:
'saltstack-node-03':
- modules.cron-test.cron-test

查看结果:

此时去 node3 上面查看定时任务:

可以看到  salt 帮我们加了这样的定时任务。

以上就是一些我们常用的操作,完全已经足够我们日常使用了。

命令形式

某些时候可能我们执行的只是一个简单的功能,如果此时我们再去通过写 sls 文件可能就显得麻烦了,所以我们可以直接命令的方式执行。

1. 拷贝文件到客户端:

salt '*03' cp.get_file salt://top.sls /tmp/1.sls

注意,源文件必须是 salt:// 地址。

2. 直接拷贝目录到客户端:

salt '*03' cp.get_dir salt://modules/test /tmp/hehe

3. 查看存活的客户端:

salt-run manage.up

4. 执行远程脚本:

salt '*03' cmd.script salt://modules/shell-test/shell/echo-test.sh

小结

本节专门集中的谈了 salt 中我们怎么使用配置文件完成我们常用的操作,其实之前讲的更多的都是本章节的基础。

【05】Saltstack:配置详解的更多相关文章

  1. 【转】logback logback.xml常用配置详解(二)<appender>

    原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...

  2. 【转】logback logback.xml常用配置详解(一)<configuration> and <logger>

    原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...

  3. logback常用配置详解及logback简介

    logback 简介(一) Ceki Gülcü在Java日志领域世界知名.他创造了Log4J ,这个最早的Java日志框架即便在JRE内置日志功能的竞争下仍然非常流行.随后他又着手实现SLF4J 这 ...

  4. Apache的配置详解 带图

    对Apache 的 Http.conf 各项配置详解 1.01 ServerRoot 配置 [ServerRoot "" 主要用于指定 Apache 的安装路径,此选项参数值在安装 ...

  5. RIP配置详解

    RIP配置详解 一.RIP协议概述 1.RIP是Routing Information Protocol(路由信息协议)的简称: 2.RIP是一种基于距离矢量(Distance-Vector)算法的路 ...

  6. logback logback.xml常用配置详解(一)<configuration> and <logger>

    logback logback.xml常用配置详解(一)<configuration> and <logger> 博客分类: Log java loglogback  原创文章 ...

  7. Spark log4j日志配置详解(转载)

    一.spark job日志介绍    spark中提供了log4j的方式记录日志.可以在$SPARK_HOME/conf/下,将 log4j.properties.template 文件copy为 l ...

  8. log4j.properties配置详解与实例

    log4j.properties配置详解与实例 第一步:加入log4j-1.x.x.jar到lib下. 第二步:在工程的src下下建立log4j.properties.内容如下: #OFF,syste ...

  9. Flume NG 配置详解(转)

    原文链接:[转]Flume NG 配置详解 (说明,名词对应解释 源-Source,接收器-Sink,通道-Channel) 配置 设置代理 Flume代理配置存储在本地配置文件.这是一个文本文件格式 ...

  10. php-fpm配置详解

    php-fpm详解 原文链接:http://php-fpm.anight.org/wiki:http://www.php-fpm.com/翻译:http://syre.blogbus.com/logs ...

随机推荐

  1. python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)

    插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进.后退.左转.右转,乌龟的尾巴朝下,它移动时就会画一条线.并且为了增加乌龟 ...

  2. Android Studio 3.5+ 使用androidx的recyclerView

    一 File->project structure->Dependencies: 点击All Dependencies处的加号,选择Library Dependency: 在step1处输 ...

  3. 团队展示&选题 (白衣天使队)

    作业详见此地址:    https://www.cnblogs.com/bbplus/p/11735449.html

  4. 5.InfluxDB-InfluxQL基础语法教程--WHERE子句

    本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/) WHERE子句 语法 ...

  5. 3.UML中的类图及类图之间的关系

    统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...

  6. 一条SELECT查询语句在数据库里执行时都经历了什么

    每天都在跟 mysql 打交道,你知道执行一条简单的 select 语句,都经历了哪些过程吗? 首先,mysql 主要是由 server 层和存储层两部分构成的.server 层主要包括连接器.查询缓 ...

  7. day02 整理

    目录 编程语言的分类 机器语言 汇编语言 高级语言 编译型语言(谷歌翻译) 解释型语言(同声传译) 执行python程序的两种方式 Jupyter的使用 jupyter的介绍 安装 基本使用 Jupy ...

  8. odoo10学习笔记十七:controller

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189391.html 一:controller简述 odoo里面的controller相似于springM ...

  9. jmeter压测学习9-响应断言

    前言 使用jmeter做接口压测的时候,如何能保证接口的每次返回结果都是我们预期的呢?这就需要添加检查点,也就是添加断言. 添加断言就是为了检查返回的结果与我们的预期是一致的,不用去一个个检查结果. ...

  10. 代码审计-extract变量覆盖

    <?php $flag='xxx'; extract($_GET); if(isset($shiyan)) { $content=trim(file_get_contents($flag)); ...