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还有两个重要的命令,source和template。
通常,一个文件的内容可以由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 # source和template 后面会有详解。
|
至此,puppet的file资源就结束了,接下来的是package资源的学习,请听下回分解!!!
来源:oschina
链接:https://my.oschina.net/u/727880/blog/226098