Puppet 目录同步无法删除不存在的文件

50次阅读
没有评论

问题描述

在使用 Puppet 进行配置管理时,希望能够将其配置目录(在 Windows Server 2016 节点上)从 Puppet 主服务器的模块文件夹同步过来。用户使用了类似如下的 Puppet 代码来实现这一目标:

file { "c:\\":        
  ensure => directory,        
  recurse => remote,        
  source => "puppet:///modules/configs"        
}

这段代码可以成功同步存在于源目录的文件,但却无法删除源目录中已被删除的文件(根据文档,理论上应该可以做到)。用户尝试了以下代码:

file { "c:\\":        
  ensure => directory,        
  recurse => true,        
  purge => true,        
  source => "puppet:///modules/configs"        
}

然而,使用这段代码后出现了如下错误:

Error: /Stage[main]/Main/Node[nodename]/File[c:]: Failed to generate additional resources using ‘eval_generate’: CreateFile(c:/Documents and Settings, 20000000000, 1, , 3, 210000000, 0): Access is denied.

用户并没有找到足够的资源来解释这个错误,因为 Puppet Agent 以系统权限运行,理应能够访问每个路径,且该脚本与 c:/Documents and Settings 路径无关。用户需要解决这个问题,并请求协助。

解决方案

请注意以下操作可能存在版本差异或者潜在风险,务必谨慎操作。

使用 Puppet 的 purge 参数

在 Puppet 中,你可以使用 purge 参数来实现删除目录中不存在的文件的功能。该参数可以确保目标目录与源目录完全一致,不需要的文件会被删除。

在你的 Puppet 代码中添加 purge => true 参数,同时将 recurse 设置为 true,以实现目录的递归同步以及删除不需要的文件。不过,在 Windows 系统上,由于权限问题可能会导致上述报错,这需要一些特殊的处理。

操作步骤

  1. 编辑你的 Puppet 代码文件,将 file 资源部分修改如下:
file { "c:\\":        
  ensure => directory,        
  recurse => true,        
  purge => true,        
  source => "puppet:///modules/configs"        
}
  1. 保存并部署这个 Puppet 配置,确保 Puppet Agent 能够加载这个配置并运行。

处理权限问题

如果在 Windows 系统上出现 “Access is denied” 错误,可能是由于权限问题导致的。此时,你需要确保 Puppet Agent 以正确的权限运行。

操作步骤

  1. 确保 Puppet Agent 以系统管理员权限运行。你可以手动以管理员身份运行 Puppet Agent,或者调整其服务配置以确保它以管理员权限运行。

  2. 如果 Puppet Agent 的配置或服务已经以管理员权限运行,但仍然出现权限问题,你可以尝试在目标目录上调整权限,确保 Puppet Agent 有足够的权限来访问该目录。可以右键点击目录 -> 属性 -> 安全 -> 编辑,然后添加 “系统” 用户,并为其分配适当的权限。

通过上述解决方案,你应该能够解决目录同步问题,并且能够让 Puppet 成功删除不存在于源目录中的文件。如果问题仍然存在,建议查看 Puppet 的日志以获取更多的详细信息,以便定位问题所在。

正文完