什么是傀儡,我为什么要关心

Puppet 是一种配置管理解决方案。用户描述服务器或软件的所需状态,配置管理实现此状态。这带来以下优势:

  • 每次都可以根据需要多次重复配置
  • 所有软件和服务器的配置都存储在一个中央位置。这使得配置的备份和版本控制变得容易实现
  • 对所有服务器的更改将在几分钟内传播到整个基础架构,而无需直接登录任何计算机
  • 一切都用同一种语言描述,使配置新软件变得容易
  • 模块类似于库,允许合并配置。所有主要软件包的模块已经存在,使得安装非常容易
  • 服务器可以在彼此之间共享信息,从而影响其他服务器的配置。例如,新服务器可以自动向负载均衡器和监控解决方案注册自己

Puppet 使用 Ruby 来描述服务器的所需状态,称为节点。它通过使用称为资源类型的原语来实现。默认情况下,每隔 30 分钟,木偶代理就会对木偶服务器进行身份验证。然后它发送一个称为事实的属性列表。服务器查看事实和名为 manifests 的配置文件,并编译节点的所需状态。然后,它将该配置发送回节点,代理在该节点上应用它。

为了说明这有多强大,这里有几个增加复杂性的例子,展示了木偶可以为你做什么。

示例:用户

此示例在节点 myserver 上创建用户用户,并将其添加到组。 ** **

node 'myserver' {
    user { 'username':
      ensure => 'present',
      groups => ['wheel'],
    }
}

将存储在 puppet 服务器上的该文件是清单。此示例中的资源类型user 。每种资源类型都具有可选和必需的属性。在此示例中,确保是必需的,是可选的。此特定配置仅适用于 myserver 。你可以通过将配置放在节点定义之外来将配置应用于所有节点。

可以采用几个资源定义并将它们存储为模块。模块类似于库。这些模块可以在线共享,通常每个主要软件包都可以找到一个。共享模块的官方方式是通过 puppet forge: https//forge.puppet.com/

示例:Postgres

此示例在节点 myserver 上安装 postgres 服务器,并创建一个由 username 标识的数据库 db ,由 password 标识。它使用 postgresql 模块。 ** **

node 'myserver' {
    class { 'postgresql::server': }
    
    postgresql::server::db { 'db':
        user     => 'username',
        password => 'password',
    }
}

在这种情况下, postgresql 是一个模块。模块本身负责识别操作系统,下载和安装程序,然后根据清单进行配置。这是一个基本示例,但该模块允许大量自定义。

请注意,没有必要知道 SQL 或如何实际安装 postgres 服务器来执行此操作。官方模块维护良好,提供健全且安全的基础配置。

也可以在清单中使用事实。事实就像变量一样。

示例:使用事实的条件

此示例使用 rsyslog 模块在所有非 Windows 计算机上配置 rsyslog。

if $osfamily != 'windows' {
  class { 'rsyslog::client': }
}

$ osfamily 是一个事实。每次木偶代理人运行时都会收集这些事实。请注意,由于此定义位于节点定义之外,因此它将应用于所有节点。但是, rsyslog::client 只会在不运行 Windows 的节点上执行。

由于 puppet 使用 ruby,因此可以在清单中使用控制流和变量等编程元素。

通过添加 **PuppetDB,**你可以在多个节点之间共享信息。这允许一个节点影响不同节点上的配置。经典示例包括负载平衡器或监控解决方案。

示例:使用导出的资源注册具有监视功能的主机

此示例在节点上创建导出的资源,然后在监视服务器上导入该资源,将主机添加到监视。它使用的是 Icinga2 木偶模块。

@@icinga2::object::host { $::fqdn:
  display_name     => $::fqdn,
  ipv4_address     => $::ipaddress_eth0,
}

node 'icinga2' {
    Icinga2::Object::Host <<| |>> { }
}

@@ icinga2 :: object::host 创建一个主机定义对象。这是由执行此代码的每个节点创建的。该 @@ 标志着它作为一个出口资源。通常,节点不会在 puppet 中共享信息。导出的资源允许这样做。

请注意,主机定义中的所有属性值都是事实。这意味着它们对于执行它的每个节点都是不同的。

最后,导出的资源由 icinga2 节点导入。Icinga2 模块负责确保创建和重新加载正确的配置文件。 **