您的位置:首页 > 运维架构

puppet自动化运维之puppet的资源基础知识

2014-04-24 00:00 92 查看
摘要: 个人近期将发布puppet自动化运维的亲身实战,有很多来之网上的文档,特别是http://kisspuppet.com和《Puppet实战》的。此次推出puppet的资源基础知识,欢迎网友指正。

puppet自动化运维之puppet的资源基础知识

此篇文章,主要是让读者提前了解puppet资源的一些知识。

变量和数组会经常用的,你懂得。

资源或变量,都分为:定义和引用。这一点一定要注意。

1.变量和数组

①、变量:

学过编程的同学,都应该知道变量的优点。一般的变量都区分全局变量和局部变量,以我个人习惯,一般只用全局变量,这样就不必在变量的区分上费时间了。例如,在shell里,我就是这样的。

puppet用$符号定义变量,变量的内容。
声明格式: $变量名="值"
引用格式: ${变量名}
例:

vi /etc/puppet/manifest/test.pp
$test=" hello , guys "file {"/tmp/test":content => ${test}; # content => " hello , guys "}

②、数组:

(1)、直接定义数组:
puppet利用方括号来定义数组,数组的内容由逗号分割,分别用双引号括起来.

[ "apache2" , " httpd " , " ssh " ]

例:

vi /etc/puppet/manifest/test.pp
$packages = [ "ruby1.8-dev","ruby1.8","ri1.8","rdoc1.8","irb1.8","libreadline-ruby1.8","libruby1.8","libopenssl-ruby" ]package { $packages: ensure => installed }
(2)、从字符串创建数组,像这样使用split 函数:
例:

vi /etc/puppet/manifest/test.pp
$menu = "egg beans chips"$items = split($menu, ' ')lunchprint { $items: }Lunch included eggLunch included beansLunch included chips
注意:split需要两个参数,第1个是需要split的字符串,第二个是split的分隔符。

split(字符串,分隔符)


vi /etc/puppet/manifest/test.pp
$menu = "egg and beans and chips"$items = split($menu, 'and')
例:正则表达式

vi /etc/puppet/manifest/test.pp
$lunch = "egg:beans,chips"$items = split($lunch, ':|,')

2.资源总述

puppet基本单元是资源。资源描述了系统的某些方面的属性,这些方面包括文件,服务,软件包甚至是你自定义的一个资源。
定义一个资源,需要指定资源的type(类型)和资源的title(标题)。
格式:

type { "title1 ",…,"title ":
    attribute => "value",
...
attribute => "value";
  }
例:

vi /etc/puppet/manifest/test.pp
file{"/etc/passwd":name => "/etc/passwd",owner => root,group => root,mode => 644;}
上面的代码让/etc/passwd的权限保持644,并且属于root用户和root用户组;

第一行的file是指定资源的类型是"file"类型;
第二行的"/etc/passwd"是资源title,title的作用是让puppet能唯一标识这个资源;第三行的name指定了要对那个文件操作,默认情况下,name都等于title,所以很多时候name是可以省略的。这点要注意。
例:

vi /etc/puppet/manifest/test.pp
file{"sshdconfig":name => $operatingsystem ? {solaris => "/usr/local/etc/ssh/sshd_config",default => "/etc/ssh/sshd_config";},owner => root,group => root,mode => 644,}
资源的title是sshdconfig,但是name却可以通过判定操作系统自己选择合适的值。这样,当其他的资源要依赖sshdconfig的时候,只需要说明依赖sshdconfig就行,不需要关心文件到底在什么路径下面。例如下面的代码:

vi /etc/puppet/manifest/test.pp
service {"sshd":subscribe => File[sshdconfig],}
指定了一个sshd的服务,这个服务如果发现文件资源sshdconfig 有变动,就会自己reload配置文件。是不是很方便呢?注意上面的subscribe后面的File,第一个字母要大写,定义资源关系的时候,这里的字母要大写。

通常,在puppet代码里面可能会定义很多相同的资源,可以用[]把所有资源的title写在一起,即数组,例如:
vi /etc/puppet/manifest/test.pp
file{["/etc/passwd","/etc/hosts"]:owner => root,group => root,mode => 644;}
你可能已经发现了,每次定义文件的时候如果都输入mode,owner,group会很繁琐,因此你可以在puppet的site.pp的开头定义资源的默认值。

定义资源的默认值需要把资源的第一个资源大写。例如下面的代码让所有的file资源的mode是644,owner是root。默认值可以被后面的设置覆盖。
vi /etc/puppet/manifest/test.pp
File{owner => root,mode => 644;}
在puppet里面可以定义资源之间的关系,例如前面提到的,如果sshdconfig文件如果有修改,sshd服务就重启。puppet里面还有另一个资源关系:依赖。例如资源A依赖资源B,如果资源B不存在,资源A就不被执行。定义资源依赖的属性是requre 。例如:

vi /etc/puppet/manifest/test.pp
file{"/etc/apache2/port.conf":content => "80",require => Package["apache2"];}
package{"apache2":ensure =>installed;}
file资源设置port.conf的内容为80,但是在设置file资源之前,要求apache2这个软件包配置好了(即file资源依赖Package["apache2"])。

3.资源的类型

puppet的资源是由具体的系统管理任务抽象而来的,系统管理中遇到什么任务,就会有相应的资源类型,目前puppet支持的资源类型有:

file 文件/目录的管理

package 软件包的管理(yum install|remove)

service 服务的管理(start|restart|stop|status)

cron crontab定时任务的管理

user 添加用户

group 添加用户组

exec shell命令

notify 资源之间的通讯

至此,puppet的资源基础知识就结束了,变量和数组会经常用的,接下来的是puppet的file资源学习,请听下回分解!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息