如何使用 Puppet 将文件复制到所有客户端?

如何使用 Puppet 将文件复制到所有客户端?

如何使用 puppet 将文件复制到所有客户端?我已经设置了 puppet 服务器和客户端,并且测试了连接,工作正常。我不是 puppet 专家,我只是一个初学者,我只是想知道如何从 puppet 服务器将文件复制到所有客户端?我还想知道如何删除文件?

答案1

Puppet 文件服务器

本指南涵盖了 Puppet 文件服务功能的使用。


Puppet Master 服务包含一个用于传输静态文件的文件服务器。如果文件资源声明的源属性中包含 puppet: URI,则节点将从 Master 的文件服务器中检索该文件:

# 将远程文件复制到 /etc/sudoers
文件 { “/etc/sudoers”:
    模式 => 440,
    所有者 => 根,
    组 => 根,
    源 => “puppet:///模块/模块名称/sudoers”
}

所有 Puppet 文件服务器 URI 的结构如下:

puppet://{server hostname (optional)}/{mount point}/{remainder of path}

如果省略服务器主机名(即puppet:///{mount point}/{path};请注意三斜杠),URI 将解析为评估节点认为是其主服务器的任何服务器。由于这可以使清单代码更具可移植性和可重用性,因此应尽可能省略主机名。

puppet 的其余部分:URI 通过两种方式之一映射到服务器的文件系统,具体取决于文件是由 提供module还是通过 公开custom mount point

服务模块文件

由于绝大多数文件服务应通过模块完成,因此 Puppet 文件服务器提供了一个特殊的、半神奇的挂载点,称为模块,默认情况下可用。如果 URI 的挂载点是模块,Puppet 将:

  • 将路径的下一段解释为模块的名称……
  • ...在服务器的模块路径中找到该模块(如下面“模块查找”中所述...
  • ...并解析从该模块的文件/目录开始的路径的其余部分。
  • 也就是说,如果在中央服务器的/etc/puppet/modules目录中安装了一个名为test_module的模块,则以下puppet:URI ...

    puppet:///modules/test_module/testfile.txt
    

    ...将解析为以下绝对路径:

    /etc/puppet/modules/test_module/files/testfile.txt
    

    如果test_module安装在 中/usr/share/puppet/modules,则相同的 URI 将解析为:

    /usr/share/puppet/modules/test_module/files/testfile.txt
    

虽然使用模块挂载点不需要额外的配置,但可以通过添加[modules]配置块在文件服务器配置中指定一些访问控制;请参阅安全性。

从自定义挂载点提供文件服务

Puppet 还可以从服务器的文件服务器配置中指定的任意挂载点提供文件(见下文)。当从自定义挂载点提供文件时,Puppet 不会执行模块挂载中使用的额外 URI 抽象,而是将挂载名称后面的路径解析为简单的目录结构。

文件服务器配置

文件服务器配置数据的默认位置是/etc/puppet/fileserver.conf;可以通过将--fsconfig标志传递给 Puppet Master 来更改此位置。

该文件的格式fileserver.conf几乎与 完全相同rsync,并且大致类似于 INI 文件:

[mount_point]
    path /path/to/files
    allow *.domain.com
    deny *.wireless.domain.com

当前可以为给定的挂载点指定以下选项:

  • 磁盘上挂载位置的路径
  • 任意数量的允许指令
  • 任意数量的拒绝指令

path 是唯一必需的选项,但由于默认安全配置是拒绝所有访问,因此没有允许指令的挂载点将无法用于任何节点。

路径可以包含 、 和 中的任何一个或全部%h%H它们%d分别由客户端的主机名、其完全限定域名和其域名动态替换。所有这些都取自客户端的 SSL 证书(因此,如果主机名/证书名不匹配,请小心)。这在创建模块时很有用,其中每个客户端的文件完全分开保存,例如私有 ssh 主机密钥。例如,使用配置

[private]
   path /data/private/%h
   allow *

来自客户端 client1.example.com 的文件请求/private/file.txt将查找文件/data/private/client1/file.txt,而来自的相同请求client2.example.com将尝试检索文件服务器上的文件 /data/private/client2/file.txt。

目前路径不能包含尾部斜杠,否则将导致错误。还请注意puppet.conf不要指定尾部斜杠的目录位置。

安全

保护 Puppet 文件服务器包括允许和拒绝每个挂载点的访问(在不同的特定级别)。可以通过三种方式识别节点组的权限或拒绝权限:通过 IP 地址、通过名称或通过单个全局通配符 (*)。自定义挂载点默认拒绝所有访问。

除自定义挂载点外,还有两个特殊挂载点可通过fileserver.conf:modules和进行管理plugins。这两个挂载点都不应指定路径选项。模块挂载点的行为在上面从自定义挂载点提供文件下进行了描述。插件挂载不是真正的挂载点,而是一个钩子,允许 fileserver.conf 指定哪些节点被允许从 Puppet Master 同步插件。这两个挂载点都默认存在,并且都默认允许所有访问;如果为其中一个特殊挂载设置了任何允许或拒绝指令,则其安全设置将表现得与普通挂载一样(即,它将默认拒绝所有访问)。请注意,这些是唯一拒绝 * 不是多余的挂载点。

如果节点没有直接连接到 Puppet 文件服务器,例如使用反向代理和 Mongrel(请参阅使用 Mongrel),则文件服务器会将所有连接视为来自代理服务器的 IP 地址,而不是 Puppet 代理节点的 IP 地址。在这种情况下,最好根据主机名限制访问。此外,需要允许充当反向代理的机器(通常为 127.0.0.0/8)访问适用的挂载点。

优先事项

更具体的拒绝和允许语句优先于不太具体的语句;也就是说,尽管 *.domain.com 有拒绝语句,但 node.domain.com 的允许语句仍会允许其连接。在给定的具体级别下,拒绝语句优先于允许语句。

将 IP 地址指令与主机名和域名指令混合使用可能会导致不可预测的行为,因此请尽量避免这样做。(目前,如果 node.domain.com 的 IP 地址是 192.168.1.80,并且 fileserver.conf 包含允许 192.168.1.80 并拒绝 node.domain.com,则基于 IP 的允许指令实际上将优先。此行为将来可能会发生变化,不应依赖。)

主机名

可以使用完整的主机名来指定主机名,也可以使用 * 通配符指定整个域:

[export]
    path /export
    allow host.domain1.com
    allow *.domain2.com
    deny badhost.domain2.com

IP 地址

IP 地址可以像主机名一样指定,可以使用完整的 IP 地址或通配符地址。您还可以使用 CIDR 样式的表示法:

[export]
    path /export
    allow 127.0.0.1
    allow 192.168.0.*
    allow 192.168.1.0/24

全局允许

指定单个通配符将允许任何节点访问挂载点:

[export]
    path /export
    allow *

请注意,自定义挂载点的默认行为相当于拒绝 *。

相关内容