![Puppet 中的资源引用传递](https://linux22.com/image/599365/Puppet%20%E4%B8%AD%E7%9A%84%E8%B5%84%E6%BA%90%E5%BC%95%E7%94%A8%E4%BC%A0%E9%80%92.png)
是否可以将 puppet 资源引用传递给其他资源?我的用例是使用 puppet 构建 jenkins 构建管道。要将 jenkins 作业链接到管道中,我需要将后续作业传递给作业。定义的子集是:
jobs::build { "Build ${release_name}":
release => $release_name,
jenkins_jobs_path => $jenkins_jobs_path,
successors => 'Deploy',
}
jobs::deploy { "Deploy ${release_name}":
release => $release_name,
jenkins_jobs_path => $jenkins_jobs_path,
successors => 'Smoke Test',
}
在 def 中,您会看到我按名称定义了后继者,即“Deploy”,对于第二项作业则为“Smoke Test”。我想要做的是传递对资源的引用并从中提取名称:
jobs::build { "Build ${release_name}":
release => $release_name,
jenkins_jobs_path => $jenkins_jobs_path,
successors => Jobs::Deploy["Deploy ${release_name}"],
}
jobs::deploy { "Deploy ${release_name}":
release => $release_name,
jenkins_jobs_path => $jenkins_jobs_path,
successors => Jobs::Smoke_test["Smoke Test ${release_name}"],
}
然后在 jobs::deploy 和 jobs::build 定义中,我将通过引用访问资源并查询其类型等。
在 Puppet 中可以实现这个吗?
答案1
successors
是的,使用元参数代替before
。Puppet 中的所有资源都允许使用四个参数来建立排序。 before
、require
、subscribe
和notify
是四个关系元参数。 订阅和通知对于在资源导致另一个资源刷新时发出信号特别有用。
请参阅Puppet 语言指南了解更多信息。具体来说,关键字“排序”和“关系”应该可以帮助您找到解决此问题所需的信息。
答案2
如果我理解正确的话,该successors
参数与 Puppet 的元参数无关before
,而是用于定义 Jenkins 的工作关系。
话虽如此,但 Puppet 无法实现您所要求的功能。您无法从资源引用中查询值,即使您可以将它们作为参数传递给定义。
我认为你可以这样做:
jobs::build { "Build ${release_name}":
release => $release_name,
jenkins_jobs_path => $jenkins_jobs_path,
successors => "Deploy ${release_name}",
}
或者使用标签和<| |>
操作符。但这完全取决于定义的内容jobs::build
和 Jenkins 所需的配置。
答案3
这听起来更像是一份工作集体比 Puppet 更适合。广义上讲,使用 Puppet 可以对状态进行建模,而使用 Mcollective 可以对活动进行建模。如果我正确理解了您的要求,编写一个 MCollective 代理来协调您的构建管道可能是更好的方法。Puppet 在这里帮不了您什么忙。