第 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,
  }
}

此代码定义了名为 httpdmymodule 的子类,然后为 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 主机。

流程

  1. 您必须使用模板文件来存储 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 来查看这些事实的列表。

  2. 保存 myserver.conf.erb
  3. 将资源添加到模块的 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[" httpd "] 属性在配置文件和 httpd 服务间添加关系。这将检查您的配置文件是否有更改。如果文件已更改,Puppet 会重新启动该服务。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.