CentOS 7下SaltStack安装配置详解

前端之家收集整理的这篇文章主要介绍了CentOS 7下SaltStack安装配置详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

复制https://www.linuxidc.com/Linux/2017-10/147566.htm

介绍篇:https://mp.weixin.qq.com/s/b2fyDGMMfbr-TNeik6YPhg

简述

saltstack

  • saltstack是一个新的基础平台管理工具,只需要花费数分钟即可运行起来,可以支撑管理上万台服务器的规模,数秒钟即可完成数据传递。
  • saltstack是使用python语言开发的,同时也支持restAPI方便二次开发以及和它平台集成,同时官方也发布了一个Web管理界面halite。

优点:

  • 首先,他速度快,基于消息队列+线程,跑完多台设备,都是毫秒级别的
  • 其次,非常灵活,源码是python,方便理解和自定义模块(python 语言相对于其他的perl、ruby等还是很好理解的)
  • 命令简单,功能强大

saltstack运行方式

  • Local
  • Master/Minion
  • Salt SSH

本文使用Master/Minion运行方式。

saltstack三大功能

  • 远程执行
  • 配置管理
  • 云管理

saltstack数据系统

  • Grains (静态数据)
  • pillar (动态数据)

saltstack配置管理

  • SLS(YAML、Jinja)
  • Highstate
  • States Module

实现环境

准备三台机器,这三台机器都关闭 selinux,清空防火墙规则。

  • saltstack ==> 172.16.0.19 (服务端)
  • client1 ==> 172.16.0.20 (客户端)
  • client2 ==> 172.16.0.21 (客户端)

查看版本和内核

  1. [root@saltstack ~]# cat /etc/RedHat-release
  2. CentOS Linux release 7.3.1611 (Core)
  3. [root@saltstack ~]# uname -rm
  4. 3.10.0-514.6.1.el7.x86_64 x86_64

分别设置 hostname,设置完毕xshell注销重新连接一下

  1. [root@saltstack ~]# hostnamectl set-hostname saltstack
  2. [root@client1 ~]# hostnamectl set-hostname client1
  3. [root@client2 ~]# hostnamectl set-hostname client2

编辑 hosts 文件
每台都设置,若机器太多,可以通过搭建 DNS,则不用在每台机器上设置这个

  1. [root@saltstack ~]# vi /etc/hosts
  2. 添加下面内容
  3. 172.16.0.19 saltstack
  4. 172.16.0.20 client1
  5. 172.16.0.21 client2
开始安装

分别为三台机器添加阿里云epel源

  1. [root@saltstack ~]# mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
  2. [root@saltstack ~]# mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
  3. [root@saltstack ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

服务端安装

  1. [root@saltstack ~]# yum -y install salt-master salt-minion

客户端安装

  1. [root@client1 ~]# yum -y install salt-minion

[root@client2 ~]# yum -y install salt-minion

配置master

服务端和客户端都要配置

  1. [root@saltstack ~]# vi /etc/salt/minion +16
  2. 以下两种方式都可以,选择其中一种即可
  3. # master改为服务端的主机名
  4. master: saltstack
  5. # master改为服务端的IP
  6. master: 172.16.0.19

分别修改三台机器minion文件中的的id为自己的主机名

  1. [root@client1 ~]# vi /etc/salt/minion +78
  2. id: client1
  3. [root@client2 ~]# vi /etc/salt/minion +78
  4. id: client2

启动saltstack服务
服务端

  1. [root@saltstack ~]# systemctl enable salt-master
  2. [root@saltstack ~]# systemctl enable salt-minion
  3. [root@saltstack ~]# systemctl start salt-master
  4. [root@saltstack ~]# systemctl start salt-minion

客户端

  1. [root@client1 ~]# systemctl enable salt-minion
  2. [root@client1 ~]# systemctl start salt-minion
配置认证

服务端操作

  1. [root@saltstack ~]# salt-key -a client1
  2. The following keys are going to be accepted:
  3. Unaccepted Keys:
  4. client1
  5. Proceed? [n/Y] y
  6. Key for minion client1 accepted.
  7.  
  8. [root@saltstack ~]# salt-key -a client2
  9. The following keys are going to be accepted:
  10. Unaccepted Keys:
  11. client2
  12. Proceed? [n/Y] y
  13. Key for minion client2 accepted.
  14. [root@saltstack ~]# salt-key -a saltstack
  15. The following keys are going to be accepted:
  16. Unaccepted Keys:
  17. saltstack
  18. Proceed? [n/Y] y
  19. Key for minion saltstack accepted.
  20.  
  21. [root@saltstack ~]# salt-key
  22. Accepted Keys:
  23. client1
  24. client2
  25. saltstack
  26. Denied Keys:
  27. Unaccepted Keys:
  28. Rejected Keys:

说明:-a :accept ,-A:accept-all,-d:delete,-D:delete-all。可以使用 salt-key 命令查看到已经签名的客户端。此时我们在客户端的 /etc/salt/pki/minion 目录下面会多出一个minion_master.pub 文件

测试验证
示例1: salt '*' test.ping //检测通讯是否正常,也可以指定其中一个 'client1'

  1. [root@saltstack ~]# salt '*' test.ping
  2. saltstack:
  3. True
  4. client2:
  5. True
  6. client1:
  7. True
  8. [root@saltstack ~]# salt 'client1' test.ping
  9. client1:
  10. True

示例2: salt '*' cmd.run 'df -h' //远程执行命令

  1. [root@saltstack ~]# salt '*' cmd.run 'df -hT'
  2. client2:
  3. Filesystem Type Size Used Avail Use% Mounted on
  4. /dev/sda2 xfs 17G 13G 4.2G 76% /
  5. devtmpfs devtmpfs 97M 0 97M 0% /dev
  6. tmpfs tmpfs 111M 12K 111M 1% /dev/shm
  7. tmpfs tmpfs 111M 8.8M 102M 8% /run
  8. tmpfs tmpfs 111M 0 111M 0% /sys/fs/cgroup
  9. /dev/sda1 xfs 297M 202M 96M 68% /boot
  10. tmpfs tmpfs 23M 0 23M 0% /run/user/0
  11. saltstack:
  12. Filesystem Type Size Used Avail Use% Mounted on
  13. /dev/sda2 xfs 17G 6.8G 11G 40% /
  14. devtmpfs devtmpfs 475M 0 475M 0% /dev
  15. tmpfs tmpfs 489M 16K 489M 1% /dev/shm
  16. tmpfs tmpfs 489M 14M 476M 3% /run
  17. tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
  18. /dev/sda1 xfs 297M 202M 96M 68% /boot
  19. tmpfs tmpfs 98M 0 98M 0% /run/user/0
  20. tmpfs tmpfs 98M 0 98M 0% /run/user/994
  21. client1:
  22. Filesystem Type Size Used Avail Use% Mounted on
  23. /dev/sda2 xfs 17G 13G 4.1G 77% /
  24. devtmpfs devtmpfs 97M 0 97M 0% /dev
  25. tmpfs tmpfs 111M 12K 111M 1% /dev/shm
  26. tmpfs tmpfs 111M 13M 98M 12% /run
  27. tmpfs tmpfs 111M 0 111M 0% /sys/fs/cgroup
  28. /dev/sda1 xfs 297M 202M 96M 68% /boot
  29. tmpfs tmpfs 23M 0 23M 0% /run/user/0

说明: 这里的 * 必须是在 master 上已经被接受过的客户端,可以通过 salt-key 查到,通常是我们已经设定的 id 值。关于这部分内容,它支持通配、列表以及正则。 比如两台客户端 client1、client2, 那我们可以写成 salt 'client*' salt 'client[2]' salt -L 'client1,client2' salt -E 'client(1|2)' 等形式,使用列表,即多个机器用逗号分隔,而且需要加-L,使用正则必须要带-E选项。 它还支持 grains 和 pillar,分别加 -G 和 -I 选项。

  1. [root@saltstack ~]# salt -E 'client(1|2)' cmd.run 'ls'
  2. client1:
  3. anaconda-ks.cfg
  4. initial-setup-ks.cfg
  5. one-click-install-lnmp.sh
  6. client2:
  7. anaconda-ks.cfg
  8. initial-setup-ks.cfg
  9. one-click-install-lnmp.sh
  10. [root@saltstack ~]# salt -L 'client1,client2' cmd.run 'ls'
  11. client1:
  12. anaconda-ks.cfg
  13. initial-setup-ks.cfg
  14. one-click-install-lnmp.sh
  15. client2:
  16. anaconda-ks.cfg
  17. initial-setup-ks.cfg
  18. one-click-install-lnmp.sh
  19. [root@saltstack ~]# salt 'client[2]' cmd.run 'ls'
  20. client2:
  21. anaconda-ks.cfg
  22. initial-setup-ks.cfg
  23. one-click-install-lnmp.sh
  24. [root@saltstack ~]# salt 'client*' cmd.run 'ls'
  25. client2:
  26. anaconda-ks.cfg
  27. initial-setup-ks.cfg
  28. one-click-install-lnmp.sh
  29. client1:
  30. anaconda-ks.cfg
  31. initial-setup-ks.cfg
  32. one-click-install-lnmp.sh
grains 和 pillar

1、grains
grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等。
使用命令:

  1. [root@saltstack ~]# salt 'client1' grains.ls // 列出所有的 grains 项目名字
  2. [root@saltstack ~]# salt 'client1' grains.items // 列出所有的 grains 项目名以及值

grains的信息并不是动态的,并不会时时变更,它只是在 minion 启动时收集到的。grains 也可以做配置管理

自定义 grains的方法有两种(客户端自定义配置和服务端写脚本定义):
1.客户端配置(缺点:每台都得去配置,机器多了配置起来不方便)

  1. [root@client1 ~]# vi /etc/salt/grains // 添加如下,注意冒号后有空格
  2. role: Nginx
  3. env: test
  4. myname: primum est

或者

  1. [root@client2 ~]# vi /etc/salt/minion +12
  2. 去掉这行内容的注释
  3. default_include: minion.d/*.conf
  4.  
  5. [root@client2 ~]# cd /etc/salt/minion.d/
  6. [root@client2 minion.d]# vi custom_grains.conf // 添加下面内容
  7. grains:
  8. role:
  9. Nginx
  10. env:
  11. test
  12. myname:
  13. primum est

重启minion服务

  1. [root@client1 ~]# systemctl restart salt-minion
  2. [root@client2 ~]# systemctl restart salt-minion

服务端获取 grains

  1. [root@saltstack ~]# salt 'client*' grains.item role env myname // 列出多个
  2. client1:
  3. ----------
  4. env:
  5. test
  6. myname:
  7. primum est
  8. role:
  9. Nginx
  10. client2:
  11. ----------
  12. env:
  13. test
  14. myname:
  15. primum est
  16. role:
  17. Nginx
  18.  
  19. [root@saltstack ~]# salt 'client*' grains.get myname // 列出单个
  20. client1:
  21. primum est
  22. client2:
  23. primum est
  24.  
  25. [root@saltstack ~]# salt 'client*' grains.item myname
  26. client2:
  27. ----------
  28. myname:
  29. primum est
  30. client1:
  31. ----------
  32. myname:
  33. primum est

grains 在远程执行命令时很方便。我们可以按照 grains 的一些指标来操作。比如把所有的 web 服务器的 grains 的 role 设置为 Nginx,那这样我们就可以批量对 Nginx 的服务器进行操作了:

  1. [root@saltstack ~]# salt -G role:Nginx cmd.run 'hostname'
  2. client2:
  3. client2
  4. client1:
  5. client1
  6. [root@saltstack ~]# salt -G os:CentOs cmd.run 'hostname'
  7. client2:
  8. client2
  9. client1:
  10. client1

2.服务端写Python脚本

  1. [root@saltstack ~]# mkdir /srv/salt/_grains
  2. [root@saltstack ~]# cd /srv/salt/_grains/
  3. [root@saltstack _grains]# vi mytest.py // 添加下面内容
  4. #!/usr/bin/env python
  5. # _*_ coding:utf-8 _*_
  6.  
  7. import os
  8.  
  9. def my_test():
  10. grains = {}
  11. grains['say'] = 'hello world'
  12. return grains
  13.  
  14. def my_test1():
  15. grains = {}
  16. with os.popen('free -m') as f:
  17. grains['mem_usage'] = f.read()
  18. return grains

同步到客户端

  1. [root@saltstack _grains]# salt 'client*' saltutil.sync_all

客户端验证脚本是否同步过去

  1. [root@client1 ~]# ll /var/cache/salt/minion/extmods/grains/
  2. 总用量 8
  3. -rw------- 1 root root 266 4 27 11:13 mytest.py
  4. -rw------- 1 root root 613 4 27 11:13 mytest.pyc

服务端刷新模块

  1. [root@saltstack _grains]# salt 'client*' sys.reload_modules
  2. client1:
  3. True
  4. client2:
  5. True

服务端查看客户端自定义的两个监控项

  1. [root@saltstack _grains]# salt 'client*' grains.item say
  2. client1:
  3. ----------
  4. say:
  5. hello world
  6. client2:
  7. ----------
  8. say:
  9. hello world
  10. [root@saltstack _grains]# salt 'client*' grains.item mem_usage
  11. client2:
  12. ----------
  13. mem_usage:
  14. total used free shared buff/cache available
  15. Mem: 220 103 31 4 85 78
  16. Swap: 2046 176 1870
  17. client1:
  18. ----------
  19. mem_usage:
  20. total used free shared buff/cache available
  21. Mem: 220 106 30 2 83 76
  22. Swap: 2046 178 1868

可以看到服务端写自定义监控项的脚本,可以一键同步到所有客户端上,快捷方便。

2、pillar
pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
首先我们查看master端pillars组件是否在开启状态
查看/etc/salt/master pillar_ops: True 就代表pillars在开启状态,否则我们手动修改
新的版本默认已经开启,继续下面内容

查看指定minion的 pillar 值:

  1. [root@saltstack ~]# salt 'client1' pillar.items
  2. client1:
  3. ----------

服务端自定义配置 pillar

  1. [root@saltstack ~]# vi /etc/salt/master +529 // 找到如下内容,去掉#号
  2. pillar_roots:
  3. base:
  4. - /srv/pillar
  5. [root@saltstack ~]# mkdir /srv/pillar
  6. [root@saltstack ~]# vi /srv/pillar/test.sls // 自定义配置文件内容如下
  7. conf: /etc/mum.conf
  8. myname: primum est
  9. [root@saltstack ~]# vi /srv/pillar/top.sls // 总入口文件内容如下
  10. base:
  11. 'client1':
  12. - test

重启master

  1. [root@saltstack ~]# systemctl restart salt-master

注意:当更改完 pillar 配置文件后,我们可以通过刷新 pillar 配置来获取新的 pillar 状态:

  1. [root@saltstack ~]# salt '*' saltutil.refresh_pillar
  2. client1:
  3. True
  4. saltstack:
  5. True
  6. client2:
  7. True

验证:

  1. [root@saltstack ~]# salt 'client1' pillar.items
  2. client1:
  3. ----------
  4. conf:
  5. /etc/mum.conf
  6. myname:
  7. primum est
  8.  
  9. [root@saltstack ~]# salt 'client1' pillar.item myname
  10. client1:
  11. ----------
  12. myname:
  13. primum est
  14.  
  15. [root@saltstack ~]# salt 'client1' pillar.item conf
  16. client1:
  17. ----------
  18. conf:
  19. /etc/mum.conf

pillar 同样可以用来作为 salt 的匹配对象。比如:

  1. [root@saltstack ~]# salt -I 'conf:/etc/mum.conf' test.ping
  2. client1:
  3. True
  4. [root@saltstack ~]# salt -I 'conf:/etc/mum.conf' cmd.run 'w'
  5. client1:
  6. 17:19:45 up 7:45,1 user,load average: 0.05,0.03,0.05
  7. USER TTY FROM LOGIN@ IDLE Jcpu Pcpu WHAT
  8. root pts/1 172.16.0.1 11:14 25.00s 0.68s 0.68s -bash

另外一种定义pillar的方式,也适用于state
首先编辑/srv/pillar/目录下的top.sls 文件

  1. [root@saltstack ~]# vi /srv/pillar/top.sls // 内容如下
  2. base:
  3. 'client1':
  4. - test
  5. - apache

第一行代表这是我们的入口文件
第二行代表我们要匹配的用户,‘client1’代表client1客户端,“*”代表所有用户
第三丶四行代表匹配到的用户可以看到的数据的配置文件的名字

这里我们可以直接写一个名字叫做apache的文件进行配置,也可以写一个包含init.sls的目录进行配置。这里采用包含init.sls文件的目录的形式的配置方法

  1. [root@saltstack ~]# cd /srv/pillar/
  2. [root@saltstack pillar]# mkdir apache
  3. [root@saltstack pillar]# cd apache/
  4. [root@saltstack apache]# vim init.sls // 添加如下内容
  5. system-type:
  6. {% if grains.os == 'CentOS' %}
  7. name: Centos-Linux
  8. {% else %}
  9. name: unknown
  10. {% endif %}
  11.  
  12. apache-name:
  13. {% if grains.os_family == 'RedHat' %}
  14. apache: httpd
  15. {% elif grains.os_family == 'Arch' %}
  16. apache: apache
  17. {% elif grains.os_family == 'Debian' %}
  18. apache: apache2
  19. {% endif %}

{% if grains.os == 'CentOS' %} 类似于django的模板语言(我们可以采用python脚本定义grains的数据,但是pillar没有。我们可以在pillar的sls脚本当中调用grains的变量,pillar和grains具有同样的功能可以被其他组件调用。)

服务端查看自定义的pillar信息

  1. [root@saltstack apache]# salt 'client1' pillar.item apache-name
  2. client1:
  3. ----------
  4. apache-name:
  5. ----------
  6. apache:
  7. httpd
  8. [root@saltstack apache]# salt 'client1' pillar.item system-type
  9. client1:
  10. ----------
  11. system-type:
  12. ----------
  13. name:
  14. Centos-Linux

配置管理安装Apache

下面进行的演示是远程通过 yum 方式安装 Apache。步骤如下:
修改配置文件

  1. [root@saltstack ~]# vi /etc/salt/master +406 // 打开如下内容的注释
  2. file_roots:
  3. base:
  4. - /srv/salt/

注意:环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。

  1. [root@saltstack ~]# mkdir /srv/salt
  2. [root@saltstack ~]# vi /srv/salt/top.sls
  3. base:
  4. 'client1':
  5. - apache

注意:若换成 '*',则表示在所有的客户端执行 apache 模块。

  1. [root@saltstack ~]# vi /srv/salt/apache.sls
  2. apache-service:
  3. pkg.installed:
  4. - names: // 如果只有一个服务,那么就可以写成 –name: httpd 不用再换一行
  5. - httpd
  6. - httpd-devel
  7. service.running:
  8. - name: httpd
  9. - enable: True

注意:apache-service 是自定义的 id 名。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running 也是一个函数,来保证指定的服务启动,enable 表示开机启动。

重启服务

  1. 执行命令

  2. [root@saltstack ~]# salt 'client1' state.highstate          // 执行时间比较长,因为要安装httpd

  3. 如上图所示,说明 Apache 远程安装已成功。

  4. 文件目录管理

  5. 1文件管理
    服务端配置
    编辑/srv/salt/目录下的top.sls 文件

  6. [root@saltstack ~]# vi /srv/salt/top.sls     // 修改为如下
  7. base:
  8.   'client1':
  9.     - filetest
  10. 新建 filetest.sls 文件

  11. [root@saltstack ~]# vi /srv/salt/filetest.sls        
  12. file-test:
  13.   file.managed:
  14.     - name: /tmp/filetest.txt
  15.     - source: salt://test/123/1.txt
  16.     - user: root
  17.     - group: root
  18.     - mode: 644
  19. 注意:第一行的 file-test 为自定的名字,表示该配置段的名字,可以在别的配置段中引用它;source指定文件从哪里拷贝,这里的 test 目录相当于是 /srv/salt/test 目录;name指定远程客户端要生成文件

  20. 新建所要测试的源文件

  21. [root@saltstack ~]# mkdir -p /srv/salt/test/123
  22. [root@saltstack ~]# vim /srv/salt/test/123/1.txt
  23. saltstack ....
  24. this is a test ....
  25. 执行命令:

  26. [root@saltstack ~]# salt 'client1' state.highstate
  27. 客户端验证

  28. [root@client1 ~]# ll /tmp/filetest.txt 
  29. -rw-r--r-- 1 root root 34 4  26 10:58 /tmp/filetest.txt
  30. [root@client1 ~]# cat /tmp/filetest.txt 
  31. saltstack ....
  32. this is a test ...
  33. 2、目录管理
    服务端配置
    接着编辑/srv/salt/目录下的top.sls 文件

  34. [root@saltstack ~]# vi /srv/salt/top.sls     // 修改为如下
  35. base:
  36.   'client1':
  37.     - filedir
  38. 新建 filedir.sls 文件

  39. [root@saltstack ~]# vi /srv/salt/filedir.sls
  40. file-dir:
  41.   file.recurse:
  42.     - name: /tmp/testdir
  43.     - source: salt://test1/234
  44.     - user: root
  45.     - file_mode: 644
  46.     - dir_mode: 755
  47.     - mkdir: True
  48.     - clean: True
  49. 注意:clean: True 删除文件或目录,目标也会跟着删除,否则不会删除。可以默认设置为 False

  50. 新建所要测试的源目录

  51. [root@saltstack ~]# mkdir -p /srv/salt/test1/234/
  52. [root@saltstack ~]# vi /srv/salt/test1/234/2.txt
  53. filedir..........test
  54. and add delete select alter
  55. [root@client1 ~]# ll /tmp/testdir/

  56. 总用量 4

  57. -rw-r--r-- 1 root root 50 4 26 11:11 2.txt

测试增删功能

  1. [root@saltstack ~]# mkdir /srv/salt/test1/234/mydir
  2. [root@saltstack ~]# touch /srv/salt/test1/234/mydir/111.txt
  3. [root@saltstack ~]# touch /srv/salt/test1/234/testdir.add
  4. [root@saltstack ~]# rm -rf /srv/salt/test1/234/2.txt

[root@client1 ~]# tree /tmp/testdir/ /tmp/testdir/ |-- mydir | `-- 111.txt `-- testdir.add 1 directory,2 files

注意:由上图可知,成功在客户端 /tmp/testdir/ 目录下创建了 mydir 目录以及 testdir.add 文件,并删除 2.txt 文件。这里值得注意的是要成功创建 mydir 目录,前提是 mydir 目录下要有文件,如这里的111.txt 文件,如若没有,客户端是不会创建 mydir 目录的。

远程执行

前面提到远程执行命令 test.ping,cmd.run,点前面的是模块,点后面的是函数;这样总归是不太规范化,下面详细介绍怎么远程执行命令和脚本。
1、远程执行命令
服务端配置
接着编辑/srv/salt/目录下的top.sls 文件

  1. [root@saltstack ~]# vi /srv/salt/top.sls // 修改为如下
  2. base:
  3. 'client1':
  4. - cmdtest

新建 cmdtest.sls 文件

  1. [root@saltstack ~]# vi /srv/salt/cmdtest.sls
  2. cmd-test:
  3. cmd.run:
  4. - onlyif: test -f /tmp/filetest.txt
  5. - names:
  6. - touch /tmp/cmdtest.txt
  7. - mkdir /tmp/cmdtest
  8. - user: root

注意:条件 onlyif 表示若 /tmp/filetest.txt 文件存在,则执行后面的命令;可以使用 unless,两者正好相反。

[root@client1 ~]# ll /tmp/ 总用量 156 drwxr-xr-x 2 root root 6 4月 26 11:45 cmdtest -rw-r--r-- 1 root root 0 4月 26 11:45 cmdtest.txt -rw-r--r-- 1 root root 34 4月 26 10:58 filetest.txt drwxr-xr-x 3 root root 38 4月 26 11:14 testdir

2、远程执行脚本
服务端配置
接着编辑/srv/salt/目录下的top.sls 文件

  1. [root@saltstack ~]# vi /srv/salt/top.sls // 修改为如下
  2. base:
  3. 'client1':
  4. - shelltest

新建 shelltest.sls 文件

  1. [root@saltstack ~]# vi /srv/salt/shelltest.sls
  2. shell-test:
  3. cmd.script:
  4. - source: salt://test/1.sh
  5. - user: root

新建 1.sh 脚本文件

  1. [root@saltstack ~]# vi /srv/salt/test/1.sh
  2. #!/bin/sh
  3. touch /tmp/shelltest.txt
  4. if [ -d /tmp/shelltest ]
  5. then
  6. rm -rf /tmp/shelltest
  7. else
  8. mkdir /tmp/shelltest
  9. fi

[root@client1 ~]# ll /tmp/ drwxr-xr-x 2 root root 6 4月 26 12:08 shelltest -rw-r--r-- 1 root root 0 4月 26 12:08 shelltest.txt

通过上面的例子,我们实现了远程执行脚本;如果我们想一键远程安装 LAMP 或者 LNMP,那么只需把本例中的 1.sh 脚本替换成 一键安装的脚本就行。



管理任务计划
1、建立 cron
服务端配置
编辑/srv/salt/目录下的top.sls 文件

  1. [root@saltstack ~]# vi /srv/salt/top.sls // 修改为如下
  2. #base:
  3. # 'client1':
  4. # - apache
  5. #base:
  6. # 'client1':
  7. # - filetest
  8. #base:
  9. # 'client1':
  10. # - filedir
  11. #base:
  12. # 'client1':
  13. # - cmdtest
  14. #base:
  15. # 'client1':
  16. # - shelltest
  17. #base:
  18. # 'client1':
  19. # - shelltest
  20. base:
  21. 'client1':
  22. - crontest

编辑 crontest.sls 文件

  1. [root@saltstack ~]# vim /srv/salt/crontest.sls
  2. cron-test:
  3. cron.present:
  4. - name: /bin/touch /tmp/111.txt
  5. - user: root
  6. - minute: '*'
  7. - hour: 20
  8. - daymonth: 1-10
  9. - month: '3,5'
  10. - dayweek: '*'

注意,*需要用单引号引起来。当然我们还可以使用 file.managed 模块来管理 cron,因为系统的 cron都是以配置文件的形式存在的。

[root@client1 ~]# crontab -l # Lines below here are managed by Salt,do not edit # SALT_CRON_IDENTIFIER:/bin/touch /tmp/111.txt * 20 1-10 3,5 * /bin/touch /tmp/111.txt

2、删除 cron
服务端配置
我们只需修改 crontest.sls 文件

  1. [root@saltstack ~]# vim /srv/salt/crontest.sls
  2. cron.present 改为 cron.absent

注意:两者不能共存,要想删除一个 cron,那之前的 present 就得替换掉或者删除掉。

[root@client1 ~]# crontab -l // 可查看到该任务计划已删除 # Lines below here are managed by Salt,do not edit

一键搭建rsync服务

rsync服务端搭建配置文件介绍

  1. [root@saltstack rsync]# cat rsync_server.sls
  2. rsync: ##ID 这个ID必须是唯一的名字
  3. user.present: ##user模块中present应用
  4. - fullname: rsync ##用户名
  5. - createhome: False ##不创建家目录
  6. - shell: /sbin/nologin ##禁止登录
  7. - empty_password: True ##不需要密码
  8. rsyncd.conf: ##ID
  9. file.managed: ##file模块
  10. - name: /etc/rsyncd.conf ##客户端文件存放路径
  11. - source: salt://rsync/rsyncd.conf ##服务端文件路径
  12. - user: root ##属主
  13. - group: root ##属组
  14. - mode: 644 ##权限
  15. backup:
  16. file.directory: ##file模块
  17. - name: /backup ##创建目录名
  18. - user: rsync
  19. - group: rsync
  20. - mode: 755
  21. - makedirs: True ##如果没有自动创建
  22. rsync.password:
  23. file.managed:
  24. - name: /etc/rsync.password
  25. - source: salt://rsync/rsyncd.password
  26. - user: root
  27. - group: root
  28. - mode: 600
  29. daemon:
  30. cmd.run: ##使用cmd.run模块
  31. - name: rsync --daemon
  32. Boot from open:
  33. cmd.run:
  34. - name: echo "/usr/bin/rsync --daemon" >>/etc/rc.local

开始部署
服务端配置
编辑/srv/salt/目录下的top.sls 文件

  1. [root@saltstack ~]# vi /srv/salt/top.sls // 修改为下面内容
  2. base:
  3. 'client1':
  4. - rsync.rsync_server
  5. 'client2':
  6. - rsync.rsync_client

创建rsync服务端搭建配置文件

  1. [root@saltstack ~]# mkdir /srv/salt/rsync
  2. [root@saltstack ~]# cd /srv/salt/rsync/
  3. [root@saltstack rsync]# vi rsync_server.sls // 添加下面内容
  4. rsync:
  5. user.present:
  6. - fullname: rsync
  7. - createhome: False
  8. - shell: /sbin/nologin
  9. - empty_password: True
  10. rsyncd.conf: ##ID
  11. file.managed:
  12. - name: /etc/rsyncd.conf
  13. - source: salt://rsync/rsyncd.conf
  14. - user: root
  15. - group: root
  16. - mode: 644
  17. backup:
  18. file.directory:
  19. - name: /backup
  20. - user: rsync
  21. - group: rsync
  22. - mode: 755
  23. - makedirs: True
  24. rsync.password:
  25. file.managed:
  26. - name: /etc/rsync.password
  27. - source: salt://rsync/rsyncd.password
  28. - user: root
  29. - group: root
  30. - mode: 600
  31. daemon:
  32. cmd.run:
  33. - name: rsync --daemon
  34. Boot from open:
  35. cmd.run:
  36. - name: echo "/usr/bin/rsync --daemon" >>/etc/rc.local

创建rsync客户端搭建配置文件

  1. [root@saltstack rsync]# vi rsync_client.sls // 添加下面内容
  2. rsync.passwd:
  3. file.managed:
  4. - name: /etc/rsync.password
  5. - source: salt://rsync/rsync.password
  6. - user: root
  7. - group: root
  8. - mode: 600
  9. backup:
  10. file.directory:
  11. - name: /backup
  12. - user: root
  13. - group: root
  14. - mode: 755
  15. - makedirs: True

创建rsync服务配置文件(这里是rsync服务的配置文件,上面的是salt安装rsync服务应用的搭建配置文件

  1. [root@saltstack rsync]# vi rsyncd.conf // rsync配置文件
  2. uid =rsync
  3. gid =rsync
  4. use chroot=no
  5. max chonnections =200
  6. timeout = 300
  7. pid file =/var/run/rsyncd.pid
  8. lock file = /var/run/rsync.lock
  9. log file = /var/log/rsyncd.log
  10. ignore errors
  11. read only = false
  12. list = false
  13. hosts allow = 172.16.0.0/24
  14. hosts deny = 0.0.0.0/32
  15. auth users = rsync_backup
  16. secrets file = /etc/rsync.password
  17. [backup]
  18. path = /backup
  19.  
  20. [root@saltstack rsync]# vi rsyncd.password // 服务端密码文件
  21. rsync_backup:123456
  22.  
  23. [root@saltstack rsync]# vi rsync.password // 客户端密码文件
  24. 123456
  25.  
  26. [root@saltstack rsync]# ll
  27. 总用量 20
  28. -rw-r--r-- 1 root root 274 4 26 15:17 rsync_client.sls
  29. -rw-r--r-- 1 root root 376 4 26 15:11 rsyncd.conf
  30. -rw-r--r-- 1 root root 20 4 26 15:15 rsyncd.password
  31. -rw-r--r-- 1 root root 7 4 26 15:15 rsync.password
  32. -rw-r--r-- 1 root root 723 4 26 15:16 rsync_server.sls

验证rsync服务是否安装成功
rsync服务端查看服务是否启动

  1. [root@client1 ~]# ll /etc/rsync.password
  2. -rw------- 1 root root 20 4 26 15:24 /etc/rsync.password
  3. [root@client1 ~]# cat /etc/rsync.password
  4. rsync_backup:123456
  5. [root@client1 ~]# ps -ef|grep rsync
  6. root 12636 1 0 15:24 ? 00:00:00 rsync --daemon
  7. root 12710 2400 0 15:25 pts/0 00:00:00 grep --color=auto rsync

好极了,我们在rsync客户端推送一个文件到服务端是否成功

  1. [root@client2 ~]# cd /backup/
  2. [root@client2 backup]# echo 'this msg from new install rsync client used by test' > test.txt
  3. [root@client2 backup]# ls test.txt
  4. test.txt
  5. [root@client2 backup]# rsync -avz /backup/ rsync_backup@172.16.0.20::backup --password-file=/etc/rsync.password
  6. sending incremental file list
  7. ./
  8. test.txt
  9.  
  10. sent 132 bytes received 30 bytes 324.00 bytes/sec
  11. total size is 52 speedup is 0.32

貌似推送成功了,快去rsync服务端看下吧

  1. [root@client1 ~]# cd /backup/
  2. [root@client1 backup]# ll
  3. 总用量 4
  4. -rw-r--r-- 1 rsync rsync 52 4 26 15:46 test.txt
  5. [root@client1 backup]# cat test.txt
  6. this msg from new install rsync client used by test

好的,顺利装完,出去抽支烟和活动下颈椎吧。

Saltstack 常用命令

1、拷贝文件到客户端

  1. [root@saltstack ~]# salt 'client2' cp.get_file salt://apache.sls /tmp/cp.txt
  2. client2:
  3. /tmp/cp.txt

客户端查看

  1. [root@client2 ~]# ll /tmp
  2. 总用量 4
  3. -rw-r--r-- 1 root root 151 4 26 14:04 cp.txt

2、拷贝目录到客户端

  1. [root@saltstack ~]# salt 'client2' cp.get_dir salt://test /tmp
  2. client2:
  3. - /tmp/test/1.sh
  4. - /tmp/test/123/1.txt

root@client2 ~]# ll /tmp/ 总用量 4 -rw-r--r-- 1 root root 151 4月 26 14:04 cp.txt drwxr-xr-x 3 root root 29 4月 26 14:14 test

3、显示存活的客户端

  1. [root@saltstack ~]# salt-run manage.up
  2. - client1
  3. - client2
  4. - saltstack

4、命令下执行服务端的脚本

  1. [root@saltstack ~]# vim /srv/salt/test/shell.sh
  2. #! /bin/sh
  3. echo "salt server do run shell script on client" > /tmp/shell.txt
  4.  
  5. [root@saltstack ~]# salt 'client2' cmd.script salt://test/shell.sh
[root@client2 ~]# ll /tmp/ -rw-r--r-- 1 root root 42 4月 26 14:20 shell.txt [root@client2 ~]# cat /tmp/shell.txt salt server do run shell script on client

猜你在找的CentOS相关文章