如何使用 puppet 将文件复制到所有客户端?我已经设置了 puppet 服务器和客户端,并且测试了连接,工作正常。我不是 puppet 专家,我只是一个初学者,我只是想知道如何从 puppet 服务器将文件复制到所有客户端?我还想知道如何删除文件?
答案1
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 *
请注意,自定义挂载点的默认行为相当于拒绝 *。