2.6 Puppet的快速入门
Puppet是一个IT自动化框架,用来帮助管理员管理大规模的网络设施资源,使用灵活的、声明式的实现方式来进行IT自动化管理。
Puppet的核心是manifest的概念,它描述了一个设施资源对预期的声明(state)。在Puppet中,声明包括了以下方面:
- 安装了哪些软件包。
- 运行着哪些服务,不运行哪些服务。
- 软件配置详情。
2.6.1 Puppet manifest文件
Puppet使用了基于Ruby的DSL(Domain Specific Language)在一组manifest文件中来描述系统配置。例如,描述ZooKeeper的Puppet manifest文件如下:
https://yqfile.alicdn.com/fdbca79e8f74a1c83946cc7e520807e8ab1fc299.png
" >
这个最简单的manifest例子表明ZooKeeper作为一个服务已经安装在机器上,并且服务是运行的。第一个package的代码块告诉Puppet使用操作系统的包管理程序(例如,Ubuntu/debian的apt-get,Ret Hat的yum等)来安装3.3.5版本的ZooKeeper软件包。第二个package代码块保证zookeeperd软件包已经安装。最后service代码块告诉Puppet需要保证zookeeperd的系统服务正在运行,这个服务依赖于zookeeperd软件包已经安装。
为了演示Puppet manifest文件如何转化为安装软件和系统声明,让我们安装Puppet并且使用前面的例子来安装和启动zookeeperd服务。
为了获取最新版的Puppet,需要将apt-get配置使用Puppet实验室的软件源。执行下述命令来安装最新版的Puppet:
然后,保存前面列出的实例manifest文件,命名为init.pp。使用Puppet来应用这个manifest:
https://yqfile.alicdn.com/708c253bb6c0483612612266b65a33c081e37036.png
" >
当命令执行完后,查看zookeeper服务是否正在运行:
如果我们手动停止了zookeeper服务并且重新运行Puppet apply命令,Puppet不会重复执行安装过程,但是会重启服务,因为在manifest文件中定义的声明中,服务是运行的。
2.6.2 Puppet类和模块
使用独立的Puppet manifest文件很容易定义资源的声明,但这种实现方法在需要管理的资源增多时变得越来越不方便。所幸是Puppet有类和模块的概念,可以用来更好地组织和隔离特定的配置详情。
考虑到Storm的场景,我们有多个节点的类。举例来说,一个Storm集群会有nimbus节点,supervisor节点或者同时兼具两种服务的节点。Puppet类和模块提供了一种区分不同配置角色的方法,可以混合搭配来方便地定义身具多种角色的资源。
举例说明这个功能,回顾上面安装zookeeper包的manifest文件,将它重新定义为一个类,这样包含多个类的manifest文件就可以引用这个类:
https://yqfile.alicdn.com/067b5787c0bb6b1de93f4f4110aa321c0df940c8.png" >
在前面的例子里,我们将zookeeper的manifest文件重新定义为puppet的类。这个类可以在其他类或manifest文件中使用。第二行中,zookeeper类包含了另外一个类,jdk,引用这个类的定义,表示它声明一个机器必须具备Java JDK。
2.6.3 Puppet模板
Puppet还利用Ruby ERB模板系统来定义各种文件的模板,在Puppet生成manifest时使用。当Puppet运行时,会替换Puppet ERB模板中Ruby表达式和构造式。ERB模板中的Ruby语句对manifest文件中的Puppet变量和定义有完全访问的权限。
下述Puppet文件声明是用来生成storm.yaml配置文件的:
这个声明告诉Puppet,从storm.yaml.erb模板中,在/etc/storm下新建storm.yaml文件:
https://yqfile.alicdn.com/6c59281b2792652a4f7a56f2a84ccfb728955197.png
" >
模板中的条件逻辑和变量扩展使我们在多种环境下可以使用同一个模板文件。举例来说,如果环境中不需要Storm DRPC服务,则生成的storm.yaml文件中就会忽略掉drpc.service的部分。
2.6.4 使用Puppet Hiera来管理环境
我们已经简要介绍了Puppet manifest、类和模板的概念。你这时候可能会好奇,如何在一个puppet的类或manifest文件中定义变量。在puppet类或manifest文件中定义变量非常简单,在manifest文件和类中像下面这样定义即可:
https://yqfile.alicdn.com/7f78479726ed2ee325540e3dd7f92c1f531e640f.png
" >
定义后,java_sersion变量就可以在类或manifest以及ERB模板中使用了;但是,这也带来了不易复用的问题。如果我们将版本号等信息写死在代码里,就会因固定的变量值限制了这个类的复用效率。如果可以将变量扩展到可能潜在的各种变化值,配置管理会变得更容易维护。这就是Hiera的用武之地。
2.6.5 介绍Hiera
Hiera是一个最新版Puppet框架中集成的一个键值对的查找工具。Hiera允许定义键值对分层结构(hierarchies,Hiera的名字是缩写),在结构中,父节点定义的值可以被子节点定义的值代替。
例如,考虑我们在Storm集群中需要给一些机器定义配置参数的场景。所有的机器会使用一套通用的键值对,比如说使用的Java版本。所以我们将这些值定义在common.yaml中。从这里开始,开始出现分化。我们可能有单节点伪集群,也可能有多节点集群。我们会将环境相关的变量放在特殊的文件里,比如“single-node.yaml”和“cluster.yaml”。
最后,我们会将机器相关的信息写在这种格式的文件中:“[hostname].yaml”,如图2-5所示。
https://yqfile.alicdn.com/47a44184940fbe138cc0b7905ed9d17cb5845056.png" >
Puppet集成的Hiera允许使用Puppet内置变量来正确的解析文件名称。
第2章的示例源代码目录说明了如何实现文件这种文件组织方式。一个典型的common.yaml文件可能定义全局属性对所有的机器通用,如下格式:
https://yqfile.alicdn.com/3513a2b336adcb51cb7f5741043bd621144e4d91.png
" >
在environment级别,可以区分单节点和集群配置的不同,cluster.yaml可以像下面这样定义:
最后,是定义机器相关的参数配置,使用对应的[hostname].yaml文件,定义的Puppet类会针对特定节点。
比如nimbus01.yaml,使用下列配置:
对zookeeper01.yaml。使用下列代码:
https://yqfile.alicdn.com/ae4b198a31af8333c431134ff591d8ea4b2d3153.png
" >
我们对Puppet和Hiera仅仅了解了皮毛。第2章的代码中有额外的例子和文档来说明如何使用Puppet进行自动部署和配置任务。