一、Puppet条件语句和类
Puppet2.7系列的版本支持使用3种条件判断语句,包括:if,case,selector,puppet也支持使用class是用于通用目标的一组资源,因此,它是命名的代码块,在某位置创建之后可在puppet全局使用,类似于其他编程语言中类的功能,puppet的class可以被继承,也可以包含子类。
二、Puppet模块
到目前为止,资源申报、定义类、声明类等所有功能都只能再一个manifest文件中实现,但这却非最有效的基于puppet管理IT基础架构的方式,实践中,一般需要把manifest文件分解成易于理解的结构,例如将类文件,配置文件、模块文件等分类存放,并且通过某种机制在必要时将它们整合起来,这种机制就是“模块”,它有助于以结构化、层次化的方式使用puppet,而puppet则基于“模块自动装载器”完成模块装载,模块实际就是一个按约定的、预定义的结构存放了多个文件或子目录的目录,目录里的这些文件或子目录必须遵循其命名规范,puppet会按此种规范在特定位置查找所需要的模块文件,不过,这些特定的目录也可以通过puppet的配置参数modulepath定义。
首先来演示下if语句的使用,if又包括单分支,双分支,多分支语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<code>[root@node1 ~]</code><code># vi test6.pp</code>
<code>if</code> <code>$operatingsystem =~ /(?i-mx:^(centos|fedora|redhat))/ {</code>
<code> </code><code>$webserver = </code><code>'httpd'</code>
<code>} elsif operatingsystem =~ /(?i-mx:^(debian|ubuntu))/ {</code>
<code> </code><code>$webserver = </code><code>'apache2'</code>
<code>} </code><code>else</code> <code>{</code>
<code> </code><code>$webserver = undef</code>
<code> </code><code>notice(</code><code>'Unkown OS'</code><code>)</code>
<code>}</code>
<code>package {</code><code>"$webserver"</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code>[root@node1 ~]</code><code># puppet apply test6.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Package</code><code>[httpd]</code><code>/ensure</code><code>: created</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.91 seconds</code>
<code>[root@node1 ~]</code><code># rpm -q httpd</code>
<code>httpd-2.2.15-30.el6.centos.x86_64</code>
<code># 使用多分支if判断语句,operatingsystem顶级变量,根据当前系统安装所要安装的程序包</code>
case语句,类似if语句,case语句会从多个代码块中选择一个分支执行,这跟其他编程语言中的case语句功能一致,case语句会接受一个控制表达式和一组case代码块,并执行第一个匹配到控制表达式的块
<code>[root@node1 ~]</code><code># vi test7.pp</code>
<code>case</code> <code>$operatingsystem {</code>
<code> </code><code>'Solaris'</code><code>: {notice(</code><code>"Welcome to Solaris"</code><code>)}</code>
<code> </code><code>'RedHat'</code><code>,</code><code>'CentOS'</code><code>: {notice(</code><code>"Welcome to RedHat OSFamily"</code><code>)}</code>
<code> </code><code>/^(Debian|Ubuntu)$/: {notice(</code><code>"Welcome to $1 linux"</code><code>)}</code>
<code> </code><code>default: {notice(</code><code>"Welcome,alien *_*"</code><code>)}</code>
<code>[root@node1 ~]</code><code># puppet apply test7.pp</code>
<code>notice: Scope(Class[main]): Welcome to RedHat OSFamily</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.01 seconds</code>
selector语句,selector只能用于期望出现直接值的地方,这包括变量赋值,资源属性,函数参数,资源标题,其他selector的值及表达式,selector不能用于一个已经嵌套于selector的case中,也不能用于一个已经嵌套于case的case语句中
<code>[root@node1 ~]</code><code># vi test8.pp</code>
<code>$webserver = $operatingsystem ? {</code>
<code> </code><code>/(?i-mx:ubuntu|debian)/ => </code><code>'apache2'</code><code>,</code>
<code> </code><code>/(?i-mx:centos|fedora|redhat)/ => </code><code>'httpd'</code><code>,</code>
<code>notify {</code><code>"$webserver"</code><code>:</code>
<code> </code><code>message => </code><code>"install $webserver"</code><code>,</code>
<code>[root@node1 ~]</code><code># puppet apply test8.pp</code>
<code>notice: </code><code>install</code> <code>httpd</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>//Notify</code><code>[httpd]</code><code>/message</code><code>: defined </code><code>'message'</code> <code>as </code><code>'install httpd'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.02 seconds</code>
class的使用
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<code>[root@node1 ~]</code><code># vi test9.pp</code>
<code>class nginx {</code>
<code> </code><code>package {</code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => installed,</code>
<code> </code><code>before => File[</code><code>'/etc/nginx/nginx.conf'</code><code>],</code>
<code> </code><code>}</code>
<code> </code><code>file</code> <code>{</code><code>'/etc/nginx/nginx.conf'</code><code>:</code>
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>mode => 0644,</code>
<code> </code><code>owner => </code><code>'root'</code><code>,</code>
<code> </code><code>group => </code><code>'root'</code><code>,</code>
<code> </code><code>source</code> <code>=> </code><code>'/tmp/nginx.conf'</code><code>,</code>
<code> </code><code>notify => Service[</code><code>'nginx'</code><code>],</code>
<code> </code><code>}</code>
<code> </code><code>service { </code><code>'nginx'</code><code>:</code>
<code> </code><code>ensure => running,</code>
<code>include nginx</code>
<code># 使用include来调用class</code>
<code>[root@node1 ~]</code><code># puppet apply test9.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/Package</code><code>[nginx]</code><code>/ensure</code><code>: created</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.16 seconds</code>
<code># 也可以使用以下方式调用,这种方式可以传递参数</code>
<code>class {</code><code>'nginx'</code><code>:}</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.06 seconds</code>
使用class方法调用类,还可以传递参数实现,根据参数来安装不同的服务,比如想安装tengine
52
53
54
55
<code>class webserver ($wbsvr=</code><code>'nginx'</code><code>) {</code>
<code> </code><code>package {</code><code>"$wbsvr"</code><code>:</code>
<code>class {</code><code>'webserver'</code><code>:</code>
<code> </code><code>wbsvr => </code><code>'nginx'</code><code>,</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Package</code><code>[nginx]</code><code>/ensure</code><code>: created</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.09 seconds</code>
<code> </code><code>wbsvr => </code><code>'tenginx'</code><code>,</code>
<code>err: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Package</code><code>[tenginx]</code><code>/ensure</code><code>: change from absent to present failed: Execution of </code><code>'/usr/bin/yum -d 0 -e 0 -y install tenginx'</code> <code>returned 1: Error: Nothing to </code><code>do</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]: Dependency Package[tenginx] has failures: </code><code>true</code>
<code>warning: </code><code>/Stage</code><code>[main]</code><code>/Webserver/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]: Skipping because of failed dependencies</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Service</code><code>[nginx]: Dependency Package[tenginx] has failures: </code><code>true</code>
<code>warning: </code><code>/Stage</code><code>[main]</code><code>/Webserver/Service</code><code>[nginx]: Skipping because of failed dependencies</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.41 second</code>
类也可以被继承,实现根据不同情况调用不同的类
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<code>[root@node1 ~]</code><code># vi test10.pp</code>
<code> </code><code>}</code>
<code>class nginx::websvr inherits nginx {</code>
<code> </code><code>mode => </code><code>'0644'</code><code>,</code>
<code> </code><code>require => Package[</code><code>'nginx'</code><code>],</code>
<code> </code><code>service {</code><code>'nginx'</code><code>:</code>
<code>class nginx::rproxy inherits nginx {</code>
<code> </code><code>source</code> <code>=> </code><code>'/tmp/nginx-proxy.conf'</code><code>,</code>
<code>include nginx::websvr</code>
<code>[root@node1 ~]</code><code># puppet apply test10.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Websvr</code><code>/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Websvr</code><code>/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: Finished catalog run </code><code>in</code> <code>1.81 seconds</code>
<code># 调用nginx::rproxy类</code>
<code>include nginx::rproxy</code>
<code>notice: Finished catalog run </code><code>in</code> <code>0.15 seconds</code>
puppet模块的创建和使用
<code># 安装puppet-server</code>
<code>[root@node1 ~]</code><code># rpm -ivh puppet-server-2.7.23-1.el6.noarch.rpm</code>
<code># 创建模块目录结构</code>
<code>[root@node1 ~]</code><code># mkdir -pv /etc/puppet/modules/nginx/{manifests,files,lib,templates,tests,spec}</code>
<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/manifests</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/files</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/lib</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/templates</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/tests</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/etc/puppet/modules/nginx/spec</code><code>'</code>
<code>[root@node1 ~]</code><code># puppet module list</code>
<code>/etc/puppet/modules</code>
<code>└── nginx (???)</code>
<code>/usr/share/puppet/modules</code> <code>(no modules installed)</code>
MODULE NAME:模块名称,只能以小写字母开头,也可以包含小写字母、数字和下划线,但不能使用“main”或者“settings”作为模块名;
manifests目录:包含当前模块的所有manifest文件;每个mainfest文件必须包含一个类或一个定义的类,此文件访问路径格式为"ModuleName::[SubDircetoryName::]ManifestFileName",注意manifest文件不需要其后缀.pp;
init.pp:只能包含一个单独的类定义,且类的名称必须与模块名称相同;
files目录:包含了一组静态文件,这些文件可被节点下载使用,每个文件的访问路径遵循
puppet:///modules/MODULE_NAME/filename路径格式;
lib目录:插件目录,常用于自定义fact及自定义资源类型等;
templates目录:存储了manifest用到的模板文件,其访问路径遵循template('ModulName/TemplateName')格式;
tests目录:当前模块的使用帮助或使用范例文件,类似如何声明当前模块中的类定义的类型等;
spec目录:类似于tests目录的功能,只不过,其是为lib目录中定义的各插件提供使用的范例的;
在nginx模块中定义init.pp
<code>[root@node1 ~]</code><code># vi /etc/puppet/modules/nginx/manifests/init.pp</code>
<code> </code><code>ensure => installed,</code>
定义nginx_web.pp文件
<code>[root@node1 ~]</code><code># vi /etc/puppet/modules/nginx/manifests/nginx_web.pp</code>
<code>class nginx::nginx_web inherits nginx {</code>
<code> </code><code>ensure => </code><code>file</code><code>,</code>
<code> </code><code>source</code> <code>=> </code><code>'puppet:///modules/nginx/nginx-web.conf'</code><code>,</code>
<code> </code><code>mode => </code><code>'0644'</code><code>,</code>
<code> </code><code>owner => </code><code>'root'</code><code>,</code>
<code> </code><code>group => </code><code>'root'</code><code>,</code>
<code> </code><code>notify => Service[</code><code>'nginx'</code><code>],</code>
<code> </code><code>require => Package[</code><code>'nginx'</code><code>],</code>
<code> </code><code>ensure => running,</code>
<code># 准备source文件</code>
<code>[root@node1 ~]</code><code># cp /tmp/nginx.conf /etc/puppet/modules/nginx/files/nginx-web.conf</code>
定义nginx_proxy.pp文件
<code>[root@node1 ~]</code><code># vi /etc/puppet/modules/nginx/manifests/nginx_proxy.pp</code>
<code>class nginx::nginx_proxy inherits nginx {</code>
<code> </code><code>source</code> <code>=> </code><code>'puppet:///modules/nginx/nginx-proxy.conf'</code><code>,</code>
<code>[root@node1 ~]</code><code># cp /tmp/nginx.conf /etc/puppet/modules/nginx/files/nginx-proxy.conf</code>
创建site.pp文件调用前面定义的class
<code>[root@node1 ~]</code><code># vi /etc/puppet/manifests/site.pp</code>
<code>node </code><code>'node1.luojianlong'</code> <code>{</code>
<code> </code><code>include nginx::nginx_web</code>
执行操作
<code>[root@node1 ~]</code><code># puppet apply /etc/puppet/manifests/site.pp</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_web</code><code>/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_web</code><code>/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_web</code><code>/Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.05 seconds</code>
这样就是使用nginx-web.conf配置文件启动的nginx
也可以使用nginx-proxy.conf,启动
<code> </code><code>include nginx::nginx_proxy</code>
<code>[root@node1 ~]</code><code># yum -y remove nginx</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_proxy</code><code>/File</code><code>[</code><code>/etc/nginx/nginx</code><code>.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}d9dfc198c249bb4ac341198a752b9458'</code> <code>to </code><code>'{md5}95f45f10386878664af2b7ccd1536ea4'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_proxy</code><code>/Service</code><code>[nginx]</code><code>/ensure</code><code>: ensure changed </code><code>'stopped'</code> <code>to </code><code>'running'</code>
<code>notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx</code><code>::Nginx_proxy</code><code>/Service</code><code>[nginx]: Triggered </code><code>'refresh'</code> <code>from 1 events</code>
<code>notice: Finished catalog run </code><code>in</code> <code>2.11 seconds</code>
<code># 执行成功</code>
到此,Puppet条件语句,class,module的使用就介绍这么多了。
本文转自ljl_19880709 51CTO博客,原文链接:http://blog.51cto.com/luojianlong/1394883,如需转载请自行联系原作者