有时候项目上线,需要将本地或者跳板机上的发布版本发布到服务器上,如果服务器数量少,可以一台一台手动拷贝,一旦遇到数量成百上千的服务器,手动拷贝就满足不了需求,那有什么好点的方法呢?

前不久在看saltstack,其中有个模块个人觉得相当不错,那就是file.recurse方法,运用该模块可以将定义的目录下所有文件都推送到远端服务器指定的位置,而且只需要一条命令,接下来我们就演示一下该方法的用法。

saltstack配置文件中修改file_roots路径:

[root@server01 base]# grep "file_roots" -A3 -B3 /etc/salt/master |grep -vE "(^#|^$)"
--
file_roots:
  base:
    - /srv/salt/base
--
[root@server01 base]# 
[root@server01 base]# cd /srv/salt/base
[root@server01 base]# pwd
/srv/salt/base
[root@server01 base]# 
[root@server01 base]# vim file_rsync.sls 
file_rsync:   
   file.recurse:   
     - source: salt://tools  
     - name: /opt/tools   
     - user: root   
     - group: root   
     - dir_mode: 755   
     - file_mode: 644   
     - makedirs: True   
     - backup: minion   
     - include_enpty: True
[root@server01 base]#


注释:

file_rsync:sls文件名,这里是file_rsync.sls
file.recurse:调用file模块下的recurse方法
source:  salt://tools :定义源文件,即将要推送走的文件和路径
name:  /opt/tools:推送到远端服务器上的位置和名称
user:  root:文件(目录)的属主
group:  root:文件(目录)的用户组
dir_mode:  755 目录的权限为755
file_mode:  644 文件的权限为644
makedirs:  True 如果目录不存在则创建
backup:  minion 开启备份
include_enpty: True 包含空文件(目录)
执行命令:salt 对象 state.sls sls文件


[root@server01 base]# salt '*' state.sls file_rsync
...............................省略部分..............................
Summary
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
[root@server01 base]#
[root@server01 base]# salt '*' cmd.run 'ls -al /opt/'
server03:
    total 0
    d---------   3 root root  19 Aug 23 01:57 .
    dr-xr-xr-x. 18 root root 256 Jun 14 04:04 ..
    drwxr-xr-x   6 root root 246 Aug 23 02:22 tools
server02:
    total 0
    d---------   3 root root  19 Aug 23 01:57 .
    dr-xr-xr-x. 18 root root 256 Jun 14 04:03 ..
    drwxr-xr-x   6 root root 246 Aug 23 02:22 tools
server04:
    total 0
    drwxr-xr-x.  3 root root  19 Aug 23 01:57 .
    dr-xr-xr-x. 18 root root 256 Aug 16 03:28 ..
    drwxr-xr-x   6 root root 246 Aug 23 02:22 tools
[root@server01 base]#


从这里发现目录tools已经推送到客户端服务器上。