Saltstack入门到精通教程(十一):file.managed使用详解

做为配置管理中几乎是使用最频繁的一个函数,这一节我们一起来用实际操作看看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

有了namesource两个参数就可以完整最基本的文件传输功能,例如创建一个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

总结

还有一些参数就没有在这里一一列举了,因为平时用到的机会不多。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值