第 4 章 配置


本章介绍了如何提供 OpenStack Puppet 模块添加的内容。其中包括一些有关开发 Puppet 模块的基本指南。

4.1. 了解 Puppet 基础知识

以下部分提供了一些基本知识,可帮助您了解 Puppet 的语法和 Puppet 模块的结构。

4.1.1. 检查 Puppet 模块的分析

在贡献 OpenStack 模块之前,我们需要了解创建 Puppet 模块的组件。

⁠manifests

清单是包含定义一组资源及其属性的代码的文件。资源是系统的可配置部分。资源示例包括软件包、服务、文件、用户和组、SELinux 配置、SSH 密钥身份验证、cron 作业等。清单使用一组键值对为其属性定义每个所需的资源。例如:

  package { 'httpd':
    ensure => installed,
  }
Copy to Clipboard Toggle word wrap

此声明检查是否安装了 httpd 软件包。如果没有,则清单将执行 yum 并安装它。清单位于模块的 manifest 目录中。Puppet 模块也使用测试目录来测试清单。这些清单用于测试官方清单中包含的特定类。

类充当在清单中统一多个资源的方法。例如,如果安装和配置 HTTP 服务器,您可以创建具有三个资源的类:一个用于安装 HTTP 服务器软件包,一个用于配置 HTTP 服务器,一个用于启动或启用服务器。您还可以引用其他模块的类,以应用其配置。例如,如果要配置需要 webserver 的应用程序,您可以参考前面提到的 HTTP 服务器的类。
⁠static 文件

模块可以包含静态文件,供 Puppet 复制到您系统上的某个位置。这些位置和其他属性(如权限)通过清单中的 file 资源声明来定义。

静态文件位于模块的 files 目录中。

⁠templates

有时配置文件需要自定义内容。在这种情况下,用户会创建一个模板而不是静态文件。与静态文件一样,模板在清单中定义,并复制到系统的位置。区别在于,模板允许 Ruby 表达式定义自定义内容和变量输入。例如,如果要使用自定义端口配置 httpd,则配置文件的模板将包括:

Listen <%= @httpd_port %>
Copy to Clipboard Toggle word wrap

本例中,httpd_port 变量在引用此模板的清单中定义。

模板位于模块的 templates 目录中。

⁠plugins

插件允许扩展到 Puppet 核心功能的各个方面。例如,您可以使用插件来定义自定义事实、自定义资源或新功能。例如,数据库管理员可能需要 PostgreSQL 数据库的资源类型。这有助于在安装 PostgreSQL 后,数据库管理员为 PostgreSQL 填充一组新数据库。因此,数据库管理员需要创建一个 Puppet 清单,确保 PostgreSQL 安装和数据库会在之后创建。

插件位于模块的 lib 目录中。这包括一组子目录,具体取决于插件类型。例如:

  • 用于自定义事实的 /lib/facter - Location。
  • 用于自定义资源定义的 /lib/puppet/type - Location,它概述了属性的键值对。
  • /lib/puppet/provider - Location 用于自定义资源提供程序,它们与用于控制资源的资源类型定义一同使用。
  • 用于自定义功能的 /lib/puppet/parser/functions - Location。

4.1.2. 安装服务

有些软件需要软件包安装。这是 Puppet 模块可以执行的一个功能。这需要一个资源定义,用于定义特定软件包的配置。

例如,要通过 mymodule 模块安装 httpd 软件包,您要将以下内容添加到 mymodule 模块中的 Puppet 清单中:

class mymodule::httpd {
  package { 'httpd':
    ensure => installed,
  }
}
Copy to Clipboard Toggle word wrap

此代码定义了一个名为 httpdmymodule 的子类,然后为 httpd 软件包定义 package 资源声明。ensure => installed 属性告知 Puppet 检查软件包是否已安装。如果没有安装,Puppet 将执行 yum 进行安装。

4.1.3. 启动和启用服务

安装软件包后,您可能需要启动该服务。使用另一个名为 service 的资源声明。这需要使用以下内容编辑清单:

class mymodule::httpd {
  package { 'httpd':
    ensure => installed,
  }
  service { 'httpd':
    ensure => running,
    enable => true,
    require => Package["httpd"],
  }
}
Copy to Clipboard Toggle word wrap

这可实现以下几项:

  • ensure => running 属性检查服务是否在运行。如果没有,Puppet 会启用它。
  • enable => true 属性将服务设置为在系统引导时运行。
  • require => Package["httpd"] 属性定义了一个资源声明和另一个资源之间的排序关系。在这种情况下,它会确保 httpd 服务在安装 httpd 软件包后启动。这会在服务及其对应软件包之间创建一个依赖项。

4.1.4. 配置服务

前面的两个步骤演示了如何通过 Puppet 安装和启用服务。但是,您可能旨在为服务提供一些自定义配置。在我们的示例中,HTTP 服务器已在 /etc/httpd/conf/httpd.conf 中提供一些默认配置,它在端口 80 上提供 Web 主机。本节添加了一些额外的配置,以便在用户指定的端口上提供额外的 Web 主机。

为此,您可以使用模板文件来存储 HTTP 配置文件。这是因为用户定义的端口需要变量输入。在模块的 templates 目录中,您将添加一个名为 myserver.conf.erb 的文件,其中包含以下内容:

Listen <%= @httpd_port %>
NameVirtualHost *:<%= @httpd_port %>
<VirtualHost *:<%= @httpd_port %>>
  DocumentRoot /var/www/myserver/
  ServerName *:<%= @fqdn %>>
  <Directory "/var/www/myserver/">
    Options All Indexes FollowSymLinks
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
Copy to Clipboard Toggle word wrap

此模板遵循 Apache Web 服务器配置的标准语法。唯一的区别是包括 Ruby 转义字符,以便从我们的模块中注入变量。例如,httpd_port 用于指定 Web 服务器端口。

另请注意包含 fqdn,它是一个存储系统完全限定域名的变量。这称为 系统事实。在生成各个系统的 Puppet 目录之前,从每个系统收集系统事实。Puppet 使用 facter 命令收集这些系统事实,您也可以运行事实来查看这些事实的列表。

保存此文件后,您要将资源添加到模块的 Puppet 清单:

class mymodule::httpd {
  package { 'httpd':
    ensure => installed,
  }
  service { 'httpd':
    ensure => running,
    enable => true,
    require => Package["httpd"],
  }
  file {'/etc/httpd/conf.d/myserver.conf':
  notify => Service["httpd"],
    ensure => file,
    require => Package["httpd"],
    content => template("mymodule/myserver.conf.erb"),
  }
  file { "/var/www/myserver":
    ensure => "directory",
  }
}
Copy to Clipboard Toggle word wrap

这可实现以下目标:

  • 我们为服务器配置文件添加 file 资源声明(/etc/httpd/conf.d/myserver.conf)。此文件的内容是我们之前创建的 myserver.conf.erb 模板。在添加此文件之前,我们还检查 httpd 软件包已经安装。
  • 我们还会添加第二个 file 资源声明。这个目录会为我们的 web 服务器创建一个目录(/var/www/myserver)。
  • 我们还使用 notify => Service["httpd"] 属性在配置文件和 httpd 服务之间添加关系。这会检查我们的配置文件是否有任何更改。如果文件已更改,Puppet 将重新启动服务。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat