使用模块

优质
小牛编辑
143浏览
2023-12-01

你会对自己编写的 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

    在此目录中,创建 manifestsfiles 两个子目录:

    # 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 。

参见本书