Puppet 木偶中的灵活关系? 设置
为了这个例子,让我们假设我有两个类Puppet 木偶中的灵活关系? 设置,puppet,Puppet,为了这个例子,让我们假设我有两个类php和apache php可以单独存在,因为某些机器(如CI/CD构建从属)仅在CLI模式下运行php php的任务之一是为各种Linux发行版和用例管理php.ini文件 apache可以单独存在,因为不是每个web部署都在php上运行 apache的任务之一是为各种Linux发行版管理apache2服务 问题是: 在节点上同时设置了php和apache的用例中,更改的php.ini应该会导致apache2服务重新启动,因为mod_php不会以其他方式获
php
和apache
可以单独存在,因为某些机器(如CI/CD构建从属)仅在CLI模式下运行php
php
的任务之一是为各种Linux发行版和用例管理php
文件php.ini
可以单独存在,因为不是每个web部署都在apache
上运行php
- apache的任务之一是为各种Linux发行版管理
服务apache2
php
和apache
的用例中,更改的php.ini
应该会导致apache2
服务重新启动,因为mod_php
不会以其他方式获取文件中的更改
因此,在上的文档之后,我有两种选择来实现此功能:
来自notify
文件的php.ini
服务apache2
从
服务订阅apache2
文件php.ini
错误:无法从远程服务器检索目录:服务器上的错误400:无效关系:服务[apache]{subscribe=>File[php.ini]},因为文件[php.ini]似乎不在目录中
问题
有什么样的模式或解决方案可以在Puppet中实现这种“灵活”的关系?您可以通知
或订阅
目录中不一定存在的对象(例如包含
如何多次定义类)
到目前为止,我已经提出了两个可行的解决方案,但都不适用(在我看来):
- 通过使用
(或者if-taged('php'){}-else{}
,我可以包含一个if-defined(Class['php']){}-else{}
服务对象,当它被包含在目录中时,它是apache
到subscribe
的两倍,而当它没有被包含在目录中时,它不会被包含。然而,这确实会创建大量重复代码,并且与松耦合/高内聚性原则相矛盾php.ini
- 通过使用,我可以将一个类的知识传递给另一个类,根据提供的选项改变它的行为。但是,这确实删除了
flexibility/resility,并且您仍然需要在类中使用include
来实现该选项,从而产生与上述选项相同的缺点if{}else{}
最好使用Roles&Profiles模式,单独为Apache和Apache+PHP创建一个单独的概要文件,后者(仅)设置您想要的关系。然后您就知道了为什么给定节点(或应该)存在这种关系,以及在需要这种关系的地方,您可以确保声明了这两个组件。对于不需要Apache的节点,您可以通过一个不相关的配置文件来分配PHP。您肯定会在一个带有PHP.ini的节点上包含apache2服务吗?除非您有运行php而没有web前端的节点。在这些情况下,您可以使用不同的名称和不同的notify子句来定义php.ini两次。@AlastairMcCormack:虽然这个问题的意思是更一般的,而不是集中在提供的特定示例上:是的,我有一些节点在没有Apache的情况下运行php。例如,CI/CD构建从机(如问题中所述)。还有更具体的问题:在RedHat节点上,CLI和Apache PHP使用相同的PHP.ini文件。例如,在Ubuntu上,它们是分开的。考虑Apache的存在,同时确保这些
php.ini
,将极大地增加已经存在的混乱,并降低类独立性(增加紧密耦合)。进一步来说,IMHO Puppet的依赖关系图和DSL是它的致命弱点。它的功能非常强大,但过了一段时间后就很难维护了,特别是当有一百万种不同的语法变体来实现相同的功能时。缺少带有插值的简单外部化配置(因此不是Hiera)意味着处理多个环境会导致大量配置复制和混乱。对我来说,Ansible更适合@AlastairMcCormack Hiera是简单的、外部的,并且有插值:,所以这不是一个论点。但是,Ansible或Saltstack可能是各种用例的更好解决方案。我两个都试过了,但由于种种原因,在可预见的未来,我将继续与Puppet合作。(其中之一是有相当多的节点在相当大的puppet代码库上运行;))插值只对Hiera之外定义的变量起作用,或者通过使用查找函数递归查找值——最好是精细查找,最坏是容易出错。例如,wordpress::database_server:“%{hiera('instances::mysql::public_hostname')}”
。不管怎样,就像你说的,你已经有了一个成熟的安装,而我已经偏离了重点。祝你好运:)那不行,因为它是无效的。具体参见资源类型,大写。这不能是类,也无法收集类。
。我已经阅读了虚拟资源和资源收集器的手册好几次了,我在其他场合也使用了它们,但是对于这个特定的问题,我仍然看不到它们如何帮助解决这个问题。我确实使用了一个角色&