写在前面的话
上一节迷迷糊糊的说了一下配置管理,这一节主要谈谈我们常见的一些操作如何将他转换成配置文件的形式来实现。这样的好处在于,我们可以一次编写到处使用,不用每次再去编写复杂的命令。
配置回顾
在开始之前,我们需要回顾一下使用配置文件的步骤。
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 中我们怎么使用配置文件完成我们常用的操作,其实之前讲的更多的都是本章节的基础。