使用模块

你会对自己编写的 Puppet 代码感到羞愧吗?其他人看你的代码时会有恐惧感吗? 为了使你的 Puppet 配置清单更清晰且易于维护,一件最重要的事情就是将这些配置清单组织成 模块(modules)

模块是对相关事物进行分组的一种简单方式;例如,一个 webserver 模块可能包含作为一个 Web 服务器所需的一切,包括 Apache 配置文件,虚拟主机配置模板以及部署这些所需的 Puppet 代码。

将配置清单拆分成模块易于代码的重用和共享;也是一种组织配置清单的最合乎逻辑的方式。 在本节中,我们将会创建一个管理 memcached 的模块,memcached 是一个 Web 应用程序常用的内存缓存系统。

操作步骤

  1. 在 puppet.conf 中查找你的模块路径,其默认值是 /etc/puppet/modules。 如果你像我前面建议的那样将 Puppet 配置清单纳入了版本控制, 那么就使用你的工作副本中的 modules 目录,之后再由他部署到 /etc/puppet/modules。

    # puppet --genconfig |grep modulepath
    modulepath = /etc/puppet/modules:/usr/share/puppet/modules
    

    在模块路径下创建一个名为 memcached 的子目录:

    # cd /etc/puppet/modules
    # mkdir memcached
    

    在此目录中,创建 manifests 和 files 两个子目录:

    # cd memcached
    # mkdir manifests files
    

    在 manifests 目录下,以如下内容创建 init.pp 文件:

    class memcached {
        package { "memcached":
            ensure => installed,
        }
    
        file { "/etc/memcached.conf":
            source => "puppet:///modules/memcached/memcached.conf",
        }
    
        service { "memcached":
            ensure  => running,
            enable  => true,
            require => [ Package["memcached"],
                         File["/etc/memcached.conf"] ],
        }
    }
    

    切换到 files 目录,以如下内容创建 memcached.conf 文件:

    -m 64
    -p 11211
    -u nobody
    -l 127.0.0.1
    
  2. 为了使用你的新模块,你的节点定义中添加如下的代码:

    node cookbook {
        include memcached
    }
    
  3. 运行 Puppet 检测新配置:

    # puppet agent --test
    info: Retrieving plugin
    info: Caching catalog for cookbook.bitfieldconsulting.com
    info: Applying configuration version '1300361964'
    notice: /Stage[main]/Memcached/Package[memcached]/ensure: ensure
    changed 'purged' to 'present'
    ...
    info: /Stage[main]/Memcached/File[/etc/memcached.conf]:
    Filebucketed /etc/memcached.conf to puppet with sum a977521922a151
    c959ac953712840803
    notice: /Stage[main]/Memcached/File[/etc/memcached.conf]/content:
    content changed '{md5}a977521922a151c959ac953712840803' to '{md5}
    f5c0bb01a24a5b3b86926c7b067ea6ba'
    notice: Finished catalog run in 20.68 seconds
    
  4. 检查新配置的服务是否正在运行:

    # service memcached status
      * memcached is running
    

工作原理

模块有特定的目录结构。并非所有子目录都要存在,但如果存在就该以如下的布局方式组织:

MODULEPATH/
 `-- MODULE_NAME
         |-- files/
         |-- templates/
         |-- manifests/
         |--   ...
         `-- README

在 memcached.pp 文件中定义了 memcached 类, 它可以被 Puppet 自动导入。现在将其包含到节点中:

include memcached

在 memcached 类中,引用了 memcached.conf 文件:

file { "/etc/memcached.conf":
    source => "puppet:///modules/memcached/memcached.conf",
}

正如我们在 配置 Puppet 的文件服务器 一节讲到的, 上面代码中的 source 参数告诉 Puppet 在如下的路径寻找文件:

MODULEPATH/
    memcached/
        files/
            memcached.conf

更多用法

学习喜欢模块的组织方式,使用模块将使你的 Puppet 管理生活便得更轻松。模块并不复杂。 然而,实践和经验会帮助你判断何时应该将事物划分并组织成模块,以及如何更好的安排你的模块结构。 如下所述的一些技巧会对你有所帮助。

模板

模板作为模块的一部分,如果你需要使用它,那么其放在 MODULE_NAME/templates 目录,参考如下的用法:

file { "/etc/memcached.conf":
    content => template("memcached/memcached.conf"),
}

Puppet 会在如下目录搜索模板文件:

MODULEPATH/
    memcached/
        templates/
            memcached.conf
Fact、函数、类型和提供者

模板中也可以包含自定义 fact、自定义函数、自定义资源类型和自定义提供者。 关于这些内容的详细信息请参阅 外部工具和 Puppet 的生态系统 一章的内容。

puppet-module

你也可以使用 puppet-module 工具为一个新模块创建目录布局,而不是使用手工方式。 请参考第 9 章的 使用公共模块 一节获得更详细的信息。

第三方模块

你可以下载由其他人开发的模块,并在你的配置清单中使用这些模块, 就像这些模块是你自己写的一样。 请参考第 9 章的 使用公共模块 一节获得更详细的信息。

模块的组织方法

有关如何组织模块的更多信息,参见 Puppet Labs 站点:http://docs.puppetlabs.com/guides/modules.html

参见本书