puppet 4.7-如何在跑步结束时执行某些操作?

puppet 4.7-如何在跑步结束时执行某些操作?,puppet,Puppet,我需要执行一些东西作为木偶应用程序运行的最后一件事。我试图通过定义一个stage“last”来实现这一点,但在资源模式下声明类的语法限制是一个问题 有没有一个很好的方法来使用这样的阶段?或者是否有其他方法确保某个类最后执行 例如,这给了我一个重复声明的错误(有时,我不知道为什么): 有时,firstrun类在主阶段运行时没有错误 您可以使用来执行此操作。 (1) 如果要在最后执行整个类,可以将类包含在init.pp中,并使用用户排序箭头(->)在所有其他类之后执行它 例如: file { '/e

我需要执行一些东西作为木偶应用程序运行的最后一件事。我试图通过定义一个stage“last”来实现这一点,但在资源模式下声明类的语法限制是一个问题

有没有一个很好的方法来使用这样的阶段?或者是否有其他方法确保某个类最后执行

例如,这给了我一个重复声明的错误(有时,我不知道为什么):

有时,firstrun类在主阶段运行时没有错误

您可以使用来执行此操作。 (1) 如果要在最后执行整个类,可以将类包含在init.pp中,并使用用户排序箭头(->)在所有其他类之后执行它

例如:

file { '/etc/profile.d/settomcatparam.sh':
  ensure => file,
  before => File_line['/etc/profile.d/settomcatparam.sh'],
}

file_line { '/etc/profile.d/settomcatparam.sh':
  path => '/etc/profile.d/settomcatparam.sh',
  ine => 'export LD_LIBRARY_PATH=/usrdata/apps/sysapps/apr/lib:/usrdata/apps/sysapps/apr-util/lib:/usrdata/apps/sysapps/tomcat-native/lib:$LD_LIBRARY_PATH',
}
文件:/etc/puppet/modules/tomcat/init.pp

(2) 如果希望在最后执行类中的特定资源,可以在类中使用相同的箭头(->),或在资源中使用
之前的
需要的

例如:

file { '/etc/profile.d/settomcatparam.sh':
  ensure => file,
  before => File_line['/etc/profile.d/settomcatparam.sh'],
}

file_line { '/etc/profile.d/settomcatparam.sh':
  path => '/etc/profile.d/settomcatparam.sh',
  ine => 'export LD_LIBRARY_PATH=/usrdata/apps/sysapps/apr/lib:/usrdata/apps/sysapps/apr-util/lib:/usrdata/apps/sysapps/tomcat-native/lib:$LD_LIBRARY_PATH',
}


您还可以使用before、require和->
的组合。请确保不要创建依赖循环。

我不太喜欢运行阶段,但它们是完成此工作的正确工具。不太清楚到底是什么导致了您描述的重复声明错误,但是,例如,如果您的类定义和类声明都出现在同一个文件中,那么这可能是一个问题

以下是使用运行阶段的解决方案的外观:

环境/生产/模块/站点/清单/阶段。pp 环境/生产/模块/xyz/manifests/firstrun.pp 环境/生产/清单/节点.pp
请注意,尽管通常首选包含类声明,但必须使用类资源声明将类分配给非默认阶段。因此,您还必须小心避免多次声明此类类。

对于声明给定类应在所有其他类之后应用,这并不是一种切实可行的方法。@JohnBollinger:这是在puppet中使用排序的一种方法。如果需求是“一次类必须应用于所有其他类之后”,您有什么建议?是的,这是定义类和资源应用的相对顺序的一个非常好的方法。但是,应用通用规则是不可行的,比如OP想要一个任何可感知大小的清单集,或者一个使用第三方模块的清单集,因为它需要与每个类建立关系。至于我的建议,请看我的答案。@JohnBollinger:这让唤醒从未真正理解过阶段,因为它确实没有遵循最佳实践(可能是为什么你也不是粉丝),但这个解释对我来说确实有意义。然而,我自己也支持类似资源的声明,因为它们允许参数化类并显示重复声明。@MattSchuchard,类似资源的声明是个坏消息,正是因为它们导致了重复类声明的问题,其次是因为它们在清单中引入了求值顺序依赖性。重复的类声明不应该有问题,因为类是单例的,如果您使用类似于资源的类声明,它们也不会有问题。数据应该通过自动数据绑定绑定到类参数(至少是公共类的参数)。在Puppet数据提供程序准备好生产之前(这需要很长时间),我不能真正提倡将类参数的数据绑定作为最佳实践。我将按照@JohnBollinger的建议尝试这一点,因为对我来说,阶段似乎是处理我的处境的好方法。我有很多类,它们大多可以以任何顺序运行,而将依赖项放在任何地方只是为了将类推到最后,这似乎是额外的一层复杂性。对我来说。但是从我对您的示例的理解来看,我应该用资源声明替换其他地方的
include xyz::firstrun
语句?也许这就是导致重复声明错误的原因。@mike.schmidt,在您在问题中提供的代码中没有
include xyz::firstrun
语句,因此很难说清楚,但是为了将类分配给阶段,您必须通过类似于资源的声明来声明该类。如果对类使用类似资源的声明,则只能使用一个,并且必须在目录构建期间对其进行评估,然后才能对同一类进行任何类似包含的声明。在这种情况下,最好没有该类的include-like声明。
file { '/etc/profile.d/settomcatparam.sh':
  ensure => file,
  before => File_line['/etc/profile.d/settomcatparam.sh'],
}

file_line { '/etc/profile.d/settomcatparam.sh':
  path => '/etc/profile.d/settomcatparam.sh',
  ine => 'export LD_LIBRARY_PATH=/usrdata/apps/sysapps/apr/lib:/usrdata/apps/sysapps/apr-util/lib:/usrdata/apps/sysapps/tomcat-native/lib:$LD_LIBRARY_PATH',
}
exec { 'configure apr-util':
  cwd     => "/tmp/apr-util-${tomcat::aprutilversion}/",
  command => "bash -c './configure --prefix=/usrdata/apps/sysapps/apr-util --with-apr=/usrdata/apps/sysapps/apr'",
} ->
exec { 'make apr-util':
  cwd     => "/tmp/apr-util-${tomcat::aprutilversion}/",
  command => 'make',
}
class site::stages {
  stage { 'last':
    # Stage['main'] does not itself need to be declared
    require => Stage['main'],
  }
}
class xyz::firstrun {

  exec { 'exec_firstrun':
    onlyif => '/usr/bin/test -e /tmp/firstrun.sh',
    command => '/tmp/firstrun.sh',
    path => ['/usr/bin/','/usr/sbin'],
    creates => '/tmp/firstrun.done',
  }

}
node 'foobar.my.com' {
  include 'site::stages'
  include 'something::else'

  # Must use a resource-like declaration to assign a class to a stage
  class { 'xyz::firstrun':
    stage => 'last'
  }
}