写在前面的话

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

配置回顾

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

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. 7 CentOS 7网卡配置

    首先重中之重:修改前一定要进行系统备份,如果是虚拟机进行快照 查看虚拟机的网卡配置 注意桥接模式和NAT模式     桥接模式:网络层面,虚拟机和PC处于同级地位,虚拟机直接和路由器相连     NA ...

  2. updataStateByKey算子的使用

    updataStateByKeyApp.scala import org.apache.spark.SparkConf import org.apache.spark.streaming.{Secon ...

  3. day24_7.30 反射与元类

    一.反射 在python中,反射通常是指一个对象应该具备,可以检测修复,增加自身属性的能力. 而反射可以通过字符串对其进行操作. 其中涉及了4个函数,是四个普通 的函数: hasattr(oop,st ...

  4. 【JavaWeb】SpringBoot架构

    0.文件夹结构 1.接口统一返回值 2.全局异常处理 3.数据库访问配置[OK] 4.前端模版页[OK] 5.Swagger接口[OK] 6.公共插件[OK] ---lombok ---google ...

  5. Netty之ChannelHandler(三)

    ChannelHandler是netty中的核心处理部分,我们使用netty的绝大部分代码都写在这部分,所以了解它的一些机制和特性是很有必要的. 一.Channel Channel接口抽象了底层soc ...

  6. Linux for Matlab中文注释乱码(亲测有效)

    中文注释乱码的原因是windows下的m文件采用的是gb2312编码,只要将所有的m文件转成 utf8文件,显示就正常了. 1.首先安装enca:sudo apt-get install enca 2 ...

  7. streamsets 官方默认镜像中文支持问题

    以前在测试streamsets 的时候就发现中文乱码,后边也每太注意,以为支持问题,今天跑了下单元 测试代码,以及使用本机运行,发现都没有问题,然后运行以前的配置,使用jjs 发现模式的编码为 ANS ...

  8. [LeetCode] 7. Reverse Integer 翻转整数

    Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Examp ...

  9. mission3--dp

    A---母牛的故事 题目大意:第一年有一头母牛,每年年初母牛生小母牛,小母牛第四个年头可以开始生小牛. 问第n年有多少头牛. 题解: (1)列出前几项来找规律(2)第i年牛的数量=第i-1年牛的数量+ ...

  10. MySQL实战45讲学习笔记:第十讲

    一 .本节内容概要 前面我们介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的.但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引.也就是说,使用哪个索引是由MySQL ...