<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Saltstack%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86</id>
	<title>Saltstack文件管理 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Saltstack%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86"/>
	<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Saltstack%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86&amp;action=history"/>
	<updated>2026-04-17T16:09:54Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.linuxsa.org/index.php?title=Saltstack%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86&amp;diff=970&amp;oldid=prev</id>
		<title>Evan：​/* 配置 */</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Saltstack%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86&amp;diff=970&amp;oldid=prev"/>
		<updated>2020-01-16T09:02:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;配置&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;saltstack 文件管理&lt;br /&gt;
SLS（代表SaLt State文件）是Salt State系统的核心&lt;br /&gt;
==Q：问题出现==&lt;br /&gt;
项目有好几台机器要改一下备份脚本，如果一台台上去，真的是烦和累，刚好想到salt ,爽了一把 又有想学好 python的动力了 哈哈&lt;br /&gt;
&lt;br /&gt;
==配置==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Example: 记住 第一行 是 空格二个  二行是4个  三行是6个哦  &lt;br /&gt;
  file_roots:&lt;br /&gt;
    base:&lt;br /&gt;
      - /srv/salt/&lt;br /&gt;
## 首先修改master的配置文件，指定根目录，注意缩进全部使用两个空格来代替Tab（python规范）&lt;br /&gt;
[root@ ~]# vi /etc/salt/master &lt;br /&gt;
file_roots:&lt;br /&gt;
  base:&lt;br /&gt;
    - /srv/salt&lt;br /&gt;
#  dev:&lt;br /&gt;
#    - /srv/salt/dev     &lt;br /&gt;
## 确定指定的目录是否存在，如果不存在，需要手动来创建目录&lt;br /&gt;
&lt;br /&gt;
/srv/salt/base和/srv/salt/failover这些目录是不存在，需要手动创建。这里还需要说明的是下载文件时的搜索顺序。文件服务器在给minions传输文件时，是有搜索顺序的。这里用上述配置说明：如果文件URL为：salt://httpd/httpd.conf。那么传输文件时，首先搜索/srv/salt/base/httpd/httpd.conf，如果找到了，则下载；否则就使用/srv/salt/failover/httpd/httpd.conf&lt;br /&gt;
&lt;br /&gt;
## 重启master服务&lt;br /&gt;
/etc/init.d/salt-master  restart &lt;br /&gt;
&lt;br /&gt;
salt://httpd/httpd.conf表示 /srv/salt/base/httpd/httpf.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A： 解决方案==&lt;br /&gt;
[[Salt-cp]]&lt;br /&gt;
===1、文件传输：===&lt;br /&gt;
&amp;lt;pre&amp;gt;salt自带有cp模块，模块的方法可以用下面的命令查看下&lt;br /&gt;
salt &amp;#039;*&amp;#039; sys.doc | grep &amp;quot;salt &amp;#039;\*&amp;#039; cp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#利用 salt 传输和安装 jdk&lt;br /&gt;
mv   jdk-8u172-linux-x64.rpm /srv/salt/&lt;br /&gt;
salt prod-secret* test.ping &lt;br /&gt;
 salt prod-secret*  cp.get_file salt://jdk-8u172-linux-x64.rpm  /root/jdk-8u172-linux-x64.rpm&lt;br /&gt;
 salt prod-secret* cmd.run &amp;#039;rpm -ivh /root/jdk-8u172-linux-x64.rpm&amp;#039;&lt;br /&gt;
 alt prod-secret* cmd.run &amp;#039;java&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
发送一个文件给客户端： 会自动覆盖原来的文件 这个要小心&lt;br /&gt;
root@ab bakcup]# salt &amp;#039;db&amp;#039; cp.get_file salt://dbbackup.sh /root/dbbackup.sh&lt;br /&gt;
abroad_db2:&lt;br /&gt;
/root/dbbackup.sh&lt;br /&gt;
&lt;br /&gt;
salt的主目录在/srv/salt下面，这个可以在配置文件里设定，我上面就是把/srv/salt/test/dbbackup.sh这个文件推送到客户端去&lt;br /&gt;
&lt;br /&gt;
这样写可能报错哦&lt;br /&gt;
salt ‘abroad_db2’ cp.get_file salt://dbbackup.sh /root/&lt;br /&gt;
&lt;br /&gt;
使用cp.get_file进行文件的分发时时也可以指定是否对分发的文件进行压缩&lt;br /&gt;
 使用gzip的方式进行压缩，数字越大，压缩率就越高，9代表最大的压缩率&lt;br /&gt;
[root@ ~]# salt &amp;#039;db&amp;#039; cp.get_file salt://dbbackup.sh /root/dbbackup.sh gzip=9&lt;br /&gt;
&lt;br /&gt;
当minion上的目标目录不存在时，可以使用makedirs参数来创建目标目录，如下&lt;br /&gt;
[root@ ~]# salt &amp;#039;db&amp;#039; cp.get_file salt://dbbackup.sh /root/dbbackup.sh gzip=9 makedirs=True&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2、文件追加：===&lt;br /&gt;
&amp;lt;pre&amp;gt;使用file模块的append方法：&lt;br /&gt;
&lt;br /&gt;
root@debian:/srv/salt# salt &amp;#039;*&amp;#039; file.append /root/test.sh &amp;quot;adfadf&amp;quot; &lt;br /&gt;
192.168.1.101:&lt;br /&gt;
Wrote 1 lines to “/root/test.sh”&lt;br /&gt;
这样可以轻松把内容添加到文件上去，file还有很多方法，具体可以看看源码&lt;br /&gt;
&lt;br /&gt;
不怕文件零碎，不怕新加了机器你还要为他们单独推送&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===3. 目录传输 cp.get_dir===&lt;br /&gt;
&amp;lt;pre&amp;gt;顾名思义，cp.get_dir就是下载目录，用法基本同cp.get_file一样&lt;br /&gt;
&lt;br /&gt;
将master端的test_dir目录下载到minion端的/root目录下&lt;br /&gt;
[root@vm ~]# salt &amp;#039;*&amp;#039; cp.get_dir salt://test_dir/  /root&lt;br /&gt;
192.168.30.96:&lt;br /&gt;
    - /root/test_dir/a.txt&lt;br /&gt;
    - /root/test_dir/b.txt&lt;br /&gt;
192.168.30.95:&lt;br /&gt;
    - /root/test_dir/a.txt&lt;br /&gt;
    - /root/test_dir/b.txt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===4.cp.push 下载 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;cp.push 模块允许minion上传文件到master端。注意事项：&lt;br /&gt;
&lt;br /&gt;
cp.push功能默认不开启，需要修改配置文件中的file_recv 环境，默认为False&lt;br /&gt;
&lt;br /&gt;
上传的文件存放在master端的 /var/cache/salt/master/minions/&amp;lt;minion_id&amp;gt;/files/ 目录下&lt;br /&gt;
修改master配置文件并重启。&lt;br /&gt;
&lt;br /&gt;
# Allow minions to push files to the master. This is disabled by default, for&lt;br /&gt;
file_recv: True&lt;br /&gt;
&lt;br /&gt;
# It will be interpreted as megabytes. Default: 100&lt;br /&gt;
file_recv_max_size: 400&lt;br /&gt;
&lt;br /&gt;
#从minions 中把 miniontest 文件 下载回master&lt;br /&gt;
[root@vm ~]# salt &amp;#039;192.168.30.95&amp;#039; cp.push /root/miniontest &lt;br /&gt;
192.168.30.95:&lt;br /&gt;
    True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 查看文件&lt;br /&gt;
[root@vm ~]# ls /var/cache/salt/master/minions/192.168.30.95/files/root/miniontest &lt;br /&gt;
/var/cache/salt/master/minions/192.168.30.95/files/root/miniontest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==利用Salt API分发文件==&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In [10]: import salt.client&lt;br /&gt;
&lt;br /&gt;
In [11]: local = salt.client.LocalClient()&lt;br /&gt;
&lt;br /&gt;
In [12]: local.cmd(&amp;#039;*&amp;#039;, &amp;#039;cp.get_file&amp;#039;, [&amp;#039;salt://httpd/httpd.conf&amp;#039;, &amp;#039;/root/aaaaaaa&amp;#039;])&lt;br /&gt;
Out[12]: {&amp;#039;192.168.1.223&amp;#039;: &amp;#039;/root/aaaaaaa&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
最近在写运维管理平台时，要做一个文件分发的功能，因此就用到了Salt的文件服务器以及cp模块来做，再调用下Salt开放的API，达到的效果也是十分理想的。当然，前提是要把文件准备在特定的目录下，这点只要自己做一个规范，也是很好管理的&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 其它 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;salt提供的sls模板来实现下&lt;br /&gt;
先在/srv/salt目录下建立一个入口文件&lt;br /&gt;
root@debian:/srv/salt# cat top.sls&lt;br /&gt;
base:&lt;br /&gt;
&amp;#039;*&amp;#039;:&lt;br /&gt;
- scpfile.mytest&lt;br /&gt;
&lt;br /&gt;
第二行是一个标志&lt;br /&gt;
第三行是指定机器&lt;br /&gt;
&lt;br /&gt;
第四行就是去执行scpfile目录下mytest.sls这个文件&lt;br /&gt;
[root@ab scpfile]# cat mytest.sls&lt;br /&gt;
/root/test.sh:&lt;br /&gt;
file.managed:&lt;br /&gt;
- source: salt://scpfile/test.sh&lt;br /&gt;
- mode: 755&lt;br /&gt;
&lt;br /&gt;
sls文件讲解&lt;br /&gt;
第二行是客户端文件位置&lt;br /&gt;
第三行是salt函数&lt;br /&gt;
第四行是源文件&lt;br /&gt;
第五行是指文件的权限控制&lt;br /&gt;
然后在scpfile目录下新建一个test.sh&lt;br /&gt;
最后我们来推送一下：&lt;br /&gt;
&lt;br /&gt;
#run&lt;br /&gt;
[root@abroad_sdk scpfile]# salt &amp;#039;*&amp;#039; state.highstate -v&lt;br /&gt;
Executing job with jid 20161111165118556055&lt;br /&gt;
——————————————-&lt;br /&gt;
&lt;br /&gt;
abroad_queue:&lt;br /&gt;
———-&lt;br /&gt;
ID: /root/test.sh&lt;br /&gt;
Function: file.managed&lt;br /&gt;
Result: True&lt;br /&gt;
Comment: File /root/test.sh updated&lt;br /&gt;
Started: 16:51:18.969509&lt;br /&gt;
Duration: 14.46 ms&lt;br /&gt;
Changes:&lt;br /&gt;
———-&lt;br /&gt;
diff:&lt;br /&gt;
New file&lt;br /&gt;
mode:&lt;br /&gt;
0755&lt;br /&gt;
&lt;br /&gt;
Summary&lt;br /&gt;
————&lt;br /&gt;
Succeeded: 1 (changed=1)&lt;br /&gt;
Failed: 0&lt;br /&gt;
————&lt;br /&gt;
Total states run: 1&lt;br /&gt;
&lt;br /&gt;
这里开始 是另外一个机器了&lt;br /&gt;
&lt;br /&gt;
追加内容: sed 的好像不成功&lt;br /&gt;
[root@abroad_sdk scpfile]# cat mytest.sls&lt;br /&gt;
/root/test.sh:&lt;br /&gt;
file.managed:&lt;br /&gt;
- source: salt://scpfile/test.sh&lt;br /&gt;
- mode: 755&lt;br /&gt;
/root/test.sh:&lt;br /&gt;
file.append:&lt;br /&gt;
- text:&lt;br /&gt;
- &amp;quot;11111111111111&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sed修改内容：&lt;br /&gt;
&lt;br /&gt;
root@ubuntu:/srv/salt/scpfile# vi my.sls&lt;br /&gt;
- textdd:&lt;br /&gt;
/root/test.sh:&lt;br /&gt;
file.managed:&lt;br /&gt;
- source: salt://scpfile/test.sh&lt;br /&gt;
- mode: 755&lt;br /&gt;
/root/test.sh:&lt;br /&gt;
file.append:&lt;br /&gt;
- text:&lt;br /&gt;
- &amp;quot;11111111111111&amp;quot;&lt;br /&gt;
/root/test.sh:&lt;br /&gt;
file.sed:&lt;br /&gt;
- before: 11111111111111&lt;br /&gt;
- after: 2222&lt;br /&gt;
——————————————————–&lt;br /&gt;
root@ubuntu:/srv/salt/scpfile# salt ‘*’ state.highstate -v&lt;br /&gt;
Executing job with jid 20131031165305244140&lt;br /&gt;
——————————————-&lt;br /&gt;
192.168.1.101:&lt;br /&gt;
———-&lt;br /&gt;
State: – file&lt;br /&gt;
Name: /root/test.sh&lt;br /&gt;
Function: sed&lt;br /&gt;
Result: True&lt;br /&gt;
Comment: sed ran without error&lt;br /&gt;
Changes: diff: —&lt;br /&gt;
+++&lt;br /&gt;
@@ -1,4 +1,4 @@&lt;br /&gt;
adfkdddddd&lt;br /&gt;
ddddddddddd&lt;br /&gt;
ddd&lt;br /&gt;
-11111111111111&lt;br /&gt;
+2222&lt;br /&gt;
&lt;br /&gt;
Summary&lt;br /&gt;
————&lt;br /&gt;
Succeeded: 1&lt;br /&gt;
Failed: 0&lt;br /&gt;
————&lt;br /&gt;
Total: 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==参考==&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/m0_37814112/article/details/80348715 saltstack使用指南：saltstack组件之state状态管理]&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/Freshair_x/article/details/80290562 saltstack salt的state.sls的使用]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://lihuipeng.blog.51cto.com/3064864/1317841&lt;br /&gt;
&lt;br /&gt;
自动化运维神器之saltstack （二）文件服务器&lt;br /&gt;
http://www.ahlinux.com/mainte/9915.html&lt;br /&gt;
&lt;br /&gt;
[http://www.jianshu.com/p/a0677d38bd1f Salt文件服务器与salt-cp以及cp模块]&lt;br /&gt;
[http://732233048.blog.51cto.com/9323668/1640990 saltstack管理六之数据同步方式和常用命令]&lt;br /&gt;
[[category:ops]] [[category:saltstack]]&lt;/div&gt;</summary>
		<author><name>Evan</name></author>
	</entry>
</feed>