【问题标题】:Analyze Puppet changes and apply them by hand分析 Puppet 更改并手动应用它们
【发布时间】:2017-09-21 03:37:34
【问题描述】:

我们有两个环境,A 和 B,用于同一组应用程序。

环境 A 的更改(主要是对存储应用程序配置的 JSON 文件的修改)完全由 Puppet 管理。这些更改的一部分需要通过手动编辑 JSON 文件应用于没有 Puppet 运行的环境 B。

我们不能简单地将这些配置文件从 A 复制到 B,因为在 A 上,这些文件也被其他不能在 B 上运行的 Puppet 模块修改。

这里的问题基本上是提取在 A 中运行的特定 Puppet 对 JSON 文件所做的更改,并将它们应用到 B。运行简单的 diff 将不起作用,因为 JSON 中的对象是无序的。因此,我考虑在比较对象之前对它们进行排序(相关问题:How to compare two JSON objects with the same elements in a different order equal?)。还有其他更简单的选择吗?

【问题讨论】:

  • 上次我检查时,Puppet 会在应用文件更改时将文件差异输出到其日志中。这可能取决于您的日志记录设置。从日志中剔除这些更改并将它们应用到不同的机器上应该相当简单。

标签: json puppet


【解决方案1】:

当 Puppet 运行时,会编译一个称为目录的 JSON 文档。对于您的 JSON 文件,这些文件在目录中保存为文本。 (是的,在 JSON 目录文档中编码的 JSON 文档。)

没有看到您的代码,我无法确切地说出您需要做什么,但笼统地说:

首先,编写一个 Puppet 类,其中仅包含您希望在 B 上应用的类和资源,减去“其他不得在 B 上运行的 Puppet 模块”。

其次,从命令行使用puppet master --compile 使用修改后的代码在A 上编译目录。或者,您也许可以使用 Rspec-puppet 在工作站/笔记本电脑上的隔离环境中编译目录。你可以google一下怎么做,我写了一个相关的blog post可能有用。

(无论如何,请记住,您需要通过设置事实来输入 Hiera 数据,以便遍历环境 A 的正确 Hiera 文件。)

我假设您现在有一个编译目录。所以现在,最后,您需要从中取出 JSON 配置文件。有很多方法可以做到这一点,从编写一些相当简单的 Ruby 代码到谷歌搜索可以为你做这件事的工具,再到戳 Puppet 本身的内部来获取它。

但我想我可能只是在 vim 中打开文件,进行全局搜索并替换以用真正的换行符替换 \n 序列,然后删除其他所有内容。

希望对您有所帮助。

【讨论】:

  • 这是一篇内容丰富且准确的文章,但我不确定它是否解决了这个问题。约翰的评论似乎暗示了这个问题的前进道路。也许将其纳入此答案?
  • 其实我发现这两句话描述了不同的问题:(1)“我们不能简单地将这些配置文件从A复制到B,因为A上的文件也被其他不能运行的Puppet模块修改关于B”和(2)“基本上这里的问题是提取对在A中运行的特定Puppet所做的JSON文件的更改,并将它们应用于B。”我将 (2) 解释为如果您只是编译修改后的目录就不需要做的事情。至于如何使用差异来做到这一点,我看不出这有什么帮助,因为正如 OP 所说,在 Puppet 生成差异之前需要对 JSON 进行排序。
  • 好的,我想我明白你现在的建议了。您建议他从编译目录的输出 json 中收集文件差异。也许noop 在这里也会有所帮助?无论如何,对我来说听起来不错。
  • 实际上我假设一个修改后的目录,其中删除了“其他不能在 B 上运行的 Puppet 模块”中的类和资源,将包含准确的 JSON 文件内容,然后可以简单地复制为- 在节点 B 上。根本不需要使用差异。我想 OP 需要就我的假设是否都有效提出建议。
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 2023-03-20
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多