第 4 章 配置 OpenStack Puppet 模块的添加
本章介绍了如何为 OpenStack Puppet 模块提供添加的内容。其中包括一些有关开发 Puppet 模块的基本指南。
4.1. Puppet 语法和模块结构
以下部分提供了几个基本知识,可帮助您理解 Puppet 语法和 Puppet 模块的结构。
4.1.1. Puppet 模块分析
在贡献 OpenStack 模块前,您必须了解创建 Puppet 模块的组件。
- manifests
清单是包含用于定义一组资源及其属性的代码的文件。资源是系统的任何可配置部分。资源示例包括软件包、服务、文件、用户和组、SELinux 配置、SSH 密钥身份验证、cron 作业等。清单使用一组键值对来定义每个所需的资源。
package { 'httpd': ensure => installed, }
例如,此声明将检查是否安装了
httpd
软件包。如果没有,则清单将执行dnf
并安装它。清单位于模块的 清单目录中。Puppet 模块也使用测试目录进行测试清单。这些清单用于测试官方清单中某些类。- 类
- 类统一清单中的多个资源。例如,如果您安装并配置 HTTP 服务器,您可以创建一个以下三个资源的类:一个用于安装 HTTP 服务器软件包,一个用于配置 HTTP 服务器,另一个用于启动或停止服务器。您还可以引用来自其他模块的类,以应用其配置。例如,如果要配置还需要 webserver 的应用,您可以引用前面提到的 HTTP 服务器类。
- 附录文件
模块可以包含静态文件,供 Puppet 复制到系统上的特定位置。通过使用清单中的 file 资源声明来定义位置和其他属性(如权限)。
静态文件位于模块的文件目录中。
- templates
有时,配置文件需要自定义内容。在这种情况下,用户会创建一个模板而不是静态文件。与静态文件一样,模板在清单中定义,并复制到系统上的位置。区别在于,模板允许 Ruby 表达式定义自定义内容和变量输入。例如,如果要使用自定义端口配置 httpd,那么配置文件的模板包括:
Listen <%= @httpd_port %>
此例中的
httpd_port
变量在引用此模板的清单中定义。模板位于模块的 templates 目录中。
- Plugins
对超出 Puppet 核心功能的核心功能,使用插件。例如,您可以使用插件来定义自定义事实、自定义资源或新功能。例如,数据库管理员可能需要 PostgreSQL 数据库的资源类型。这有助于在数据库管理员安装 PostgreSQL 后使用一组新的数据库来填充 PostgreSQL。因此,数据库管理员必须仅创建一个 Puppet 清单,以确保 PostgreSQL 安装以及之后创建数据库。
插件位于模块的 lib 目录中。根据插件类型,这包括一组子目录:
-
/lib/facter
- 自定义事实的位置。 -
/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, } }
此代码定义了名为 httpd
的 mymodule
的子类,然后为 httpd
软件包定义软件包资源声明。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"], } }
结果:
-
ensure => running
属性检查该服务是否正在运行。如果没有,Puppet 会启用它。 -
enable => true
属性将服务设置为在系统启动时运行。 -
require => Package["httpd"]
属性定义一个资源声明和其他资源声明间的顺序关系。在本例中,它会确保httpd
服务在安装httpd
软件包后启动。这会在服务及其对应的软件包之间创建一个依赖项。
4.1.4. 配置服务
HTTP 服务器在 /etc/httpd/conf/httpd.conf
中提供了一些默认配置,该配置在端口 80 上提供 Web 主机。但是,您可以添加额外配置,以在用户指定的端口上提供额外的 web 主机。
流程
您必须使用模板文件来存储 HTTP 配置文件,因为用户定义的端口需要变量输入。在模块模板目录中,添加名为
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>
此模板遵循 Apache Web 服务器配置的标准语法。唯一的区别是包含 Ruby 转义字符来注入模块的变量。例如,
httpd_port
用于指定 Web 服务器端口。包含
fqdn
是一个存储系统完全限定域名的变量。这称为 系统事实。系统事实从每个系统收集,然后生成系统的每一目录。Puppet 使用facter
命令收集这些系统事实,您也可以运行facter
来查看这些事实的列表。-
保存
myserver.conf.erb
。 将资源添加到模块的 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", } }
结果:
-
您可以为服务器配置文件
(/etc/httpd/conf.d/myserver.conf
)添加 file 资源声明。此文件的内容是您创建的myserver.conf.erb
模板。 -
您可在添加此文件前检查
httpd
软件包。 -
为您的 web 服务器添加第二个文件资源声明,用于创建目录
/var/www/myserver
。 -
您可以使用
notify => Service["
服务间添加关系。这将检查您的配置文件是否有更改。如果文件已更改,Puppet 会重新启动该服务。httpd
"] 属性在配置文件和 httpd