Debugging puppet error : Could not find dependency

Debugging puppet error : Could not find dependency

背景

Puppet Newbie,试图在一个盒子上维护一些旧的 Puppet 版本。目的是使用它的旧 plist 文件卸载旧程序并启动新程序。

问题

我在 .pp 文件中有以下代码

$old_launch_agent_path = "${home}/Library/LaunchAgents/com.company.program.plist"

exec {
  'stop-old-program':
  command => "/bin/launchctl unload ${old_launch_agent_path}",
  refreshonly => true,
  subscribe => [ File[$old_launch_agent_path] ];
}

Puppet 拒绝了:

Error: Could not find dependency File[/Users/executer/Library/LaunchAgents/com.company.program.plist] for Exec[stop-old-program] at /private/tmp/mobile-puppet-manifests/puppet-manifests-test/modules/program/manifests/init.pp:51

更改在 git 分支上并正在应用 sudo puppet-apply -d -f -b mac-upgrade

ls -l /Users/executer/Library/LaunchAgents/com.company.program.plist`
-rw-r--r--  1 executer  staff  999 May 19 14:36 /Users/executer/Library/LaunchAgents/com.company.program.plist

在 Puppet 中添加一些内容到您的心智模型中,这将帮助您思考这个问题。 Puppet 目录是一个 DAG,有向无环图。您定义的每个资源(例如文件、包、服务等)都是该 DAG 中的一个节点。像以前的元参数,通知,订阅等设置图中节点之间的关系。

您的错误意味着 Puppet 无法在目录中找到资源文件 ['your file'] 以添加您定义的关系。通常的原因是你没有定义它。或者拼错了,这是我最喜欢的错误。查看您的代码,您只是分配了一个变量,然后将其作为资源引用。

删除订阅最简单。或者你可以定义文件,除非你想改变我不会打扰的文件的内容。

我推断您已经指定了 Exec 的 subscribe 属性,因为它会在指定文件发生更改时导致 Exec 到 运行(因为最后 puppet apply,我猜)。这表现出对 Puppet 信号模型的一个相对普遍的误解。

Puppet 不会跟踪在前 运行 之前或之后的文件或其他资源的外观。它最多知道它们在当前 运行 的某个时刻 的样子,是否就是它们应该的样子,以及它们是否(尚未)更新当前 运行.

subscribe 元参数做两件事:

  1. require 所做的相同:确保检查指定资源,并在必要时同步(并刷新,如果适用)在元参数所在的资源之前显示已选中、同步或刷新。

  2. 如果指定资源最初不同步但 Puppet 成功同步了它,则刷新出现元参数的资源。

后者是 Puppet 文档在谈论一种资源 "changed" 导致另一种资源刷新时的意思。他们指的是 Puppet 正在更改的资源 ,以使其同步。因此,尝试订阅不受 Puppet 管理的资源是没有意义的。 Puppet 永远无法更改此类资源,至少不会让 Puppet 意识到发生了什么。

在更技术层面上,您用来表示订阅的句法结构 File[$old_launch_agent_path] 是 "resource reference" 的一个示例。这些是指在同一目录中其他地方声明的资源,如果实际上没有声明此类资源,则它们无效。不考虑目标系统上是否存在相应的物理资源。