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
元参数做两件事:
与 require
所做的相同:确保检查指定资源,并在必要时同步(并刷新,如果适用)在元参数所在的资源之前显示已选中、同步或刷新。
如果指定资源最初不同步但 Puppet 成功同步了它,则刷新出现元参数的资源。
后者是 Puppet 文档在谈论一种资源 "changed" 导致另一种资源刷新时的意思。他们指的是 Puppet 正在更改的资源 ,以使其同步。因此,尝试订阅不受 Puppet 管理的资源是没有意义的。 Puppet 永远无法更改此类资源,至少不会让 Puppet 意识到发生了什么。
在更技术层面上,您用来表示订阅的句法结构 File[$old_launch_agent_path]
是 "resource reference" 的一个示例。这些是指在同一目录中其他地方声明的资源,如果实际上没有声明此类资源,则它们无效。不考虑目标系统上是否存在相应的物理资源。
背景
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
元参数做两件事:
与
require
所做的相同:确保检查指定资源,并在必要时同步(并刷新,如果适用)在元参数所在的资源之前显示已选中、同步或刷新。如果指定资源最初不同步但 Puppet 成功同步了它,则刷新出现元参数的资源。
后者是 Puppet 文档在谈论一种资源 "changed" 导致另一种资源刷新时的意思。他们指的是 Puppet 正在更改的资源 ,以使其同步。因此,尝试订阅不受 Puppet 管理的资源是没有意义的。 Puppet 永远无法更改此类资源,至少不会让 Puppet 意识到发生了什么。
在更技术层面上,您用来表示订阅的句法结构 File[$old_launch_agent_path]
是 "resource reference" 的一个示例。这些是指在同一目录中其他地方声明的资源,如果实际上没有声明此类资源,则它们无效。不考虑目标系统上是否存在相应的物理资源。