为了这个例子,我们假设我有两个类; php
和apache
。
php
可以单独存在,因为某些机器(如CI / CD构建从属服务器)仅在CLI模式下运行php
。php
的任务之一是管理各种Linux发行版和用例的php.ini
个文件。apache
可以单独存在,因为并非每个Web部署都在php
上运行。apache
的任务之一是管理各种Linux发行版的apache2
服务。在节点上配置php
和apache
的用例中,更改的php.ini
应导致重新启动apache2
服务,因为{{1否则不会在文件中获取更改。
所以,按照Relationships and Ordering的文档,我有两个选择来实现它:
mod_php
来自notify
文件apache2
服务
php.ini
到subscribe
服务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 { }
服务对象包括两倍apache
到subscribe
在目录中,并不是当它不是。然而,这会产生大量重复的代码,并且与松耦合/高内聚原理相矛盾。php.ini
灵活性/弹性,但您仍然需要班级include
来实施该选项,从而产生与上述选项相同的缺点。那么,我不知道有什么“不那么黑”吗?
答案 0 :(得分:0)
在Puppet中实现这种“灵活”关系有哪些模式或解决方案?您可以通知或订阅目录中不保证存在的对象的内容(例如,如何包含多次定义类的工作)?
最好使用Roles&配置文件模式,并为Apache单独和Apache + PHP提供单独的配置文件,后者(仅)设置您想要的关系。然后你知道为什么给定节点(或应该)存在关系,并且在需要它的地方确保声明两个组件。对于不需要Apache的节点,可以通过不相关的配置文件分配PHP。