本文转载自朱双印个人日志:https://www.zsythink.net/archives/363
这篇文章总结了puppet的常用资源,以及其属性的使用方法。
在之前,我们已经总结了puppet资源的概念,属性的概念,以及怎样定义一个资源,那么现在,我们将常用的资源以及其常用属性总结一下,
但是此处不对资源之间的依赖关系以及执行顺序进行总结,我们会在以后的文章中,单独对依赖关系进行总结,此篇文章只对常用资源的常用属性进行总结,
如果想要查阅对应资源的所有属性,可以使用如下命令查询。
puppet describe ResourceType
比如,如果想要查询user资源的所有属性以及属性用法,可以使用如下命令查询。
puppet describe user
我们还是从user类型的资源开始总结,你是不是都着急了,老是说user,没完了还,别着急,一个一个聊。
user资源
user资源就是用来管理目标服务器上的用户的,比如创建用户、修改用户、删除用户,user资源的常用属性如下:
user{'liuyuan':
ensure => present,
uid => 1003,
gid => 1003,
groups => [liuhaoran],
managehome => true,
shell => '/bin/bash',
password => '$1$iD5Dxxxxxxxxxxxxxxxxxxxxxxxxx',
comment => 'www.hello.net',
}
上图中属性前带有”#”的表示已经注释,在执行清单时,被注释的属性不会被执行,user资源各属性解释如下:
name属性 | 表示对应用户的用户名称,可省。 |
---|---|
ensure属性 | 确定用户的目标状态,通常将其值设置为present或absent,分别表示用户必须存在或用户必须不能存在,当然,如果我们将ensure值指定为absent以后,就没有必要在指定其他属性了,一般ensure为present时,配置其他属性值,如果ensure的值为present,但是当前用户已经存在,此时,puppet会判断已经存在的用户与我们定义的用户资源的其他属性是否一致,如果不一致,puppet则会做出对应操作,使目标服务器上已经存在的用户与我们定义的资源的属性保持一致,所以,absent可以理解为删除用户,present在不同的场景中,可以理解为创建用户或者修改用户,或者这样理解,present的作用就是保证用户必须存在,并且与我们定义的资源的状态完全一致,其他资源的此属性也都类似。 |
uid属性 | 指定用户的uid。 |
gid属性 | 指定用户的gid,也就是说,指明用户的主组,如果指定此属性,gid对应的组必须实现存在,否则会报错。 |
groups属性 | 指定用户的附属组,可以同时指定多个附属组,同理,对应附属组必须事先存在,而且需要注意,此属性中不能包含用户的基本组,也就是说不能包含gid对应的组名,指定附属组时,必须使用组名指定,不能使用对应组的gid,上图示例中,为liuyuan用户指定了一个附属组,为liuhaoran组,当属性可以指定多个值时,可以使用”[ ]”将多个属性值括起,每个属性值之间同样需要逗号隔开,我们可以把”[ ]”理解成列表。 |
home属性 | 指定用户的家目录,使用此属性时需要注意,虽然puppet在创建用户或者修改用户时会按照home属性的值指定用户的家目录,但是对应的家目录puppet不会为我们自动创建,即使没有使用home属性,puppet为我们创建用户时,也不会创建对应的家目录,如果想要puppet能在创建用户时为我们自动创建用户的家目录,并且将对应的配置文件填充到用户家目录中,需要使用managehome属性。 |
managehome属性 | 表示puppet是否管理用户的家目录,在创建用户时,如果不添加此属性,用户对应的家目录不会被创建,可能会造成用户登录后没有家目录或者shell不可用的情况。 |
shell属性 | 指定用户的默认登录shell类型。 |
password属性 | 指定用户的密码,注意,这个密码是使用单向加密算法加密过的密码,不是明文密码,上图中使用的加密算法是sha512,由于密码过长,截图没有截全,所以password最后的”,”没有被截图截入,如果你的密码使用md5的方式加密,可以使用”grub-md5-crypt”命令生成加密后的密码,如果你的密码使用sha256的方式加密,可以使用类似如下命令生成:perl -e ‘print crypt(“password”, q($6$salt$)), “ ”;’ |
comment属性 | 使用此属性设置用户的描述信息,”liuyuan”这个用户的注释信息表示”朱双印博客的地址是www.hello.net”。 |
system属性 | 是否指定用户为系统用户,当显示指定system属性并且设置为true时,则为系统用户。 |
group资源
group资源的作用就是用来管理目标服务器上的组的,group资源的常用属性如下:
group{"pengyuyan":
ensure => present,
gid => 666,
system => false,
}
group资源各属性解释如下:
name属性 | 表示组对应的名称,可省。 |
---|---|
ensure属性 | 确定组的目标状态,通常将其值设置为present或absent,absent表示组必须不能存在,可以理解为删除组,present表示组必须存在,并且目标状态与我们定义的相同,如果不同,puppet会执行对应动作,直到最终一致。 |
gid属性 | 组ID号 |
system属性 | 指定当前组是否为系统组,默认为false,当显示指定system属性并且设置为true时,则为系统组。 |
cron资源
cron资源的作用就是管理目标服务器上的定时任务的,作用相当于crontab命令,cron资源的常用属性如下:
package{'lycron':
#name => nginx,
#ensure => absent,
command => '/bin/cat/ /testdir/test.sh >> /testdir/hello.net',
user => root,
minute => '*/1',
}
cron资源各属性解释如下:
name属性 | 表示组对应crontab任务的名称,可省。 |
---|---|
ensure属性 | 表示创建或删除定时任务,可省,省略ensure时,默认值为present,通常将其值设置为present或absent,present表示对应定时任务必须存在且与定义状态完全一致,absent表示对应定时任务不能存在。 |
command属性 | 指定定时任务需要执行的命令。 |
user属性 | 指定当前定时任务是为哪个用户设定的。 |
minute属性 | 指定定时任务的分钟时间格式,上图示例中,”/1″表示每1分钟,省略不写默认为””。 |
hour属性 | 指定定时任务的小时时间格式,省略不写默认为”*”。 |
monthday属性 | 指定定时任务的日时间格式,省略不写默认为”*”。 |
month属性 | 指定定时任务的月时间格式,省略不写默认为”*”。 |
weekday属性 | 指定定时任务的星期时间格式,省略不写默认为”*”。 |
package资源
package资源的作用就是管理目标服务器上的程序包,package资源的常用属性如下:
package{"tree":
ensure => installed,
#provider => rpm,
#source => '/testdir/tree-1.5.3-3.3l6.x86_64.rpm',
}
name属性 | 表示对应安装包的名称,可省,省略后与资源title值相同,但是需要注意:不同系统平台或者不同的系统发行版中,同一个软件的名称可能不同,比如,centos中,apache的http server被称为Httpd,而在ubuntu中,apache的http server被称为Apache2 ,所以,如果不同的被管理服务器中需要的安装包的名称不同,我们往往需要判断操作系统版本,然后给出不同的package名称,这与我们之前说的”中间层、资源抽象层、provider提供者”等概念并不冲突,不要把它们搞混了。 |
---|---|
ensure属性 | ensure的值对于package资源来说,相对丰富一点,可以使用absent、present、installed、latest, 其中,absent表示卸载,present和installed都表示安装,没有什么区别,latest表示安装能够获取到的最新的版本。 |
source属性 | 指定安装包文件,如果被管理服务器上存在类似yum源这样的provider(提供者),则可以省略此属性,省略此属性后,yum源会按照name属性或title的名称自动安装对应的package,如果对应被管理服务器上没有类似yum源这样的提供者,或者说,当被管理服务器上没有能够支持自动下载安装软件的提供者时,那么source属性则是必须的,比如使用rpm包安装对应软件,那么我们则必须通过source属性指明rpm包的路径,同时需要注意,对于package资源来说,puppet默认使用yum作为redhat/centos系统的提供者,所以,在使用source属性指定rpm包的同时,还需要使用provider属性,指定使用rpm作为本次操作的提供者。 |
provider属性 | 当puppet默认的provider不符合我们的实际使用场景时,可以指定使用哪种provider,通常在一个操作系统下有多个提供者的情况下,可以使用此属性指明使用哪个提供者。 |
从上例中可以看出,我将provider属性与source属性都注释了,没错,上例中使用的是yum的方式安装的tree软件包,
如果被管理服务器上并没有yum源,你又想要使用rpm包的方式安装tree包,那么provider与source属性都是不可省的。
service资源
service资源的作用就是启动或停止目标服务器上的服务,service资源的常用属性如下:
service{'nginx':
ensure => running,
enable => true,
start => '/usr/sbin/nginx',
restart => '/usr/sbin/nginx -t && /usr/sbin/nginx -s reload',
}
enable属性 | 此属性用于设置对应服务是否开机自动启动服务,此属性设置为true表示开机自动启动服务,false表示不会开机自启。 |
---|---|
ensure属性 | 表示对应服务的当前状态,不要与enable搞混了,enable属性是设置服务是否开机自启的,而ensure是设置当前服务是否处于启动状态,对于service资源来说,ensure属性的值可以设置为running或true,表示启动对应服务,也可以设置为stopped或false,表示停止对应服务。 |
hasrestart属性 | 表示标明当前服务是否支持restart命令,设置为true表示支持restart,false表示不支持restart,如果不支持restart命令,那么要重启服务时,则会先stop服务,再start服务。 |
hasstatus属性 | 表示标明当前服务是否支持status命令。 |
path属性 | 服务对应的init脚本文件的路径,对于centos来说,默认路径为/etc/rc.d/init.d,当然,centos7则无需此属性,因为centos7中使用unit,而不在使用脚本。 |
start属性 | 用户手动指定服务对应的启动命令。 |
restart属性 | 用户手动指定的restart操作对应的命令,但是为了保险起见,通常会将此属性对应的命令设置为reload,而非restart。 |
file资源
file资源的功能比较丰富,它可以用来管理文件的内容、属主属组以及文件的权限,同时可以用它管理目录、链接文件,file资源常用属性示例如下,各属性的具体解释查看图下的表格 。
#创建一个文件,被创建的文件为/testdir/lhrfile,文件内容为content属性对应的值
file{"lhrfile":
path => '/testdir/lhrfile',
ensure => file,
content => "www.lhrthink.net
",
}
#复制/etc/fstab文件中的内容到/testdir/lhrfile1文件中,
#并且设置lhrfile1文件的数珠属组均为lhrfile1,文件权限为600
file{"/testdir/lhrfile1":
ensure => present,
source => '/etc/fstab',
owner => liuhaoran,
group => liuhaoran,
mode => 0600,
}
#复制/testdir/abc目录下的所有内容到/testdir/dir下
file{"/testdir/dir":
ensure => directory,
source => "/testdir/abc",
recurse => true,
}
#注意:file资源不会自动创建父目录,上述三个例子中,/testdir目录已经事先存在
#使用如下方法,可以手动的一次将目录的父目录创建出来,但是这种方法比较笨拙。
#下例中,使用了”[]“中的内容作为title,表示按照顺序创建多个目录。
#也可以不使用如下方法,而是借助exec资源完成
file{["/testdir/www",
"/testdir/www/lhrthink",
"/testdir/www/lhrthink/net",
]:
ensure => directory,
}
#删除对应的目录,以及目录中的所有内容。
file{"/testdir/dd":
ensure => absent,
force => true,
}
#创建一个链接文件/testdir/lhrthink,链接指向/etc/fstab文件
file{"/testdir/lhrthink":
ensure => link,
target => '/etc/fstab',
}
path属性 | 通过此属性指定file资源所在路径,还记得其它资源中的name属性吗,在其他资源中,name属性往往是可省的,因为name属性是大多数资源的”名称变量”(namevar),其他资源中,name属性省略后,资源的名称与资源的title相同,而在file资源中,path属性才是file资源的”名称变量”(namevar),当我们省略path属性时,path属性对应的值与file资源的title相同,所以,如果省略path属性,file资源的title则必须为文件的路径,当然,如果不想将file资源的title设置为file的路径,则不能省略path属性。 |
---|---|
ensure属性 | 我们说过,file资源可以管理文件、目录、软连接,那么,当前file资源到底是用来管理文件的呢,还是管理目录的呢,我们可以使用ensure属性,定义当前file资源的类型,ensure的值可以为present、absent、file、directory、link,当ensure的值为file时,file资源代表一个文件,当ensure的值为directory时,file资源代表一个目录,当ensure的值为link时,file资源代表一个软连接,当ensure的值为absent时,表示要删除对应的资源,当ensure的值为present时,与ensure的值为file时相同。注意:file资源不会自动创建父目录,也就是说,不管file资源代表一个文件,还是代表一个目录,如果指定的path或者title中包含不存在的目录,那么puppet则会报错,提示没有对应的父目录,有两种办法可以解决,手动指明创建对应父目录或者使用exec资源调用对应命令创建父目录(参考exec资源)。 |
content属性 | 当ensure属性的值为file时,使用此属性可以指定文件的内容,将要写入文件的内容使用引号引起即可,也可以将指定内容替换为变量的值,这在实际演示中会用到,到时候我们再进行总结,注意,此属性与将要提到的source属性不能同时存在于同一个资源中。 |
source属性 | 当ensure属性的值为file时,使用此属性可以指定当前文件的内容从哪个文件中获取,可以理解为把某个文件的内容覆盖到当前文件,或者理解为复制文件也是可以的,使用source属性,还可以通过指定的puppet url远程复制文件,但是这是后话,实际应用时再演示,source属性与content属性本质上都是设置文件内容的,它们不能同时存在于同一个资源中。当ensure属性的值为directory时,使用source属性指定另一个目录,则表示复制另一个目录,但是需要注意,当ensure为directory时,使用source属性的同时,需要配合recurse属性,否则被复制目录中的子目录或者文件将不会被同时复制过来。 |
recurse属性 | 此属性用于设置被操作源目录是否被递归,当ensure属性的值为directory时,同时source属性对应的值为一个目录,那么需要将recurse属性设置为true,被复制目录中的子目录和文件才能被复制到当前目录中,注意,recurse属性只有在配合source属性时才会递归的复制目录,如果ensure属性设置为directory,但是没有配合source属性,即使将recurse属性设置为true,puppet仍然不会执行递归操作。注意:file资源不会自动创建父目录,也就是说,不管file资源代表一个文件,还是代表一个目录,如果指定的path或者title中包含不存在的目录,那么puppet则会报错,提示没有对应的父目录,当ensure的值设置为directory时,如果没有指定source属性,那么则表示当前操作不是复制目录,而是创建目录,这个时候,如果path或这title对应的目录中包含不存在的目录,即使将recurse属性设置为true,不存在的父目录也不会被自动创建。 |
force属性 | 当ensure属性的值为absent时,同时file资源对应的path或者title为一个目录(非文件),那么则必须将force属性设置为true,才能删除对应的目录以及目录下的文件,当ensure的值为absent,但是file资源对应的path或者title为一个文件,那么则不需要设置force属性,即可正常的删除。 |
target属性 | 当ensure属性的值为link时,我们通过target属性指定连接文件的目标文件。 |
owner属性 | 指定file资源对应的属主 |
group属性 | 指定file资源对应的属组 |
mode属性 | 指定file资源对应的权限 |
backup属性 | 使用此属性结合filebucket资源可以实现文件备份,同样,在后面的实际应用中,我们再做具体解释。 |
exec资源
通过exec资源,可以在被管理服务器上执行对应的命令,exec资源的常用属性如下。
exec{'mklhrdir':
path => "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin",
onlyif => 'test -e /etc/fstab',
command => 'mkdir -p /testdir/lhrthink/www/lhrthink/net',
}
上述资源表示,当”/etc/fstab”文件存在时,在被管理服务器上执行”创建文件夹的命令”,常用属性解释如下:
path属性 | 此属性的功能类似PATH环境变量,也就是说,我们可以指定,从哪些目录中搜索将要执行的命令,如果有多个目录,可以使用冒号”:”隔开(注意,是冒号,不是分号,就跟PATH环境变量的设置方法相同),除了使用”:”隔开表示多个路径,还能使用列表的方式表示多个path路径,如果不使用path属性,当我们指定命令时,需要给出命令所在位置的绝对路径。 |
---|---|
command属性 | 此属性用于指定将要执行的命令,如果path属性已经指定对应命令所在目录,那么此属性直接使用命令名称即可,如果未使用path属性,那么command属性则必须给出绝对路径。 |
cwd属性 | 表示在何处运行对应的command,也就是执行命令的目录。 |
user属性 | 以哪个用户的身份运行对应命令。 |
group属性 | 以哪个组的身份运行对应的命令。 |
onlyif属性 | 此属性表示”运行条件”,当onlyif属性对应的命令执行成功时,才会执行command属性对应的命令,换句话说,就是当onlyif属性对应的命令执行的返回值为0 时,才会执行command属性对应的命令。 |
refreshonly属性 | 仅接收到订阅资源的通知时,才执行对应的命令,一般与subscribe配合,此属性值可以设置为true或者false,这个属性牵扯到puppet调用资源的顺序,我们在总结资源的依赖关系时,大家自然就会明白,现在不明白可以跳过此属性。 |
yumrepo资源
yumrepo资源的作用就是在被管理服务器上设置对应的yum源,常用属性如下:
yumrepo{"zabbix":
name => "zabbix",
baseurl => "https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64",
gpgcheck => 0,
enabled => 1,
}
name属性 | 可省,表示yum文件的名称与yum源的名称 |
---|---|
baseurl属性 | 设置yum源的url,与yum的配置没有任何区别 |
gpgcheck属性 | 是否开启gpg检查,设置为0表示不检查 |
gpgkey属性 | 当启动gpgcheck时对应的key |
enabled属性 | 是否启动这个yum源1表示启动,0为不启动 |