puppet自动化运维之file资源

|▌冷眼眸甩不掉的悲伤 提交于 2021-01-07 07:28:42

puppet自动化运维之file资源


作用:

①.支持文件和目录的操作;

②.设置文件及目录的所有者及权限;

③.恢复文件(包括文件的内容、权限及所有者);

④.清理目录以及子目录。

 

格式:

file {"title":                      #一般是文件名

    ensure =>   present|absent|file|directory|link

content =>   "content",   #文件内容(必须有,否则,文件的内容为空)

    user =>   "username",     #用户

    group =>   "groupname",   #用户组

    mode => 权限,       #四位八进制数

    path =>   "title",    #一般和title同名

    source =>   "puppet:///URL",

    #指定到master上文件的绝对路径或agent上本地文件绝对路径

    target => {"源文件或目录"}  #指定目标文件,用于ln -s $target $title

    recurse => true,            #递归

    purge => true,              #将不再资源中管理的其他数据,删除

    force => true;              #如不加,则不会删除

}

 

    注:{},代表里面的内容,为必选的。

 

详解:

   注:cp就使用source,echo就使用content。

content     content => "字符串",

文件的内容(title或path)设置为content 参数后面的字符串, 新行,tab,空格可用 escaped syntax 表示(必须有,否则,文件的内容为空,除非你不需要)


ensure      ensure => {absent|present|file|directory|link},

                    

如果文件本来不存在是否要新建title名的文件:

present,检查该文件是否存在,如果不存在就新建title名的文件,

absent, 文件存在,就会删除title名的文件(如果recurse => true ,就会删除目录)。

            file, 不存在就新建title名的文件

            directory, 不存在就新建title名的目录

            link,target连用,指定目标文件

 

group       group => {gid|组名},

指定那个该文件的用户组,值可以是gid或者组名。


mode        mode => {rwx},

mode用于设置文件的权限(数字)r=4,w=2,x=1。


owner       owner => {用户名},

设置文件的属主


path         path => " 文件的路径",
            
            指定要管理文件的路径,必须用引号引起来, 这也是一个资源的 namevar ,通常path 等于资源的title

source      source => {"puppet:///URL"|"完整的文件路径"},                 

puppet:///开头为从master下载正常路径则在client本地读取

拷贝一个文件覆盖当前文件,用checksum来判断是否有必要进行复制,可以设置的值是一个引用master或agent的完整的文件路径,或者是URI,当前支持的URI只有puppet和file ; 这是一个对文件常用的操作,可以让puppet修改系统的配置文件。

source => "puppet:///modules/ssh/etc/ssh/sshd_config" ,

source => "/etc/passwd",

        注:"puppet://"等价于主配置文件puppet.config中的modulepath值


backup      backup => {|.文件名|false},

                    

文件的内容在被修改前是否进行备份. 利用filebucket对文件进行备份,按文件的md5sum进行归类,便于恢复文件的时候找到文件.可以把文件备份到 puppet 客户端,也可以把文件备份到网络上的其他机器。

backup => "."       puppet会把文件备份在同一目录下,备份文件的扩展名就是 bakcup里面的那个字符串。

            backup => false     该文件不做备份。


recurse     recurse => { true|false|inf|remote},

设置是否以及如何进行递归操作,即可以管理子目录recurse,purge和force连用,用于删除子目录中,不在资源控制的文件或目录)。


purge       purge => {true|false},             

将不再资源中管理的其他数据,则删除。

force       force => {ture|false},

                    force是否可以删除文件或目录,与ignore相反


ignore      ignore => {文件名|正则表达式},

                    当用recursion 方法复制一个目录的时候,可以用ignore来设定过滤条件,符合过滤条件的文件不被复制或删除. 使用ruby自带的匹配法则.因此shell级别的过滤表达式完全支持,例如[a-g]*, 与force相反。


target      target => {"源文件或目录"},

                      是为创建链接文件的,即将target的值,作为源文件,title的值,作为目标文件。如ln -s $target $title。当且仅当ensure => link, 才可以使用


checksum     checksum => {md5|mtime|time|timestamp},

                     检查文件是否被修改,这个状态用来在复制文件的时候使用, 这里有几种检测方式,包括md5 ,mtime,time,timestamp等.默认的检测是用md5

links        link => {follow|manage},
                    

定义操作符合链接文件.文件拷贝的时候,

follow,会拷贝文件的内容,而不是只拷贝符合链接本身,

           manage ,会拷贝符合链接本身。


recurselimit     recurselimit => { 数字},

                递归的深度,设置的值可以匹配/^[0-9]+$/。


replace         replace => {true|false},

                            是否覆盖已经存在的文件。可以设置的值是(true,yes),(false,no)。

 

selrange          文件内容是否属于SElinux哪个组成部分,只适于开启了Selinux的机器。

selrole         文件所属的SeLinux 角色。

seltype         文件所属的Selinux   type。

seluser         文件所属的Selinux user。

sourceselect    选择拷贝目录级别,默认,source是递归的

type            检查文件是否只读。


    注:绿色的,表示常用的;紫色的,表示不常用的。


    file资源在puppet里面用的挺多,属性包括大家已经属性的owner,group,mode,content等等。file还有两个重要的命令,sourcetemplate

    通常,一个文件的内容可以由content属性来包含固定的内容,但是也可以用source命令来从其他url复制文件内容。目前puppet只支持puppet这个url,表示从puppet的fileserver去下载文件内容。例如:

source => "puppet://${fileserver}/lvs/${corp}.${idc}.keepalived.conf   "

 

    其中fileserver后面的lvs表示是lvs模块的files目录这个路径【/etc/puppet/module/lvs/files/】。正如前面提到的一样。用source就可以把很多配置文件放到puppet服务器端统一管理。

    template,可以通过erb模板生成文件内容,erb模板可以使用变量。而且还可以对变量进行计算和操作。

这是puppet强大的地方,举一个例子,你配置两台squid服务器,两台服务器的内存不一样,那么在squid.conf里面有关内存的配置命令就要根据硬件配置来设置。在过去,你只能手工去判定和修改,现在puppet自己搞定。看下面的代码:

vi /etc/puppet/manifest/test.pp

file   {"/etc/squid/squid.conf":

mode => 0644,

content =>   template("squid/squid.conf.erb");

}

 

    这里的template里面的"squid/squid.conf.erb"表示的路径是squid模块下面templates目录下的squid.conf.erb这个路径。看看squid.conf.erb里面的部分内容。

vi   squid.conf.erb

cache_mem <%= Integer(vmx_memsize.to_i*0.45) -%> MB

visible_hostname   <%= fqdn %>

   

    在这里,cache_mem设置成总内存的45%大小,visible_hostname 设置成主机名。更多有趣的功能也可以实现。

       在使用puppet过程中,有时有个类需要使用到多个file 资源. 而这些资源有相同的属性,例如,用户和组相同,权限相同,你还是每次都照样写吗?这里给大家提供一个小的技巧.其实这里我们可以给file 设置默认的属性就不用重复写了大大地简化我们的代码.

例如:

vi /etc/puppet/manifest/test.pp

File {            ##这里的大写,表示默认属性,下面的两个文件,属主和组都会被设置为root且权限为644  

ensure => "present",

owner  =>   "root",  

group  =>   "root",  

mode   => 644;

}

file   {  "/etc/cobbler/modules.conf":

  content =>   template("cobbler/modules.conf"),

}

file {   "/etc/cobbler/dhcp.template":

  content =>   template("cobbler/dhcp.template"),

}

 

其实我们可以再优化下写法,如下:

vi /etc/puppet/manifest/test.pp

File          

ensure => "present",

owner  =>   "root",  

group  =>   "root",  

mode   => 644,

}

file   {  "/etc/cobbler/modules.conf":

  content =>   template("cobbler/modules.conf"),

       "/etc/cobbler/dhcp.template":

content =>   template("cobbler/dhcp.template"),  

}

 

实例:

#软连接

vi /etc/puppet/manifest/test.pp

file {"/tmp/puppet_link.txt":

        ensure =>   link,

        target =>   "/etc/motd";

}

#

[root@client  ~]# puppetd --test --server master.perofu.com

info: Caching catalog for client.perofu.com

info: Applying configuration version '1395062999'

notice:   /Stage[main]//File[/tmp/puppet_link.txt]/ensure: created

notice: Finished catalog run in 0.07 seconds

[root@client  ~]# ll /tmp/

total 8

lrwxrwxrwx 1 root root      9 Mar 17 21:32 puppet_link.txt -> /etc/motd

#目录及管理

file {"/tmp/puppet_dir":

        ensure =>   directory,

        owner =>   root,

        group =>   root,

        recurse =>   true,    #递归管理目录

        purge =>   true,      #将不再当前file资源管理的,均删除

        force =>   true,      #可以删除文件盒目录

        ignore =>   "dir*";   #正则,忽略dir*的

}

#

[root@client  ~]# puppetd --test --server master.perofu.com

info: Caching catalog for client.perofu.com

info: Applying configuration version '1395063252'

notice: /Stage[main]//File[/tmp/puppet_dir]/ensure:   created

notice: Finished catalog run in 0.14 seconds


[root@client  ~]# touch /tmp/puppet_dir/aaa

[root@client  ~]# touch /tmp/puppet_dir/dir1

[root@client  ~]#

[root@client  ~]# puppetd --test --server master.perofu.com

info: Caching catalog for client.perofu.com

info: Applying configuration version '1395063252'

info: FileBucket adding /tmp/puppet_dir/aaa as   {md5}d41d8cd98f00b204e9800998ecf8427e

info: /File[/tmp/puppet_dir/aaa]: Filebucketed   /tmp/puppet_dir/aaa to puppet with sum d41d8cd98f00b204e9800998ecf8427e

notice: /File[/tmp/puppet_dir/aaa]/ensure: removed

notice: Finished catalog run in 0.12 seconds

 

[root@client  ~]# ll /tmp/puppet_dir/     

total 0

-rw-r--r-- 1 root root 0 Mar 17 21:36 dir1

# sourcetemplate

 后面会有详解。

 

 

    至此,puppet的file资源就结束了,接下来的是package资源的学习,请听下回分解!!!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!