saltstack之Salt⽂件服务器与salt-cp以及cp模块
在配置管理系统中,从中⼼服务器向客户端推送⽂件是基本需求。SaltStack使⽤内建的ZeroMQ服务器作为⽂件服务器。⽂件服务器主要⽤于在state系统中将SLS⽂件推送到客户端,当然也可以⽤于其他⽂件的传输。
  运维⼯作中,经常会有⽂件同步的情况。我在⽇常⼯作中,由于权限限制,只能⾃⼰写程序分发⽂件。我使⽤的是
Python+paramiko+threading+Queue,paramiko⽤于远程执⾏命令或者分发⽂件,threading+Queue实现并发分发⽂件(如果是串⾏的话,效率⼗分低下)。最近研究SaltStack时,发现有两种⽅法可以做到⽂件分发,第⼀只是使⽤SaltStack命令:salt-cp;第⼆种是使⽤SaltStack提供的:Salt⽂件服务器,这两种⽅法都可以实现⽂件分发的功能。
参考官⽹⽂档:docs.saltstack/en/latest/ref/cli/salt-cp.html
⼀、 salt-cp 
1. salt-cp简述
  salt-cp命令⽤于复制⼀个⽂件到多个minion系统中。指定minion可以使⽤通配符、正则表达式、Grains等⽅法
salt-cp '*' [ options ] SOURCE DEST
salt-cp -E '.*' [ options ] SOURCE DEST
salt-cp -G 'os:CentOS*' [ options ] SOURCE DEST
minion匹配
  -E ⽬标选择;表⽰以正则表达式匹配minion
  -G ⽬标选择表⽰使⽤minion上的Salt Graings系统的返回值来匹配特定minion
  -L ⽬标minion别解析成⽤逗号分隔的列表
2. salt-cp ⽤例
将irq.py ⽂件发送到 OS为CentOS的minion的 /usr/local⽬录下
salt-cp -G ‘os:centos’ irq.py /usr/local/
返回值:{‘192.168.1.223’: {‘/usr/local/irq.py’: True}} 表⽰成功
将salt.doc⽂件发送到所有的minion的/usr/local⽬录下
salt-cp ‘*’ salt.doc /usr/local/
返回值:{‘192.168.1.223’: {‘/usr/local/salt.doc’: True}} 表⽰成功
salt-cp -L ‘192.168.1.223’ install.log /usr/local/
返回{‘192.168.1.223’: {‘/usr/local/install.log’: True}} 表⽰成功
⼆、Salt ⽂件服务器
  Salt内置了⼀个简单的⽂件服务器⽤于分发⽂件给Salt minions。
1. ⽂件服务器的base环境
  由于⽂件服务器是为Salt state system⼯作的,所以⽂件服务器也是⽀持环境的概念的。
  Salt⽂件服务器/etc/salt/master配置⽂件中的flie_roots选项管理。Salt⽂件服务器的默认环境为为bas
e环境,base环境必须定义,因为当环境没有明确指定时,⽂件下载就是从base环境中去的。其配置如下:
file_roots:
base:
- /srv/salt/base
- /srv/salt/failover
/srv/salt/base和/srv/salt/failover这些⽬录是不存在,需要⼿动创建。这⾥还需要说明的是下载⽂件时的搜索顺序。⽂件服务器在给minions传输⽂件时,是有搜索顺序的。这⾥⽤上述配置说明:如果⽂件URL为:salt://f。那么传输⽂件时,⾸先搜
索/srv/salt/base/f,如果到了,则下载;否则就使⽤/srv/salt/failover/f
2. ⽂件服务器多环境配置
  多环境配置也是更改master配置达成,如下:
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
- /srv/salt/base
prod:
- /srv/salt/prod
- /srv/salt/base
在这个配置中,处了base环。还有dev环境和prod环境。配置⽂件修改后,需要重启master才能⽣效。
3. cp模块
  cp模块被⽤于⽤于Salt state system、salt-cp命令(如上所述)以及可⽤于Salt⽂件服务器。
3._fle
  cp.get_file⽤于minion从master下载⼀个⽂件,语法:
⽂件在base环境下
salt ‘*’ cp.get_file salt://testfile /root/testfile
该命令表⽰minion从master端下载⽂件并拷贝到到/root/testfile⽂件中。注意:salt://表⽰的base环境。因此,testfille是位于base环境下——即/srv/salt/base⽬录中。
⽂件在base环境的多级⽬录下
salt ‘*’ cp.get_file salt://f /f
salt://f表⽰* /srv/salt/base/f*
实例
[root@master httpd]# salt '*' cp.get_file salt://f /root
192.168.1.223:
The minion function caused an exception: Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/salt/minion.py", line 1412, in _thread_return
return_data = ute()
File "/usr/lib/python2.6/site-packages/salt/executors/direct_call.py", line 28, in execute
return self.func(*self.args, **self.kwargs)
File "/usr/lib/python2.6/site-packages/salt/modules/cp.py", line 227, in get_file
gzip)
File "/usr/lib/python2.6/site-packages/salt/fileclient.py", line 1112, in get_file
fn_ = salt.utils.fopen(dest, 'wb+')
File "/usr/lib/python2.6/site-packages/salt/utils/__init__.py", line 1288, in fopen
fhandle = open(*args, **kwargs)
IOError: [Errno 21] Is a directory: '/root'
[root@master httpd]# salt '*' cp.get_file salt://f /f
192.168.1.223:
/f
这⾥注意下,根据报错可以发现:⽬标路径必须是⼀个⽂件,⽽不是⽬录。这点有区别去salt-cp命令。
- cp.get_file gzip格式
  对于⼤⽂件传输,cp.get_file⽀持gzip压缩格式。因为gzip是CPU密集型的⼯具,因此cp.get_file开启gzip是适⽤于⾼压缩率的情况下,如JSON或者YAML⽂件。
  语法:
salt ‘*’ cp.get_file salt://f /f gzip=5
cp复制文件到指定目录下gzip后的数字表⽰压缩⽐,范围在1-9之间,1表⽰最⼩压缩⽐,9为最⼤压缩⽐。换句话说,gzip=1情况下,消耗的CPU⼩;gzip=9时,消耗的CPU则更多。
<_file makedirs=True
   注意,也就是时候,cp.get_file过程中,如果⽬录不存在,cp.get_file是不会主动创建⽬录的,如果要做到这点,可以使⽤makedirs=True 参数。测试如下:
[root@master httpd]# salt '*' cp.get_file salt://f /root/f
192.168.1.223:
False
[root@master httpd]# salt '*' cp.get_file salt://f /root/f makedirs=True
192.168.1.223:
/root/f
3._dir
  顾名思义,cp.get_dir就是下载⽬录,⽤法基本同cp.get_file⼀直。直接举个例⼦吧
将master端的httpd⽬录下载到minion端的/root⽬录下
[root@master ~]# salt '*' cp.get_dir salt://httpd /root
192.168.1.223:
- /root/f
3.3 cp.push
  cp.push 模块允许minion上传⽂件到master端。注意事项:
- cp.push功能默认不开启,需要修改配置⽂件中的file_recv 环境,默认为False
- 上传的⽂件存放在master端的 /var/cache/salt/master/minions//files/ ⽬录下
修改master配置⽂件并重启。
file_recv: True
以上传f为例
[root@logan ~]# salt '192.168.159.241' cp.push /etc/httpd/f
192.168.159.241:
True
# 查看⽂件
[root@logan conf]# pwd
/var/cache/salt/master/minions/192.168.159.241/files/etc/httpd/conf
[root@logan conf]# ls
三、利⽤Salt API分发⽂件
In [10]: import salt.client
In [11]: local = salt.client.LocalClient()
In [12]: d('*', 'cp.get_file', ['salt://f', '/root/aaaaaaa'])
Out[12]: {'192.168.1.223': '/root/aaaaaaa'}
写运维管理平台时,要做⼀个⽂件分发的功能,因此就⽤到了Salt的⽂件服务器以及cp模块来做,再调⽤下Salt开放的API,达到的效果也是⼗分理想的。当然,前提是要把⽂件准备在特定的⽬录下,这点只要⾃⼰做⼀个规范,也是很好管理的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。