简述
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 (客户端)
查看版本和内核
[root@saltstack ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) [root@saltstack ~]# uname -rm 3.10.0-514.6.1.el7.x86_64 x86_64
分别设置 hostname,设置完毕xshell注销重新连接一下
[root@saltstack ~]# hostnamectl set-hostname saltstack [root@client1 ~]# hostnamectl set-hostname client1 [root@client2 ~]# hostnamectl set-hostname client2
编辑 hosts 文件
每台都设置,若机器太多,可以通过搭建 DNS,则不用在每台机器上设置这个
[root@saltstack ~]# vi /etc/hosts 添加下面内容 172.16.0.19 saltstack 172.16.0.20 client1 172.16.0.21 client2
开始安装
分别为三台机器添加阿里云epel源
[root@saltstack ~]# mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup [root@saltstack ~]# mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup [root@saltstack ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
服务端安装
[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
[root@client1 ~]# vi /etc/salt/minion +78 id: client1 [root@client2 ~]# vi /etc/salt/minion +78 id: client2
启动saltstack服务
服务端
[root@saltstack ~]# systemctl enable salt-master [root@saltstack ~]# systemctl enable salt-minion [root@saltstack ~]# systemctl start salt-master [root@saltstack ~]# systemctl start salt-minion
客户端
[root@client1 ~]# systemctl enable salt-minion [root@client1 ~]# systemctl start salt-minion
配置认证
服务端操作
[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服务
[root@client1 ~]# systemctl restart salt-minion [root@client2 ~]# systemctl restart salt-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脚本
[root@saltstack ~]# mkdir /srv/salt/_grains [root@saltstack ~]# cd /srv/salt/_grains/ [root@saltstack _grains]# vi mytest.py // 添加下面内容 #!/usr/bin/env python # _*_ coding:utf-8 _*_ 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
[root@saltstack ~]# vi /etc/salt/master +529 // 找到如下内容,去掉#号 pillar_roots: base: - /srv/pillar [root@saltstack ~]# mkdir /srv/pillar [root@saltstack ~]# vi /srv/pillar/test.sls // 自定义配置文件,内容如下 conf: /etc/mum.conf myname: primum est [root@saltstack ~]# vi /srv/pillar/top.sls // 总入口文件,内容如下 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 文件
[root@saltstack ~]# vi /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。步骤如下:
修改配置文件
[root@saltstack ~]# vi /etc/salt/master +406 // 打开如下内容的注释 file_roots: base: - /srv/salt/
注意:环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。
[root@saltstack ~]# mkdir /srv/salt [root@saltstack ~]# vi /srv/salt/top.sls 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 文件
[root@saltstack ~]# vi /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指定远程客户端要生成的文件。
新建所要测试的源文件
[root@saltstack ~]# mkdir -p /srv/salt/test/123 [root@saltstack ~]# vim /srv/salt/test/123/1.txt saltstack .... this is a test ....
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate
客户端验证
[root@client1 ~]# ll /tmp/filetest.txt -rw-r--r-- 1 root root 34 4月 26 10:58 /tmp/filetest.txt [root@client1 ~]# cat /tmp/filetest.txt saltstack .... this is a test ...
2、目录管理
服务端配置
接着编辑/srv/salt/目录下的top.sls 文件
[root@saltstack ~]# vi /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。
新建所要测试的源目录
[root@saltstack ~]# mkdir -p /srv/salt/test1/234/ [root@saltstack ~]# vi /srv/salt/test1/234/2.txt filedir..........test and add delete select alter
执行命令:
[root@saltstack ~]# salt 'client1' state.highstate
客户端验证
[root@client1 ~]# ll /tmp/testdir/ 总用量 4 -rw-r--r-- 1 root root 50 4月 26 11:11 2.txt
测试增删功能
[root@saltstack ~]# mkdir /srv/salt/test1/234/mydir [root@saltstack ~]# touch /srv/salt/test1/234/mydir/111.txt [root@saltstack ~]# touch /srv/salt/test1/234/testdir.add [root@saltstack ~]# rm -rf /srv/salt/test1/234/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 文件
[root@saltstack ~]# vi /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 文件
[root@saltstack ~]# vi /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
客户端验证
[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 文件
[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
[root@saltstack ~]# vim /srv/salt/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 文件
[root@saltstack ~]# vi /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服务应用的搭建配置文件)
[root@saltstack rsync]# vi rsyncd.conf // 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 [backup] path = /backup [root@saltstack rsync]# vi rsyncd.password // 服务端密码文件 rsync_backup:123456 [root@saltstack rsync]# vi rsync.password // 客户端密码文件 123456 [root@saltstack rsync]# ll 总用量 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服务端看下吧
[root@client1 ~]# cd /backup/ [root@client1 backup]# ll 总用量 4 -rw-r--r-- 1 rsync rsync 52 4月 26 15:46 test.txt [root@client1 backup]# cat 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
客户端查看
[root@client2 ~]# ll /tmp 总用量 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
客户端查看
[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
文档参考
https://docs.saltstack.com/en... 官网
http://docs.saltstack.cn/ref/... 中文官网