Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Puppet 木偶中的灵活关系? 设置_Puppet - Fatal编程技术网

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

  • php
    可以单独存在,因为某些机器(如CI/CD构建从属)仅在CLI模式下运行
    php
  • php
    的任务之一是为各种Linux发行版和用例管理
    php.ini
    文件
  • apache
    可以单独存在,因为不是每个web部署都在
    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
    的两倍,而当它没有被包含在目录中时,它不会被包含。然而,这确实会创建大量重复代码,并且与松耦合/高内聚性原则相矛盾
  • 通过使用,我可以将一个类的知识传递给另一个类,根据提供的选项改变它的行为。但是,这确实删除了
    include
    flexibility/resility,并且您仍然需要在类中使用
    if{}else{}
    来实现该选项,从而产生与上述选项相同的缺点
那么,有什么我不知道的“不那么烦人”的地方吗

有什么样的模式或解决方案可以在Puppet中实现这种“灵活”的关系?您可以在其中通知或订阅不保证存在于目录中的对象(例如include如何用于多次定义类)


最好使用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')}”
。不管怎样,就像你说的,你已经有了一个成熟的安装,而我已经偏离了重点。祝你好运:)那不行,因为它是无效的。具体参见
资源类型,大写。这不能是类,也无法收集类。
。我已经阅读了虚拟资源和资源收集器的手册好几次了,我在其他场合也使用了它们,但是对于这个特定的问题,我仍然看不到它们如何帮助解决这个问题。我确实使用了一个角色&