傀儡中的灵活关系?

时间:2015-05-27 12:03:59

标签: puppet

设置

为了这个例子,我们假设我有两个类; phpapache

  • php可以单独存在,因为某些机器(如CI / CD构建从属服务器)仅在CLI模式下运行php
  • php的任务之一是管理各种Linux发行版和用例的php.ini个文件。
  • apache可以单独存在,因为并非每个Web部署都在php上运行。
  • apache的任务之一是管理各种Linux发行版的apache2服务。

问题:

在节点上配置phpapache的用例中,更改的php.ini应导致重新启动apache2服务,因为{{1否则不会在文件中获取更改。

所以,按照Relationships and Ordering的文档,我有两个选择来实现它:

  • mod_php来自notify文件
  • apache2服务
  • php.inisubscribe服务
  • php.ini文件

当两个类都包含在节点清单中时,这可以正常工作,但是在只包含其中一个类的情况下,它会产生无效关系,如:

apache2

问题

在Puppet中实现这种“灵活”关系有哪些模式或解决方案?您可以 Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid relationship: Service[apache] { subscribe => File[php.ini] }, because File[php.ini] doesn't seem to be in the catalog notify对目录中不保证存在的对象(类似subscribe多次定义类的工作方式)?

到目前为止,我已经提出了两个可以工作的解决方案,但两者都不合适(在我看来):

  • 通过使用include(或if tagged('php') { } else { }),我可以将if defined(Class['php']) { } else { }服务对象包括两倍apachesubscribe在目录中,并不是当它不是。然而,这会产生大量重复的代码,并且与松耦合/高内聚原理相矛盾。
  • 通过使用parameterized classes,我可以将有关一个的知识传递给另一个类,根据提供的选项更改它的行为。这确实会消除php.ini灵活性/弹性,但您仍然需要班级include来实施该选项,从而产生与上述选项相同的缺点。

那么,我不知道有什么“不那么黑”吗?

1 个答案:

答案 0 :(得分:0)

  

在Puppet中实现这种“灵活”关系有哪些模式或解决方案?您可以通知或订阅目录中不保证存在的对象的内容(例如,如何包含多次定义类的工作)?

最好使用Roles&配置文件模式,并为Apache单独和Apache + PHP提供单独的配置文件,后者(仅)设置您想要的关系。然后你知道为什么给定节点(或应该)存在关系,并且在需要它的地方确保声明两个组件。对于不需要Apache的节点,可以通过不相关的配置文件分配PHP。