在 Linux 上使用示例介绍 Puppet 配置文件

举报
Tiamo_T 发表于 2022/10/06 08:17:01 2022/10/06
【摘要】 Puppet 用于自动执行几个例行的系统管理员配置任务。 企业级配置管理系统中的 Puppet。 它允许您定义 IT 基础架构的状态。一旦定义,Puppet 将自动持续执行正确的状态。

Puppet 用于自动执行几个例行的系统管理员配置任务。

企业级配置管理系统中的 Puppet。

它允许您定义 IT 基础架构的状态。一旦定义,Puppet 将自动持续执行正确的状态。

1.Puppet架构

Puppet 通常有一个服务器组件和多个代理。您必须将网络上的服务器指定为 puppet master,并且网络上的每个节点都将安装 puppet 代理。

将 puppet 配置应用到客户端的最常见方法是使用 puppet 主守护进程 (puppetmasterd) 和 puppet 客户端守护进程 (puppetd)。您还可以使用 puppet 工具手动应用清单。

配置在 puppet master 上定义,编译然后在 puppet 客户端连接时自动推送到它们。

Puppet 支持各种不同的平台和操作系统,它会自动运行适当的命令以在每个环境中应用您的清单。

清单只不过是关于文件、包、配置操作的详细信息,以 puppet 可以理解的语言编写。

每个 Puppet 节点默认每 30 分钟与 puppet master 联系一次,以确认其配置是最新的。如果配置不同或有任何新配置可用,则重新编译,然后应用到 puppet 节点。

在本教程中,我们将解释如何使用 puppet 工具创建一些基本清单并应用于客户端。

大部分系统配置可以使用puppet命令行工具查看。所有配置组件都组织成资源。资源被分组到集合中。资源由类型、标题和一系列属性组成。

2. Puppet 资源文件示例

以下是有关如何查看 puppet 资源的基本示例。在这种情况下,我们正在查看的 puppet 资源是一个文件 (/etc/nsswitch)。

# puppet resource file /etc/nsswitch.conf
file { '/etc/nsswitch.conf':
  ensure   => 'file',
  content  => '{md5}0d6009cdfd12646d251e86303bc0c48c',
  ctime    => 'Sun May 18 13:20:02 -0400 2014',
  group    => '0',
  mode     => '644',
  mtime    => 'Tue May 04 15:22:21 -0400 2010',
  owner    => '0',
  selrange => 's0',
  selrole  => 'object_r',
  seltype  => 'etc_t',
  seluser  => 'system_u',
  type     => 'file',
}

Puppet 默认带有许多资源类型,包括用于管理文件、服务、包、cron 作业和文件系统等的类型。

在上面的例子中,file 是资源类型,/etc/nsswitch.conf 是要管理的资源的标题。

其他一切都是资源类型的属性和属性上存在的值。您还可以扩展 puppet 以添加您自己的资源类型。

要查看所有可用的资源类型,请使用以下命令:

# puppet resource --types
augeas
computer
cron
exec
file
filebucket
group
host
nagios_hostdepend
..
..

3. Puppet Manifest 文件示例

让我们看看如何创建一个简单的清单文件并执行 puppet 命令以将配置应用到服务器。

以下示例在 /etc/puppet/manifests 目录下创建一个简单的清单文件 site.pp,它将在 /var/tmp 下创建一个测试文件。

最初,如下所示,我们没有测试文件。

# ls -ld /var/tmp/testfile
ls: cannot access /var/tmp/testfile: No such file or directory

以下是清单 (site.pp) 文件中的资源声明:

# cat site.pp
file { "/var/tmp/testfile":
        ensure => "present",
        owner => "root",
        group => "root",
        mode => "664",
        content => "This is a test file created using puppet.
                    Puppet is really cool",
}

出于演示目的,我们在同一节点上运行 puppet master 和 agent。

当您第一次使用 –noop 选项运行 puppet apply 命令时,这将在不实际应用配置的情况下进行试运行。

# puppet apply site.pp --noop
Notice: Compiled catalog for pemaster.mydomain.com in environment production in 0.06 seconds
Notice: /Stage[main]/Main/File[/var/tmp/testfile]/ensure: current_value absent, should be present (noop)
Notice: Class[Main]: Would have triggered 'refresh' from 1 events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.03 seconds

上面你可以看到在不实际更改节点的情况下新配置会做什么。

现在,执行不带 –noop 选项的命令以真正应用配置,如下所示。

# puppet apply site.pp
Notice: Compiled catalog for pemaster.mydomain.com in environment production in 0.07 seconds
Notice: /Stage[main]/Main/File[/var/tmp/testfile]/ensure: created
Notice: Finished catalog run in 0.05 seconds

成功执行后,您将看到在 /var/tmp/testfile 下创建了新的临时文件,其中包含在 site.pp 中定义的内容。

# ls -ld /var/tmp/testfile
-rw-rw-r--. 1 root root 69 Jun 26 14:25 /var/tmp/testfile

# cat /var/tmp/testfile
This is a test file created using puppet.
  Puppet is really cool

4. 使用 Puppet 控制远程节点上的服务

这是在代理节点上将服务从停止状态更改为运行状态的示例。

当此配置清单保存在 puppet 配置目录下特定位置的主服务器中时,运行在所有节点上的代理会联系主节点并获取配置并将其应用于所有客户端节点,这样服务就会启动在 puppet 配置执行成功后的所有代理节点上。

# puppet resource service multipathd
service { 'multipathd':
  ensure => 'stopped',
  enable => 'false',
}

在本例中,我们将控制服务 multipathd。您可以使用 puppet 来控制系统上运行的任何服务。例如httpd、mysqld等。

# puppet resource service multipathd > site.pp

确保 site.pp 具有以下值。如果没有,请相应地进行编辑。

# vi site.pp
service { 'multipathd':
  ensure => 'running',
  enable => 'true',
}

首先进行试运行以确保它按预期工作。

# puppet apply site.pp --noop
Notice: Compiled catalog for pemaster.mydomain.com in environment production in 0.07 seconds
Notice: /Stage[main]/Main/Service[multipathd]/ensure: current_value stopped, should be running (noop)
Notice: Class[Main]: Would have triggered 'refresh' from 1 events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.06 seconds

最后,应用配置文件,该文件将启动服务(在此示例中为 multipathd),如果它尚未运行。

# puppet apply site.pp
Notice: Compiled catalog for pemaster.mydomain.com in environment production in 0.07 seconds
Notice: /Stage[main]/Main/Service[multipathd]/ensure: ensure changed 'stopped' to 'running'
Notice: Finished catalog run in 0.28 seconds

# puppet resource service multipathd
service { 'multipathd':
  ensure => 'running',
  enable => 'true',
}

# chkconfig --list | grep multipath
multipathd      0:off   1:off   2:on    3:on    4:on    5:on    6:off

5. 使用 Puppet 在远程节点上安装包

您可以使用 puppet 在所有代理节点上远程安装包。

以下是包安装的示例清单文件。

# cat site.pp
package { 'httpd':
  ensure => 'present',
}

在此示例中,如果远程站点上不存在 Apache 包 httpd,它将安装它。如下所示,它安装了软件包。

# puppet apply site.pp
Notice: Compiled catalog for pemaster.mydomain.net in environment production in 0.70 seconds
Notice: /Stage[main]/Main/Package[httpd]/ensure: created
Notice: Finished catalog run in 79.97 seconds

使用rpm 命令验证软件包是否已正确安装。

# rpm -qa | grep -i httpd
httpd-2.2.15-39.el6.centos.x86_64
httpd-tools-2.2.15-39.el6.centos.x86_64

6. 两种 Puppet 收藏

资源可以配置节点上单个配置项的特性。但是,大多数服务和应用程序都是由多种资源组成的。

例如,Web 服务器由软件包、运行软件的用户以及各种配置、日志记录和其他文件组成。

资源集合允许您收集资源、将它们分配给集合并将集合应用于代理节点。

有两种类型的资源收集:

  1. 课程
  2. 定义

7. Puppet 类集合示例

类是代表节点上的单个配置项的资源集合,而定义是在节点上具有多个表示的配置项的集合。

在前面的示例中,安装包后,默认情况下不启动服务。我们可以创建一个带有类的简单清单来安装包并在安装后启动服务。

在以下示例中,我们使用 require 属性指定了两个资源之间的关系。

# cat site.pp
class apache {
        package { 'httpd':
           ensure => 'present',
                }
        service {'httpd':
           ensure => 'running',
           require => Package["httpd"],
           }
}
include apache

这确保在应用资源更改之前满足条件。在这种情况下,服务 httpd 需要先安装 httpd 包,然后才能尝试启动服务。

# puppet apply site.pp
Notice: Compiled catalog for pemaster.mydomain.net in environment production in 0.93 seconds
Notice: /Stage[main]/Apache/Package[httpd]/ensure: created
Notice: /Stage[main]/Apache/Service[httpd]/ensure: ensure changed 'stopped' to 'running'
Notice: Finished catalog run in 32.82 seconds

# chkconfig --list | grep http
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

# rpm -qa | grep -i http
httpd-2.2.15-39.el6.centos.x86_64
httpd-tools-2.2.15-39.el6.centos.x86_64

8. Puppet 定义集合示例

定义是一种 puppet 资源集合。

定义应该用于在一个节点上有多个实例的配置项。

例如,httpd 服务器可能定义了多个虚拟主机。您可以创建一个定义来配置虚拟主机并传递适当的参数来配置每个虚拟主机。只要每组参数不同,puppet 就会在每次评估定义时配置新的虚拟主机。

以下是带有类和定义的简单清单示例。

# cat site1.pp
class testdefine {
    define testdefine ($data) {
      file {"$title":
        ensure  => file,
        content => $data,
      }
    }

    testdefine {'/var/tmp/puppetfile1':
      data => "The name of the file is puppetfile1 and it is created by puppet\n",
    }

    testdefine {'/var/tmp/puppetfile2':
      data => "The name of the file is puppetfile2 and it is created by puppet\n",
    }
    testdefine {'/var/tmp/puppetfile3':
      data => "The name of the file is puppetfile3 and it is created by puppet\n",
    }

}

include testdefine

执行上面的 puppet 类和定义清单,如下所示。

# puppet apply site1.pp
Notice: Compiled catalog for pemaster.mydomain.net in environment production in 0.24 seconds
Notice: /Stage[main]/Testdefine/Testdefine::Testdefine[/var/tmp/puppetfile2]/File[/var/tmp/puppetfile2]/ensure: defined content as '{md5}9079bd9c7650ae7d503c7df1a68bb9f0'
Notice: /Stage[main]/Testdefine/Testdefine::Testdefine[/var/tmp/puppetfile3]/File[/var/tmp/puppetfile3]/ensure: defined content as '{md5}75d495f0d3180b1f2dd052ac208d81fe'
Notice: /Stage[main]/Testdefine/Testdefine::Testdefine[/var/tmp/puppetfile1]/File[/var/tmp/puppetfile1]/ensure: defined content as '{md5}1fa93f1f2b82f8358866d58b2cb2f0b4'
Notice: Finished catalog run in 0.19 seconds

# ls -l /var/tmp/puppetfile*
-rw-r--r--. 1 root root 64 Jun 26 19:11 /var/tmp/puppetfile1
-rw-r--r--. 1 root root 64 Jun 26 19:11 /var/tmp/puppetfile2
-rw-r--r--. 1 root root 64 Jun 26 19:11 /var/tmp/puppetfile3

# cat /var/tmp/puppetfile*
The name of the file is puppetfile1 and it is created by puppet
The name of the file is puppetfile2 and it is created by puppet
The name of the file is puppetfile3 and it is created by puppet

9. Puppet 节点配置文件示例

到目前为止,我们已经看到以类和定义的形式定义资源和资源集合。

现在下一步是如何将这些资源和集合分配给客户端。

这是一个如何在 node.pp 中定义节点的示例。

Puppet 使用这个文件来确定哪个类(包含资源)应该去哪个服务器,例如,在客户端 1 上,您要运行包含 httpd 包、httpd 服务等资源的类 httpd,在客户端 2 上您要运行该类ngnix 包含 ngnix 包、ngnix 服务和其他 ngnix 配置文件等资源。

以下示例 nodes.pp 文件解释了这一点:

node 'puppetclient1.mydomain.net' {
include httpd_class
}
node 'puppetclient2.mydomain.net' {
include ngnix_class
}
node default {
    package { "perl": 
       ensure => present }
}

在您的节点定义中,您可以添加资源、类和定义。

使用 include 函数添加类。

在 puppetclient1.mydomain.net 中,我们包含了 httpd_class,在 puppetclient2.mydomain.net 中,我们包含了 ngnix_class。

您还可以使用单个包含函数包含多个类。如果没有匹配的节点定义,则采用定义的默认值。在这种情况下,如果有任何其他节点,如果它不存在,它将只安装 perl 包。

10. 导入 Puppet Manifest 文件

资源、类和定义存储在清单文件中。

一个特殊的清单文件,称为站点清单,是我们配置的核心。

启动 Puppet 主守护程序时,站点清单文件(默认位于 /etc/puppet/manifests/site.pp 中)需要存在。

在上面的示例中,我们使用 site.pp 只是为了解释如何应用清单。

在真实的 puppet 环境中,您的 site.pp 将只有以下内容,并且从该文件导入其他文件以供执行。

# cat site.pp
import "templates.pp"
import "nodes.pp"
import "classes/*"
import "groups/*"
import "users/*"
import "os/*"

以下是 puppet manifest 目录结构:

  • /manifests/classes/ – 包含所有类的目录
  • /manifests/site.pp – 主要清单文件
  • /manifests/templates.pp – 包含模板节点
  • /manifests/nodes.pp – 包含节点定义
  • /manifests/definitions/ – 包含所有定义
  • /manifests/groups/ - 包含配置组的清单
  • /manifests/os/ - 包含旨在配置具有特定操作系统的节点的类
  • /manifests/users/ - 包含配置用户的清单
  • /manifest/files/ - 包含 Puppet 可分发文件的文件服务器模块
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。