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