共计 18373 个字符,预计需要花费 46 分钟才能阅读完成。
简述
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(客户端)
查看版本和内核
[ | ]|
CentOS Linux release 7.3.1611 (Core) | |
[ | ]|
3.10.0-514.6.1.el7.x86_64 x86_64 |
分别设置 hostname,设置完毕 xshell 注销重新连接一下
[ | ]|
[ | ]|
[ | ]
编辑 hosts 文件
每台都设置,若机器太多,可以通过搭建 DNS,则不用在每台机器上设置这个
[ | ]|
添加下面内容 | |
172.16.0.19 saltstack | |
172.16.0.20 client1 | |
172.16.0.21 client2 |
开始安装
分别为三台机器添加阿里云 epel 源
[ | ]|
[ | ]|
[ | ]
服务端安装
[root@saltstack ~]# yum -y install salt-master salt-minion
客户端安装
[root@client1 ~]# yum -y install salt-minion
客户端安装
[root@client2 ~]# yum -y install salt-minion
配置 master
服务端和客户端都要配置
[root@saltstack ~]# vi /etc/salt/minion +16 | |
以下两种方式都可以,选择其中一种即可 | |
# master 改为服务端的主机名 | |
master: saltstack | |
# master 改为服务端的 IP | |
master: 172.16.0.19 |
分别修改三台机器 minion 文件中的的 id 为自己的主机名
[ | ]|
id: client1 | |
[ | ]|
id: client2 |
启动 saltstack 服务
服务端
[ | ]|
[ | ]|
[ | ]|
[ | ]
客户端
[ | ]|
[ | ]
配置认证
服务端操作
[root@saltstack ~]# salt-key -a client1 | |
The following keys are going to be accepted: | |
Unaccepted Keys: | |
client1 | |
Proceed? [n/Y] y | |
Key for minion client1 accepted. | |
[root@saltstack ~]# salt-key -a client2 | |
The following keys are going to be accepted: | |
Unaccepted Keys: | |
client2 | |
Proceed? [n/Y] y | |
Key for minion client2 accepted. | |
[root@saltstack ~]# salt-key -a saltstack | |
The following keys are going to be accepted: | |
Unaccepted Keys: | |
saltstack | |
Proceed? [n/Y] y | |
Key for minion saltstack accepted. | |
[root@saltstack ~]# salt-key | |
Accepted Keys: | |
client1 | |
client2 | |
saltstack | |
Denied Keys: | |
Unaccepted Keys: | |
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’
[root@saltstack ~]# salt '*' test.ping | |
saltstack: | |
True | |
client2: | |
True | |
client1: | |
True | |
[root@saltstack ~]# salt 'client1' test.ping | |
client1: | |
True |
示例 2: salt ‘*’ cmd.run ‘df -h’ // 远程执行命令
[root@saltstack ~]# salt '*' cmd.run 'df -hT' | |
client2: | |
Filesystem Type Size Used Avail Use% Mounted on | |
/dev/sda2 xfs 17G 13G 4.2G 76% / | |
devtmpfs devtmpfs 97M 0 97M 0% /dev | |
tmpfs tmpfs 111M 12K 111M 1% /dev/shm | |
tmpfs tmpfs 111M 8.8M 102M 8% /run | |
tmpfs tmpfs 111M 0 111M 0% /sys/fs/cgroup | |
/dev/sda1 xfs 297M 202M 96M 68% /boot | |
tmpfs tmpfs 23M 0 23M 0% /run/user/0 | |
saltstack: | |
Filesystem Type Size Used Avail Use% Mounted on | |
/dev/sda2 xfs 17G 6.8G 11G 40% / | |
devtmpfs devtmpfs 475M 0 475M 0% /dev | |
tmpfs tmpfs 489M 16K 489M 1% /dev/shm | |
tmpfs tmpfs 489M 14M 476M 3% /run | |
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup | |
/dev/sda1 xfs 297M 202M 96M 68% /boot | |
tmpfs tmpfs 98M 0 98M 0% /run/user/0 | |
tmpfs tmpfs 98M 0 98M 0% /run/user/994 | |
client1: | |
Filesystem Type Size Used Avail Use% Mounted on | |
/dev/sda2 xfs 17G 13G 4.1G 77% / | |
devtmpfs devtmpfs 97M 0 97M 0% /dev | |
tmpfs tmpfs 111M 12K 111M 1% /dev/shm | |
tmpfs tmpfs 111M 13M 98M 12% /run | |
tmpfs tmpfs 111M 0 111M 0% /sys/fs/cgroup | |
/dev/sda1 xfs 297M 202M 96M 68% /boot | |
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 选项。
[root@saltstack ~]# salt -E 'client(1|2)' cmd.run 'ls' | |
client1: | |
anaconda-ks.cfg | |
initial-setup-ks.cfg | |
one-click-install-lnmp.sh | |
client2: | |
anaconda-ks.cfg | |
initial-setup-ks.cfg | |
one-click-install-lnmp.sh | |
[root@saltstack ~]# salt -L 'client1,client2' cmd.run 'ls' | |
client1: | |
anaconda-ks.cfg | |
initial-setup-ks.cfg | |
one-click-install-lnmp.sh | |
client2: | |
anaconda-ks.cfg | |
initial-setup-ks.cfg | |
one-click-install-lnmp.sh | |
[root@saltstack ~]# salt 'client[2]' cmd.run 'ls' | |
client2: | |
anaconda-ks.cfg | |
initial-setup-ks.cfg | |
one-click-install-lnmp.sh | |
[root@saltstack ~]# salt 'client*' cmd.run 'ls' | |
client2: | |
anaconda-ks.cfg | |
initial-setup-ks.cfg | |
one-click-install-lnmp.sh | |
client1: | |
anaconda-ks.cfg | |
initial-setup-ks.cfg | |
one-click-install-lnmp.sh |
grains 和 pillar
1、grains
grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡 ip 等。
使用命令:
[root@saltstack ~]# salt 'client1' grains.ls // 列出所有的 grains 项目名字 | |
[root@saltstack ~]# salt 'client1' grains.items // 列出所有的 grains 项目名以及值 |
grains 的信息并不是动态的,并不会时时变更,它只是在 minion 启动时收集到的。grains 也可以做配置管理
自定义 grains 的方法有两种(客户端自定义配置和服务端写脚本定义):
1. 客户端配置(缺点:每台都得去配置,机器多了配置起来不方便)
[root@client1 ~]# vi /etc/salt/grains // 添加如下,注意冒号后有空格 | |
role: nginx | |
env: test | |
myname: primum est |
或者
[root@client2 ~]# vi /etc/salt/minion +12 | |
去掉这行内容的注释 | |
default_include: minion.d/*.conf | |
[root@client2 ~]# cd /etc/salt/minion.d/ | |
[root@client2 minion.d]# vi custom_grains.conf // 添加下面内容 | |
grains: | |
role: | |
nginx | |
env: | |
test | |
myname: | |
primum est |
重启 minion 服务
[ | ]|
[ | ]
服务端获取 grains
[root@saltstack ~]# salt 'client*' grains.item role env myname // 列出多个 | |
client1: | |
---------- | |
env: | |
test | |
myname: | |
primum est | |
role: | |
nginx | |
client2: | |
---------- | |
env: | |
test | |
myname: | |
primum est | |
role: | |
nginx | |
[root@saltstack ~]# salt 'client*' grains.get myname // 列出单个 | |
client1: | |
primum est | |
client2: | |
primum est | |
[root@saltstack ~]# salt 'client*' grains.item myname | |
client2: | |
---------- | |
myname: | |
primum est | |
client1: | |
---------- | |
myname: | |
primum est |
grains 在远程执行命令时很方便。我们可以按照 grains 的一些指标来操作。比如把所有的 web 服务器的 grains 的 role 设置为 nginx,那这样我们就可以批量对 nginx 的服务器进行操作了:
[root@saltstack ~]# salt -G role:nginx cmd.run 'hostname' | |
client2: | |
client2 | |
client1: | |
client1 | |
[root@saltstack ~]# salt -G os:CentOs cmd.run 'hostname' | |
client2: | |
client2 | |
client1: | |
client1 |
2. 服务端写 Python 脚本
[ | ]|
[ | ]|
[ | ]|
import os | |
def my_test(): | |
grains = {} | |
grains['say'] = 'hello world' | |
return grains | |
def my_test1(): | |
grains = {} | |
with os.popen('free -m') as f: | |
grains['mem_usage'] = f.read() | |
return grains |
同步到客户端
[root@saltstack _grains]# salt 'client*' saltutil.sync_all

客户端验证脚本是否同步过去
[root@client1 ~]# ll /var/cache/salt/minion/extmods/grains/ | |
总用量 8 | |
-rw------- 1 root root 266 4 月 27 11:13 mytest.py | |
-rw------- 1 root root 613 4 月 27 11:13 mytest.pyc |
服务端刷新模块
[root@saltstack _grains]# salt 'client*' sys.reload_modules | |
client1: | |
True | |
client2: | |
True |
服务端查看客户端自定义的两个监控项
[root@saltstack _grains]# salt 'client*' grains.item say | |
client1: | |
---------- | |
say: | |
hello world | |
client2: | |
---------- | |
say: | |
hello world | |
[root@saltstack _grains]# salt 'client*' grains.item mem_usage | |
client2: | |
---------- | |
mem_usage: | |
total used free shared buff/cache available | |
Mem: 220 103 31 4 85 78 | |
Swap: 2046 176 1870 | |
client1: | |
---------- | |
mem_usage: | |
total used free shared buff/cache available | |
Mem: 220 106 30 2 83 76 | |
Swap: 2046 178 1868 |
可以看到服务端写自定义监控项的脚本,可以一键同步到所有客户端上,快捷方便。
2、pillar
pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
首先我们查看 master 端 pillars 组件是否在开启状态
查看 /etc/salt/master pillar_ops: True 就代表 pillars 在开启状态,否则我们手动修改。
新的版本默认已经开启,继续下面内容。
查看指定 minion 的 pillar 值:
[root@saltstack ~]# salt 'client1' pillar.items | |
client1: | |
---------- |
服务端自定义配置 pillar
[ | ]|
pillar_roots: | |
base: | |
- /srv/pillar | |
[ | ]|
[ | ]|
conf: /etc/mum.conf | |
myname: primum est | |
[ | ]|
base: | |
'client1': | |
- test |
重启 master
[root@saltstack ~]# systemctl restart salt-master
注意:当更改完 pillar 配置文件后,我们可以通过刷新 pillar 配置来获取新的 pillar 状态:
[root@saltstack ~]# salt '*' saltutil.refresh_pillar | |
client1: | |
True | |
saltstack: | |
True | |
client2: | |
True |
验证:
[root@saltstack ~]# salt 'client1' pillar.items | |
client1: | |
---------- | |
conf: | |
/etc/mum.conf | |
myname: | |
primum est | |
[root@saltstack ~]# salt 'client1' pillar.item myname | |
client1: | |
---------- | |
myname: | |
primum est | |
[root@saltstack ~]# salt 'client1' pillar.item conf | |
client1: | |
---------- | |
conf: | |
/etc/mum.conf |
pillar 同样可以用来作为 salt 的匹配对象。比如:
[root@saltstack ~]# salt -I 'conf:/etc/mum.conf' test.ping | |
client1: | |
True | |
[root@saltstack ~]# salt -I 'conf:/etc/mum.conf' cmd.run 'w' | |
client1: | |
17:19:45 up 7:45, 1 user, load average: 0.05, 0.03, 0.05 | |
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT | |
root pts/1 172.16.0.1 11:14 25.00s 0.68s 0.68s -bash |
另外一种定义 pillar 的方式,也适用于 state
首先编辑 /srv/pillar/ 目录下的 top.sls 文件
[ | ]|
base: | |
'client1': | |
- test | |
- apache |
第一行代表这是我们的入口文件
第二行代表我们要匹配的用户,‘client1’代表 client1 客户端,“*”代表所有用户
第三丶四行代表匹配到的用户可以看到的数据的配置文件的名字
这里我们可以直接写一个名字叫做 apache 的文件进行配置, 也可以写一个包含 init.sls 的目录进行配置。这里采用包含 init.sls 文件的目录的形式的配置方法。
[root@saltstack ~]# cd /srv/pillar/ | |
[root@saltstack pillar]# mkdir apache | |
[root@saltstack pillar]# cd apache/ | |
[root@saltstack apache]# vim init.sls // 添加如下内容 | |
system-type: | |
{% if grains.os == 'CentOS' %} | |
name: Centos-Linux | |
{% else %} | |
name: unknown | |
{% endif %} | |
apache-name: | |
{% if grains.os_family == 'RedHat' %} | |
apache: httpd | |
{% elif grains.os_family == 'Arch' %} | |
apache: apache | |
{% elif grains.os_family == 'Debian' %} | |
apache: apache2 | |
{% endif %} |
{% if grains.os == ‘CentOS’ %} 类似于 django 的模板语言(我们可以采用 python 脚本定义 grains 的数据,但是 pillar 没有。我们可以在 pillar 的 sls 脚本当中调用 grains 的变量,pillar 和 grains 具有同样的功能可以被其他组件调用。)
服务端查看自定义的 pillar 信息
[root@saltstack apache]# salt 'client1' pillar.item apache-name | |
client1: | |
---------- | |
apache-name: | |
---------- | |
apache: | |
httpd | |
[root@saltstack apache]# salt 'client1' pillar.item system-type | |
client1: | |
---------- | |
system-type: | |
---------- | |
name: | |
Centos-Linux |
配置管理安装 Apache
下面进行的演示是远程通过 yum 方式安装 Apache。步骤如下:
修改配置文件
[ | ]|
file_roots: | |
base: | |
- /srv/salt/ |
注意:环境:base、dev(开发环境)、test(测试环境)、prod(生产环境)。
[ | ]|
[ | ]|
base: | |
'client1': | |
- apache |
注意:若换成 ‘*’,则表示在所有的客户端执行 apache 模块。
[root@saltstack ~]# vi /srv/salt/apache.sls | |
apache-service: | |
pkg.installed: | |
- names: // 如果只有一个服务,那么就可以写成 –name: httpd 不用再换一行 | |
- httpd | |
- httpd-devel | |
service.running: | |
- name: httpd | |
- enable: True |
注意:apache-service 是自定义的 id 名。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running 也是一个函数,来保证指定的服务启动,enable 表示开机启动。
重启服务
[root@saltstack ~]# systemctl restart salt-master
执行命令
[root@saltstack ~]# salt 'client1' state.highstate // 执行时间比较长,因为要安装 httpd

如上图所示,说明 Apache 远程安装已成功。
文件目录管理
1、文件管理
服务端配置
编辑 /srv/salt/ 目录下的 top.sls 文件
[ | ]|
base: | |
'client1': | |
- filetest |
新建 filetest.sls 文件
[root@saltstack ~]# vi /srv/salt/filetest.sls | |
file-test: | |
file.managed: | |
- name: /tmp/filetest.txt | |
- source: salt://test/123/1.txt | |
- user: root | |
- group: root | |
- mode: 644 |
注意:第一行的 file-test 为自定的名字,表示该配置段的名字,可以在别的配置段中引用它;source 指定文件从哪里拷贝,这里的 test 目录相当于是 /srv/salt/test 目录;name 指定远程客户端要生成的文件。
新建所要测试的源文件
[ | ]|
[ | ]|
saltstack .... | |
this is a test .... |
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate

客户端验证
[ | ]|
-rw-r--r-- 1 root root 34 4 月 26 10:58 /tmp/filetest.txt | |
[ | ]|
saltstack .... | |
this is a test ... |
2、目录管理
服务端配置
接着编辑 /srv/salt/ 目录下的 top.sls 文件
[ | ]|
base: | |
'client1': | |
- filedir |
新建 filedir.sls 文件
[root@saltstack ~]# vi /srv/salt/filedir.sls | |
file-dir: | |
file.recurse: | |
- name: /tmp/testdir | |
- source: salt://test1/234 | |
- user: root | |
- file_mode: 644 | |
- dir_mode: 755 | |
- mkdir: True | |
- clean: True |
注意:clean: True 源删除文件或目录,目标也会跟着删除,否则不会删除。可以默认设置为 False。
新建所要测试的源目录
[ | ]|
[ | ]|
filedir..........test | |
and add delete select alter |
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate

客户端验证
[ | ]|
总用量 4 | |
-rw-r--r-- 1 root root 50 4 月 26 11:11 2.txt |
测试增删功能
[ | ]|
[ | ]|
[ | ]|
[ | ]
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate

客户端验证
[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 文件
[ | ]|
base: | |
'client1': | |
- cmdtest |
新建 cmdtest.sls 文件
[root@saltstack ~]# vi /srv/salt/cmdtest.sls | |
cmd-test: | |
cmd.run: | |
- onlyif: test -f /tmp/filetest.txt | |
- names: | |
- touch /tmp/cmdtest.txt | |
- mkdir /tmp/cmdtest | |
- user: root |
注意:条件 onlyif 表示若 /tmp/filetest.txt 文件存在,则执行后面的命令;可以使用 unless,两者正好相反。
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate

客户端验证
[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 文件
[ | ]|
base: | |
'client1': | |
- shelltest |
新建 shelltest.sls 文件
[root@saltstack ~]# vi /srv/salt/shelltest.sls | |
shell-test: | |
cmd.script: | |
- source: salt://test/1.sh | |
- user: root |
新建 1.sh 脚本文件
[root@saltstack ~]# vi /srv/salt/test/1.sh | |
#!/bin/sh | |
touch /tmp/shelltest.txt | |
if [-d /tmp/shelltest] | |
then | |
rm -rf /tmp/shelltest | |
else | |
mkdir /tmp/shelltest | |
fi |
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate

客户端验证
[ | ]|
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 文件
[root@saltstack ~]# vi /srv/salt/top.sls // 修改为如下 | |
base: | |
'client1': | |
- apache | |
base: | |
'client1': | |
- filetest | |
base: | |
'client1': | |
- filedir | |
base: | |
'client1': | |
- cmdtest | |
base: | |
'client1': | |
- shelltest | |
base: | |
'client1': | |
- shelltest | |
base: | |
'client1': | |
- crontest |
编辑 crontest.sls 文件
[root@saltstack ~]# vim /srv/salt/crontest.sls | |
cron-test: | |
cron.present: | |
- name: /bin/touch /tmp/111.txt | |
- user: root | |
- minute: '*' | |
- hour: 20 | |
- daymonth: 1-10 | |
- month: '3,5' | |
- dayweek: '*' |
注意,* 需要用单引号引起来。当然我们还可以使用 file.managed 模块来管理 cron,因为系统的 cron 都是以配置文件的形式存在的。
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate

客户端验证
[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 文件
[ | ]|
cron.present 改为 cron.absent |
注意:两者不能共存,要想删除一个 cron,那之前的 present 就得替换掉或者删除掉。
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate

客户端验证
[root@client1 ~]# crontab -l // 可查看到该任务计划已删除 | |
# Lines below here are managed by Salt, do not edit |
一键搭建 rsync 服务
rsync 服务端搭建配置文件介绍
[root@saltstack rsync]# cat rsync_server.sls rsync: ##ID 这个 ID 必须是唯一的名字 user.present: ##user 模块中 present 应用 - fullname: rsync ## 用户名字 - createhome: False ## 不创建家目录 - shell: /sbin/nologin ## 禁止登录 - empty_password: True ## 不需要密码 rsyncd.conf: ##ID file.managed: ##file 模块 - name: /etc/rsyncd.conf ## 客户端文件存放路径 - source: salt://rsync/rsyncd.conf ## 服务端文件路径 - user: root ## 属主 - group: root ## 属组 - mode: 644 ## 权限 backup: file.directory: ##file 模块 - name: /backup ## 创建目录名 - user: rsync - group: rsync - mode: 755 - makedirs: True ## 如果没有自动创建 rsync.password: file.managed: - name: /etc/rsync.password - source: salt://rsync/rsyncd.password - user: root - group: root - mode: 600 daemon: cmd.run: ## 使用 cmd.run 模块 - name: rsync --daemon Boot from open: cmd.run: - name: echo "/usr/bin/rsync --daemon" >>/etc/rc.local
开始部署
服务端配置
编辑 /srv/salt/ 目录下的 top.sls 文件
[ | ]|
base: | |
'client1': | |
- rsync.rsync_server | |
'client2': | |
- rsync.rsync_client |
创建 rsync 服务端搭建配置文件
[root@saltstack ~]# mkdir /srv/salt/rsync | |
[root@saltstack ~]# cd /srv/salt/rsync/ | |
[root@saltstack rsync]# vi rsync_server.sls // 添加下面内容 | |
rsync: | |
user.present: | |
- fullname: rsync | |
- createhome: False | |
- shell: /sbin/nologin | |
- empty_password: True | |
rsyncd.conf: ##ID | |
file.managed: | |
- name: /etc/rsyncd.conf | |
- source: salt://rsync/rsyncd.conf | |
- user: root | |
- group: root | |
- mode: 644 | |
backup: | |
file.directory: | |
- name: /backup | |
- user: rsync | |
- group: rsync | |
- mode: 755 | |
- makedirs: True | |
rsync.password: | |
file.managed: | |
- name: /etc/rsync.password | |
- source: salt://rsync/rsyncd.password | |
- user: root | |
- group: root | |
- mode: 600 | |
daemon: | |
cmd.run: | |
- name: rsync --daemon | |
Boot from open: | |
cmd.run: | |
- name: echo "/usr/bin/rsync --daemon" >>/etc/rc.local |
创建 rsync 客户端搭建配置文件
[root@saltstack rsync]# vi rsync_client.sls // 添加下面内容 | |
rsync.passwd: | |
file.managed: | |
- name: /etc/rsync.password | |
- source: salt://rsync/rsync.password | |
- user: root | |
- group: root | |
- mode: 600 | |
backup: | |
file.directory: | |
- name: /backup | |
- user: root | |
- group: root | |
- mode: 755 | |
- makedirs: True |
创建 rsync 服务配置文件(这里是 rsync 服务的配置文件,上面的是 salt 安装 rsync 服务应用的搭建配置文件)
[ | ]|
uid =rsync | |
gid =rsync | |
use chroot=no | |
max chonnections =200 | |
timeout = 300 | |
pid file =/var/run/rsyncd.pid | |
lock file = /var/run/rsync.lock | |
log file = /var/log/rsyncd.log | |
ignore errors | |
read only = false | |
list = false | |
hosts allow = 172.16.0.0/24 | |
hosts deny = 0.0.0.0/32 | |
auth users = rsync_backup | |
secrets file = /etc/rsync.password | |
[ | ]|
path = /backup | |
[ | ]|
rsync_backup:123456 | |
[ | ]|
123456 | |
[ | ]|
总用量 20 | |
-rw-r--r-- 1 root root 274 4 月 26 15:17 rsync_client.sls | |
-rw-r--r-- 1 root root 376 4 月 26 15:11 rsyncd.conf | |
-rw-r--r-- 1 root root 20 4 月 26 15:15 rsyncd.password | |
-rw-r--r-- 1 root root 7 4 月 26 15:15 rsync.password | |
-rw-r--r-- 1 root root 723 4 月 26 15:16 rsync_server.sls |
验证 rsync 服务是否安装成功
rsync 服务端查看服务是否启动
[root@client1 ~]# ll /etc/rsync.password | |
-rw------- 1 root root 20 4 月 26 15:24 /etc/rsync.password | |
[root@client1 ~]# cat /etc/rsync.password | |
rsync_backup:123456 | |
[root@client1 ~]# ps -ef|grep rsync | |
root 12636 1 0 15:24 ? 00:00:00 rsync --daemon | |
root 12710 2400 0 15:25 pts/0 00:00:00 grep --color=auto rsync |
好极了,我们在 rsync 客户端推送一个文件到服务端是否成功
[root@client2 ~]# cd /backup/ | |
[root@client2 backup]# echo 'this msg from new install rsync client used by test' > test.txt | |
[root@client2 backup]# ls test.txt | |
test.txt | |
[root@client2 backup]# rsync -avz /backup/ rsync_backup@172.16.0.20::backup --password-file=/etc/rsync.password | |
sending incremental file list | |
./ | |
test.txt | |
sent 132 bytes received 30 bytes 324.00 bytes/sec | |
total size is 52 speedup is 0.32 |
貌似推送成功了,快去 rsync 服务端看下吧
[ | ]|
[ | ]|
总用量 4 | |
-rw-r--r-- 1 rsync rsync 52 4 月 26 15:46 test.txt | |
[ | ]|
this msg from new install rsync client used by test |
好的,顺利装完,出去抽支烟和活动下颈椎吧。
Saltstack 常用命令
1、拷贝文件到客户端
[root@saltstack ~]# salt 'client2' cp.get_file salt://apache.sls /tmp/cp.txt | |
client2: | |
/tmp/cp.txt |
客户端查看
[ | ]|
总用量 4 | |
-rw-r--r-- 1 root root 151 4 月 26 14:04 cp.txt |
2、拷贝目录到客户端
[root@saltstack ~]# salt 'client2' cp.get_dir salt://test /tmp | |
client2: | |
- /tmp/test/1.sh | |
- /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、显示存活的客户端
[root@saltstack ~]# salt-run manage.up | |
- client1 | |
- client2 | |
- saltstack |
4、命令下执行服务端的脚本
[root@saltstack ~]# vim /srv/salt/test/shell.sh | |
#! /bin/sh | |
echo "salt server do run shell script on client" > /tmp/shell.txt | |
[root@saltstack ~]# salt 'client2' cmd.script salt://test/shell.sh |

客户端查看
[ | ]|
-rw-r--r-- 1 root root 42 4 月 26 14:20 shell.txt | |
[ | ]|
salt server do run shell script on client |
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147566.htm
