做为配置管理中几乎是使用最频繁的一个函数,这一节我们一起来用实际操作看看file.managed函数各个常用参数的使用。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
file.managed作用
算是salt.states.file
模块中使用最普遍的一个函数了,功能是将一个文件从master端传递到minion端,使得两边的内容一致。
这个文件的内容可以是某种模板语言,例如jinja,从而使得master端文件维持不变的情况下传递到minion端的文件内容灵活多变。
参数详解
- name
存放在minion端的文件路径,必须是绝对路径。通常这个参数作为了state文件里面的ID。
例如
name: /home/vagrant/test.txt
- source
存放在master端的文件路径,必须是相对于file_roots的路径。file_roots用salt://
来表示,默认情况下的路径为/srv/salt/
。
假如有个文件路径为/srv/salt/files/test.txt
,那么这个参数应该配置为
source: salt://files/test.txt
有了name
和source
两个参数就可以完整最基本的文件传输功能,例如创建一个state文件file_backup_test.sls
如下
/home/vagrant/file_backup_test.txt:
file.managed:
- source: salt://files/file_backup_test.txt
就可以把master端的/srv/salt/files/file_backup_test.txt
同步到minion端的/home/vagrant/file_backup_test.txt
。
- user
设置目标文件的user属性,默认情况下是salt-minion的执行用户root
- group
设置目标文件的group属性,默认情况下是salt-minion的group也是root
windows机器不支持
- mode
类似于chmod
命令,后面接给目标文件设置的rwx属性。默认情况下umask为022,所以新建的文件mode为644。
windows机器不支持
- attrs
类似于chattr
命令,常用的attribute有i
或者a
。需要注意的是设置i
的话表示将文件设置为不可修改,这时候虽然修改成功了,但是会返回失败,如下
------------
Succeeded: 0 (changed=1)
Failed: 1
------------
而且需要注意的是,添加了i
属性以后就不可以修改目标文件了,再去跑state文件就会失败。
windows机器不支持
上面这四个参数主要控制传递到目标minion以后的权限设置问题,例如
/home/vagrant/file_backup_test.txt:
file.managed:
- source: salt://files/file_backup_test.txt
- user: vagrant
- group: vagrant
- mode: 600
上面的state文件将目标文件的权限设置如下
root@minion1:/home/vagrant# ll file_backup_test.txt
-rw------- 1 vagrant vagrant 37 Feb 3 16:15 file_backup_test.txt
- template
被传递的文件可以是用模板语言完成的,例如jinja
。当然,salt支持多种格式语言,不过最常用的还是jinja
。
salt支持cheetah/genshi/jinja/mako/py/wempy
配置管理中,配置文件使用模板是非常常见的操作,尤其是引入变量。然后在文件传递的过程中对变量进行赋值,可以是直接state文件去赋值,也可以是直接用pillar传递给模板。具体的jinja使用方法可以参考我的另一篇博客《Saltstack入门到精通教程(五):Jinja详解》。
- context
用来传递值给模板中的变量,采用字典的方式传递。
- defaults
设置默认值,如果没有在context中传递值给变量的话会采用这里的默认值,同样采用字典的方式传递。
这三个参数对应模板功能,例如上面提到的file_backup_test.txt
文件内容如下
date: {{ salt['cmd.run']('date +"%Y%m%d"') }}
people: {{ salt['pillar.get']('people','hahaha') }}
age: {{ extra }}
这里的pillar数据即使没有下发也会有一个默认值,所以容错性更强。
对应的state文件如下
/home/vagrant/file_backup_test.txt:
file.managed:
- source: salt://files/file_backup_test.txt
- user: vagrant
- group: vagrant
- mode: 600
- template: jinja
- context:
extra: Great
这里的context
变为defaults
也是一样的结果,就不额外演示了。
下发到目标minion以后得到的文件如下
root@minion1:/home/vagrant# ll file_backup_test.txt
-rw------- 1 vagrant vagrant 40 Feb 3 16:47 file_backup_test.txt
root@minion1:/home/vagrant# cat file_backup_test.txt
date: 20200203
people: hahaha
age: Great
- backup
如果要将minion端的文件进行持续保留,按照下面的方法进行设置。默认是不会持续保留的。
backup: minion
保留的文件在配置文件中的cachedir
配置项,默认是/var/cache/salt/minion
,下的file_backup
目录,按照在minion端的目录层次备份。例如minion端的/home/vagrant/test.txt
文件备份的话路径在/var/cache/salt/minion/file_backup/home/vagrant/
。
同时会为每次备份的文件添加上时间戳。
例如刚才的state文件改为
/home/vagrant/file_backup_test.txt:
file.managed:
- source: salt://files/file_backup_test.txt
- user: vagrant
- group: vagrant
- mode: 600
- template: jinja
- context:
extra: Awesome
- backup: minion
会发现执行了几次就备份了几遍
root@minion1:/var/cache/salt/minion/file_backup/home/vagrant# ll
total 40
drwxr-xr-x 2 root root 4096 Feb 3 16:56 ./
drwxr-xr-x 3 root root 4096 Feb 3 11:56 ../
-rw-r--r-- 1 root root 14 Feb 3 11:56 file_backup_test.txt_Mon_Feb_03_11:56:16_268620_2020
-rw-r--r-- 1 root root 29 Feb 3 12:30 file_backup_test.txt_Mon_Feb_03_12:30:43_543078_2020
-rw------- 1 vagrant vagrant 37 Feb 3 16:14 file_backup_test.txt_Mon_Feb_03_16:14:00_796672_2020
-rw------- 1 vagrant vagrant 37 Feb 3 16:15 file_backup_test.txt_Mon_Feb_03_16:15:08_765046_2020
-rw------- 1 vagrant vagrant 37 Feb 3 16:15 file_backup_test.txt_Mon_Feb_03_16:15:29_360138_2020
-rw------- 1 vagrant vagrant 37 Feb 3 16:47 file_backup_test.txt_Mon_Feb_03_16:47:57_684980_2020
-rw------- 1 vagrant vagrant 40 Feb 3 16:55 file_backup_test.txt_Mon_Feb_03_16:55:11_652320_2020
-rw------- 1 vagrant vagrant 44 Feb 3 16:56 file_backup_test.txt_Mon_Feb_03_16:56:12_113965_2020
当然salt也为我们准备好了远程命令去直接操作这些备份,我们待会专门讲。
- show_changes
默认情况下在state的结果展示中会显示对文件的修改详情,例如
Changes:
----------
diff:
---
+++
@@ -1,3 +1,3 @@
date: 20200203
people: hahaha
-age: Great+age: Excellent
如果有的时候修改的内容太多,不想要全部显示就把这个参数设置为False
即可,那么就只会显示如下页面
Changes:
----------
diff:
<show_changes=False>
对备份的操作
上面讲backup
这个参数的时候,我们成功对多个操作进行了文件备份。salt给我们准备了几个远程执行函数来对这些备份进行操作。
列出备份
采用salt.modules.file.list_backups
函数,后面接一个参数为文件的绝对路径,例如
root@saltmaster:/srv/salt/files# salt 'syndic' file.list_backups /home/vagrant/file_backup_test.txt
syndic:
----------
0:
----------
Backup Time:
Mon Feb 03 2020 16:56:12.113965
Location:
/var/cache/salt/minion/file_backup/home/vagrant/file_backup_test.txt_Mon_Feb_03_16:56:12_113965_2020
Size:
44
1:
----------
Backup Time:
Mon Feb 03 2020 16:55:11.652320
Location:
/var/cache/salt/minion/file_backup/home/vagrant/file_backup_test.txt_Mon_Feb_03_16:55:11_652320_2020
Size:
40
2:
----------
Backup Time:
Mon Feb 03 2020 16:47:57.684980
Location:
/var/cache/salt/minion/file_backup/home/vagrant/file_backup_test.txt_Mon_Feb_03_16:47:57_684980_2020
Size:
37
按照时间倒叙排列,注意第一个的序号为0。
恢复备份
备份的目的就是为了在有问题的时候进行回滚操作的,这里采用的是salt.modules.file.restore_backup
函数来操作,接两个参数分别是文件的绝对路径和刚才看到的序号,例如
root@saltmaster:/srv/salt/files# salt 'syndic' file.restore_backup /home/vagrant/file_backup_test.txt 0
syndic:
----------
comment:
Successfully restored /var/cache/salt/minion/file_backup/home/vagrant/file_backup_test.txt_Mon_Feb_03_17:15:43_902054_2020 to /home/vagrant/file_backup_test.txt
result:
True
成功的将目标文件回滚到了最近一次操作的时候,注意两点
- 回滚前的文件也再次被备份了一次,方便撤销回滚
- 回滚文件不涉及任何state文件的执行,所以对于某些采用
watch
来监控文件变化的函数来说需要手动去执行一下
删除备份
备份太多会占据空间,可以通过salt.modules.file.delete_backup
函数来删除,也是接两个参数分别是文件名和序号,例如
root@saltmaster:/srv/salt/files# salt 'syndic' file.delete_backup /home/vagrant/file_backup_test.txt 9
syndic:
----------
comment:
Successfully removed /var/cache/salt/minion/file_backup/home/vagrant/file_backup_test.txt_Mon_Feb_03_11:56:16_268620_2020
result:
True
总结
还有一些参数就没有在这里一一列举了,因为平时用到的机会不多。