如何查看给定主机的Puppet中的所有关系?

时间:2019-03-01 09:31:11

标签: relationship puppet

我正在尝试使用一个Puppet仓库,这些年来,这些仓库变成了比蛇交配球还要糟糕的东西。此外,回购协议曾经控制着两个基础设施,这两个基础设施一起运行以提供两种完全不同的服务,但是当基础设施被拆分时,回购协议却没有。

我现在正面临着尝试做出将影响到一个基础架构(但不是同时影响两个基础架构)的更改的问题,部分问题是了解什么控制什么。

是否有任何一种工具可以将主机名或主机类作为输入,并以图形方式向我显示对该主机名或类有影响的所有其他实体(模块,模板,文件等)?

1 个答案:

答案 0 :(得分:2)

是的。是Rspec。

常规方法:

我意识到这可能不是您希望的答案*,但是您需要首先编写Rspec-puppet单元测试,为您的代码库提供完整的测试范围。

我已经做过不止一次了,这就是为什么我编写了可以在以下情况下提供帮助的工具的原因:create_specs。我还写了blog帖子,介绍如何使用它来帮助您。

转到您的具体问题:

  

是否有任何一种工具可以将主机名或主机类作为输入,并以图形方式向我显示对该主机名或类有影响的所有其他实体(模块,模板,文件等)?

当然有Puppet的内置图形逻辑,如果您有Puppet Enterprise,则有node graph

但是说实话,单元测试路线确实是完成此任务的唯一可靠方法。

方法如下:

  • 为所有已知节点编写一个 node 级Rspec-puppet测试。
  • 使用我的工具或以其他方式确保您生成仅编译目录的Rspec测试用例。使用技巧我documented将目录写为JSON文件。
  • 也要考虑数据。如果您的班级基于输入数据的差异对条件做出响应,那么您将使用不同的数据针对代码中的每个途径进行重新编译。

现在可检测“模块,模板,文件等”:

对于节点,类,模块和清单文件:

然后您可以使用这样的JQ查询查找该目录中使用的每个类以及清单中的行和文件:

▶ jq -jr '.resources[] | select(.line!=null) | .type, " ", .title, " (", .file, ":", .line, ")\n"' myclass.json 
Accounts::User joed (/Users/alexharvey/git/home/puppet-test/spec/fixtures/modules/test/manifests/init.pp:3)
Group joed (/Users/alexharvey/git/home/puppet-test/spec/fixtures/modules/accounts/manifests/user.pp:207)
User joed (/Users/alexharvey/git/home/puppet-test/spec/fixtures/modules/accounts/manifests/user.pp:249)
...

对于文件源参数引用的静态文件:

可以使用JQ查询找到这些内容,

▶ jq '.resources[] | select((.type=="File") and (.parameters.source!=null)) | .parameters.source' myclass.json 
"puppet:///mymodule/file"

对于模板:

关于模板,不幸的是在目录中没有明确提及它们。但是,一旦对所有节点进行了测试,就很容易检测到未使用的文件:只需删除可疑文件,运行所有测试,然后查看是否有任何故障。

对于Hiera键:

不幸的是,目前我对Hiera键还没有很好的解决方案。保留它们直到最后,然后通过删除然后再次运行测试来测试您认为未使用的测试。


总的来说,有一个很棒的博客系列here关于重构遗留代码,值得一看,但与Puppet无关。

好消息是,如果您执行上述所有操作,您将成为流程的另一端,成为一个大大改进,更加自信的开发人员。但以我的经验来看,如果您尝试找到不涉及缺少缺失测试的捷径,我认为前方将是痛苦的世界!祝你好运。


*我之所以这样假设,是因为我认为您不会问这个问题!