这一节学习puppet的资源属性以及使用方法。
我们一般在node.pp文件中为每一台主机设置节点定义,如果有许多节点,node.pp不会变得很大,因为puppet有方法来处理这些问题。如果定义了节点,但是没有配置任何内容,puppet agent连接master时会识别出这个节点但并不进行任何操作。你可以定义个叫做default的默认节点,如果没有其他节点定义存在,这个节点的内容就会被应用到主机上。
puppet有一个节点继承结构,可以让一个节点内容继承于另一个节点,在同一个时刻,每个节点只能继承于一个节点。但是随着节点数量的增加,当只有部分节点需要调整时,这种结构可能会出现问题,所以最好使用平面的树形节点分类结构而不是节点继承。在puppet中可以设置变量,在同一个作用域中给同一个变量赋值会导致错误,而每一个类、定义、节点都会引入一个新的作用域,在不同的作用域中可以对一个变量进行重新赋值。
模块是包含了资源、类、文件以及配置文件模板的独立容器,我们可以用模块来定义每台主机配置的不同部分,模块是puppet清单的结构化集合,puppet会搜索模块路径来寻找模块并加载它们,默认的模块路经是/etc/puppet/modules和/var/lib/puppet/modules,这个路径可以由modulepath选项设置,而每个模块目录又有特定的目录结构,假如我们的模块放在/etc/puppet/modules目录下,我们在modules目录下建立一个apache模块目录,目录结构如下:
apache/
apache/manifests
apache/manifests/init.pp
apache/templates
apache/files
我们可以在init.pp文件中创建一个和模块同名的类,然后用include函数把这个模块应用到一个节点上面,include函数可以将包含在一个类或者模块中的资源添加到节点。就如上一节的ssh和tree模块一样。函数只能运行在master上。
在init.pp文件中创建一些类和初始资源,模块可以由多个类组成,这样一来init.pp文件中就有越来越多的类和资源,管理起来不是很方便,puppet可以让设置的每一个类都放在相关模块的manifests目录下的一个独立文件中,而不是只能放在init.pp文件中,当puppet载入模块时会自动搜索以.pp作为后缀名的文件然后自动导入它们。
我们已经了解了创建模块的目录结构,接下来要创建类和资源,我们知道资源由类型、标题和一系列属性构成,每个资源的属性当中有一个被作为资源的“名字变量”,用这个属性的值来作为资源的名字,package和service使用name属性作为它们的名字变量file资源使用path属性作为它的名字变量,大多数的时候我们不需要设置名字变量,因为它们于标题相同,但是有时候如果标题过长,引用麻烦,我们希望有一个简单的名字,就可以设置各个资源的名字变量。
前面说过puppet可以识别不同的平台,那是因为在每个节点上都安装有facter,每次puppet运行时,facter都会收集agent的数据发送给master,master就根据这些收集来的数据分析agent使用的是那种平台。我们可以在类中根据facter收集的数据使用case语句进行分析,然后选择合适的平台软件包。
官方建议我们在创建模块时,使用::命名空间语法作为在模块中创建结构和组织的一种方法。前缀告诉puppet该类属于哪个模块后缀则是类名。
以上是puppet的基础知识,接下来会在实际应用过程中对用到的知识进行学习。