写在前面的话

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

配置回顾

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

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. InnoDB Multi-Versioning

    InnoDB 是一个数据多版本的存储引擎,它会保持它修改的数据的旧版本数据以此来支持事务特性,比如并发操作和事务的回滚.这些旧版本数据存储在一个叫做rollback segment的数据结构中(回滚段 ...

  2. python3调用R语言干货

    R语言知识:https://www.w3cschool.cn/r/r_lists.html 1. 安装库rpy2 1. 下载与本地对应python版本模块,pip install rpy2是安装不上的 ...

  3. va_list 、va_start、 va_arg、 va_end 使用说明【转】

    转自:https://blog.csdn.net/f110300641/article/details/83822290 在ANSI C中,这些宏的定义位于stdarg.h中: typedef cha ...

  4. CSS的四种基本选择器和四种高级选择器

    做个快乐的搬运工:https://blog.csdn.net/DYD850804/article/details/80997251

  5. pytest文档29-allure-pytest(最新最全,保证能搞成功!)

    前言 之前写了个pytest的allure相关的教程,只是停留在环境搭建完成,后续一直没用,小编一直不喜欢这种花里胡哨的报告. 没办法,领导就喜欢这种,小伙伴们也喜欢,所以还是得把allure用起来, ...

  6. 初识v4l2(五)-------v4l2_ioctl浅析

    上一篇文章中,已经介绍了v4l2_open.v4l2_read.v4l2_write的调用过程,相对于v4l2_ioctl,它们是比较简单的.下面来分析v4l2_ioctl.注意在这里还是分析以viv ...

  7. 201871010132--张潇潇--《面向对象程序设计(Java)》第十一周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  8. pikachu的xss及csrf

    一.XSS 可解析的js 未经过滤 XSS见框就插     script 大小写  中间插入 <img src="" onerror="alert(11111)&q ...

  9. day21_7.25 面向对象之继承

    一.继承 什么是继承? 继承是一种关系,就是描述两者之间什么是什么的关系. 在程序中,继承描述的是类与类之间的关系. 例如a如果继承了b,a就具备了b的所有变量与方法,可以直接调用. class B: ...

  10. 安装_升级Eclipse插件

    在线安装_升级Eclipse插件可以保证插件的完整性,并可自由选择最新版本.1.单击Eclipse的Help菜单,选择"Install New Software"菜单项2.单击&q ...