我目前正在使用 Puppet 和 Foreman 1.17 以及 puppetlabs/apache 版本 3.1.0。所有虚拟主机均使用 .yaml 文件定义:
apache::vhost:
vm12345_ssl:
servername: my.example.com
docroot: /home/my.example.com/web
logroot: /home/my.example.com/log
(... more configuration)
现在我想通过 Hiera / yaml 文件指定所需的 Apache 模块。但我找不到任何文档或示例来说明如何执行此操作。一个网站推荐apache::mod::proxy: true
;我尝试了这个以及它的变体,但无法使其工作。
我想要实现的目标:我正在使用 Puppet 角色和配置文件模式,并且我的 webapp 配置文件各自包含以下几行:
class profile::webapp::my_webapp_01 (
... some parameters
) {
include profile::java
include apache
apache::mod { 'proxy': }
apache::mod { 'proxy_ajp': }
apache::mod { 'proxy_http': }
... more webapp-specific configuration
我的节点如下所示:
node 'vm12345' {
...
include profile::webapp::my_webapp_01
include profile::webapp::my_webapp_02
include profile::webapp::my_webapp_03
}
当我在每个虚拟机中只包含一个 webapp 时,一切都很好,但是一旦我在虚拟机中包含多个 webapp,就会出现“重复声明”错误。我认为解决这个问题的正确方法是使用 Hiera 指定 Apache 模块,而不是将它们明确定义到配置文件中。
请告知如何通过 Hiera 和 yaml 文件指定 Apache 模块,或者如果整个方法可能被破坏,请告知如何为 Apache 模块编写配置文件声明,以便可以多次包含它们。
答案1
使用角色和配置文件结构:
Apache 简介:
class profile::apache {
include ::apache
apache::mod { 'proxy': }
apache::mod { 'proxy_ajp': }
apache::mod { 'proxy_http': }
}
Web 应用程序角色:
class role::webapp::my_webapp_01 {
include profile::java
include profile::apache
}
Web 服务器节点:
node 'vm12345' {
include role::webapp::my_webapp_01
}
您还可以修改 Apache Role,以便为 mods 创建参数:
class profile::apache (
Array $mods = [],
) {
include ::apache
apache::mod { $mods: }
}
值得注意的是,您还可以default_mods
通过 Puppet 代码或通过 Hiera 使用 Apache 模块的参数:
木偶
class { '::apache':
default_mods' => ['proxy','proxy_ajp','proxy_http'],
}
希拉
---
apache::default_mods:
- proxy
- proxy_ajp
- proxy_http
答案2
我现在在我的配置文件中使用下面的代码:
class profile::webapp::my_webapp_01 (
... some parameters
) {
include profile::java
include apache
include apache::mod::proxy
include apache::mod::proxy_ajp
include apache::mod::proxy_http
... more webapp-specific configuration
这允许多次包含而不会出现“重复声明”错误。
但是我无法弄清楚如何使用 Hiera / yaml 文件来实现这一点。可能需要一些额外的代码来从 yaml 文件中读取参数,例如 hiera() 和 create_resource()。