📅  最后修改于: 2020-10-31 14:13:10             🧑  作者: Mango
为了执行在Puppet节点上应用配置和清单的实时测试,我们将使用实时工作演示。可以直接将其复制并粘贴以测试配置如何工作。如果用户希望使用相同的代码集,则他需要具有如下代码片段中所示的相同命名约定。
让我们从创建一个新模块开始。
测试和应用httpd配置的第一步是创建一个模块。为此,用户需要将其工作目录更改为Puppet模块目录并创建基本的模块结构。可以手动完成结构创建,也可以使用Puppet为模块创建样板。
# cd /etc/puppet/modules
# puppet module generate Live-module
注– Puppet模块生成命令要求模块名称采用[用户名]-[模块]的格式,以符合Puppet伪造规范。
新模块包含一些基本文件,包括清单目录。该目录已经包含一个名为init.pp的清单,它是模块的主要清单文件。这是模块的空类声明。
class live-module {
}
该模块还包含一个测试目录,其中包含一个名为init.pp的清单。该测试清单包含对manifest / init.pp中的活动模块类的引用:
include live-module
木偶将使用此测试模块来测试清单。现在我们准备将配置添加到模块中。
Puppet模块将安装必要的软件包以运行http服务器。这需要定义httpd软件包配置的资源定义。
在模块的清单目录中,创建一个名为httpd.pp的新清单文件。
# touch test-module/manifests/httpd.pp
此清单将包含我们模块的所有HTTP配置。为了分离起见,我们将httpd.pp文件与init.pp清单文件分开
我们需要将以下代码放入httpd.pp清单文件中。
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
}
此代码定义了称为httpd的测试模块的子类,然后为httpd包定义了包资源声明。确保=>已安装属性检查是否已安装所需的软件包。如果未安装,Puppet将使用yum实用程序进行安装。接下来,是将该子类包含在我们的主清单文件中。我们需要编辑init.pp清单。
class test-module {
include test-module::httpd
}
现在是时候测试模块了,可以按照以下步骤进行
# puppet apply test-module/tests/init.pp --noop
puppet apply命令应用目标系统清单文件中存在的配置。在这里,我们使用测试init.pp,它指向主init.pp。 –noop执行配置的空运行,该配置仅显示输出,但实际上不执行任何操作。
以下是输出。
Notice: Compiled catalog for puppet.example.com in environment
production in 0.59 seconds
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 1
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.67 seconds
突出显示的行是确保=>已安装属性的结果。缺少current_value表示Puppet已检测到已安装httpd软件包。如果没有–noop选项,Puppet将安装httpd软件包。
安装httpd服务器后,我们需要使用其他资源减速来启动服务:Service
我们需要编辑httpd.pp清单文件并编辑以下内容。
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
service { 'httpd':
ensure => running,
enable => true,
require => Package["httpd"],
}
}
以下是我们从以上代码中实现的目标列表。
确保=>运行状态检查服务是否正在运行,如果没有运行则启用它。
enable => true属性设置服务在系统启动时运行。
require => Package [“ httpd”]属性定义一个资源减速与另一个资源减速之间的排序关系。在上述情况下,它可确保在安装http软件包后启动httpd服务。这在服务和相应的程序包之间创建了依赖关系。
运行puppet apply命令再次测试更改。
# puppet apply test-module/tests/init.pp --noop
Notice: Compiled catalog for puppet.example.com in environment
production in 0.56 seconds
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 2
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.41 seconds
完成上述步骤后,我们将安装并启用HTTP服务器。下一步是为服务器提供一些配置。默认情况下,httpd在/etc/httpd/conf/httpd.conf中提供了一些默认配置,该配置提供了Web主机端口80。我们将添加一些其他主机,以为Web主机提供一些用户特定的功能。
模板将用于提供其他端口,因为它需要可变输入。我们将创建一个名为template的目录,并在新Director中添加一个名为test-server.config.erb的文件,并添加以下内容。
Listen
NameVirtualHost *:
>
DocumentRoot /var/www/testserver/
ServerName
Options All Indexes FollowSymLinks
Order allow,deny
Allow from all
上面的模板遵循标准的apache-tomcat服务器配置格式。唯一的区别是使用Ruby转义字符从模块中注入变量。我们有FQDN,它存储系统的标准域名。这被称为系统事实。
在生成每个各自系统的人偶目录之前,先从每个系统中收集系统事实。 Puppet使用facter命令来获取此信息,并且可以使用facter来获取有关系统的其他详细信息。我们需要在httpd.pp清单文件中添加突出显示的行。
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
service { 'httpd':
ensure => running,
enable => true,
require => Package["httpd"],
}
file {'/etc/httpd/conf.d/testserver.conf':
notify => Service["httpd"],
ensure => file,
require => Package["httpd"],
content => template("test-module/testserver.conf.erb"),
}
file { "/var/www/myserver":
ensure => "directory",
}
}
这有助于实现以下目标-
这将为服务器配置文件(/etc/httpd/conf.d/test-server.conf)添加文件资源声明。该文件的内容是之前创建的test-serverconf.erb模板。在添加此文件之前,我们还会检查已安装的httpd软件包。
这将添加第二个文件资源声明,该声明为Web服务器创建目录(/ var / www / test-server)。
接下来,我们使用notify => Service [“ httpd”] attribute在配置文件和https服务之间添加关系。这将检查是否有任何配置文件更改。如果存在,则Puppet重新启动服务。
接下来是在主清单文件中包含httpd_port。为此,我们需要结束主要的init.pp清单文件并包括以下内容。
class test-module (
$http_port = 80
) {
include test-module::httpd
}
这会将httpd端口设置为默认值80。接下来是运行Puppet apply命令。
以下将是输出。
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for puppet.example.com in environment
production in 0.84 seconds
Notice: /Stage[main]/test-module::Httpd/File[/var/www/myserver]/ensure:
current_value absent, should be directory (noop)
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice:
/Stage[main]/test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensure:
current_value absent, should be file (noop)
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 4
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.51 seconds
为了与服务器通信,需要一个开放端口。这里的问题是,不同类型的操作系统使用不同的方法来控制防火墙。对于Linux,低于6的版本使用iptables,而低于7的版本使用Firewalld。
Puppet使用系统事实及其逻辑在某种程度上决定了使用适当服务的决定。为此,我们需要首先检查操作系统,然后运行适当的防火墙命令。
为了实现这一点,我们需要在testmodule :: http类中添加以下代码片段。
if $operatingsystemmajrelease <= 6 {
exec { 'iptables':
command => "iptables -I INPUT 1 -p tcp -m multiport --ports
${httpd_port} -m comment --comment 'Custom HTTP Web Host' -j ACCEPT &&
iptables-save > /etc/sysconfig/iptables",
path => "/sbin",
refreshonly => true,
subscribe => Package['httpd'],
}
service { 'iptables':
ensure => running,
enable => true,
hasrestart => true,
subscribe => Exec['iptables'],
}
} elsif $operatingsystemmajrelease == 7 {
exec { 'firewall-cmd':
command => "firewall-cmd --zone=public --addport = $ {
httpd_port}/tcp --permanent",
path => "/usr/bin/",
refreshonly => true,
subscribe => Package['httpd'],
}
service { 'firewalld':
ensure => running,
enable => true,
hasrestart => true,
subscribe => Exec['firewall-cmd'],
}
}
上面的代码执行以下操作-
使用操作系统主发行版可以确定所使用的操作系统是版本6还是版本7。
如果版本为6,则它将运行所有必需的配置命令以配置Linux 6版本。
如果操作系统版本为7,则它将运行配置防火墙所需的所有必需命令。
这两个操作系统的代码段均包含一个逻辑,以确保配置仅在安装了http软件包之后才运行。
最后,运行Puppet apply命令。
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for puppet.example.com in environment
production in 0.82 seconds
Notice: /Stage[main]/test-module::Httpd/Exec[iptables]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/test-module::Httpd/Service[iptables]: Would have
triggered 'refresh' from 1 events
由于我们正在使用版本7及更高版本的Linux机器,因此我们需要对其进行配置以进行http通信。 SELinux默认情况下限制对HTTP服务器的非标准访问。如果定义了自定义端口,则需要配置SELinux以提供对该端口的访问。
Puppet包含一些用于管理SELinux功能的资源类型,例如布尔值和模块。在这里,我们需要执行semanage命令来管理端口设置。该工具是policycoreutils-python软件包的一部分,默认情况下未安装在red-hat服务器上。为了达到上述目的,我们需要在test-module :: http类中添加以下代码。
exec { 'semanage-port':
command => "semanage port -a -t http_port_t -p tcp ${httpd_port}",
path => "/usr/sbin",
require => Package['policycoreutils-python'],
before => Service ['httpd'],
subscribe => Package['httpd'],
refreshonly => true,
}
package { 'policycoreutils-python':
ensure => installed,
}
上面的代码执行以下操作-
require => Package [‘policycoreutils-python’]确保我们已安装必需的Python模块。
Puppet使用管理功能以httpd_port作为验证对象来打开端口。
before =>服务可确保在httpd服务启动之前执行此命令。如果HTTPD在SELinux命令之前启动,则SELinux服务请求和服务请求将失败。
最后,运行Puppet apply命令
# puppet apply test-module/tests/init.pp --noop
...
Notice: /Stage[main]/test-module::Httpd/Package[policycoreutilspython]/
ensure: current_value absent, should be present (noop)
...
Notice: /Stage[main]/test-module::Httpd/Exec[semanage-port]/returns:
current_value notrun, should be 0 (noop)
...
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Puppet首先安装Python模块,然后配置端口访问,最后启动httpd服务。
通过以上步骤,我们已经完成了http服务器的配置。现在,我们已经有了一个平台,可以安装基于Web的应用程序,Puppet也可以对其进行配置。为了进行测试,我们将一些示例html索引网页复制到服务器。
在files目录中创建一个index.html文件。
Congratulations
Congratulations
Your puppet module has correctly applied your configuration.
在清单目录中创建清单app.pp并添加以下内容。
class test-module::app {
file { "/var/www/test-server/index.html":
ensure => file,
mode => 755,
owner => root,
group => root,
source => "puppet:///modules/test-module/index.html",
require => Class["test-module::httpd"],
}
}
这个新类包含单个资源减速。这会将文件从模块的文件目录复制到Web服务器并设置其权限。必需的属性可确保在应用test-module :: app之前,test-module :: http类成功完成配置。
最后,我们需要在主init.pp清单中包含一个新清单。
class test-module (
$http_port = 80
) {
include test-module::httpd
include test-module::app
}
现在,运行apply命令以实际测试正在发生的事情。以下将是输出。
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for brcelprod001.brcle.com in environment
production in 0.66 seconds
Notice: /Stage[main]/Test-module::Httpd/Exec[iptables]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/Test-module::Httpd/Package[policycoreutilspython]/
ensure: current_value absent, should be present (noop)
Notice: /Stage[main]/Test-module::Httpd/Service[iptables]: Would have
triggered 'refresh' from 1 events
Notice: /Stage[main]/Test-module::Httpd/File[/var/www/myserver]/ensure:
current_value absent, should be directory (noop)
Notice: /Stage[main]/Test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice:
/Stage[main]/Test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensur
e: current_value absent, should be file (noop)
Notice: /Stage[main]/Test-module::Httpd/Exec[semanage-port]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/Test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 8
Notice:
/Stage[main]/test-module::App/File[/var/www/myserver/index.html]/ensur:
current_value absent, should be file (noop)
Notice: Class[test-module::App]: Would have triggered 'refresh' from 1
Notice: Stage[main]: Would have triggered 'refresh' from 2 events Notice:
Finished catalog run in 0.74 seconds
高亮显示的行显示了index.html文件被复制到Web主机的结果。
完成上述所有步骤后,即可使用我们创建的新模块。如果我们要创建模块的存档,可以使用以下命令来完成。
# puppet module build test-module