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

时间:2016-09-27 21:44:12

标签: puppet

我需要执行一些事情,因为木偶应用运行的最后一件事。我尝试通过定义一个阶段' last'来实现这一点,但是在资源模式下声明一个类的语法限制是个问题。

有没有一种好方法可以使用这样的舞台?或者是否有其他方法可以确保最后执行某个类?

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

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',
  }

}

class { 'xyz::firstrun':
    stage => last,
}

有时候,第三级课程没有错误,但在主要阶段。

2 个答案:

答案 0 :(得分:4)

我不是跑步阶段的忠实粉丝,但他们是这项工作的合适工具。有些不清楚究竟是什么给出了您描述的重复声明错误,但是,例如,如果您的类定义和类声明都出现在同一个文件中,那么这可能是个问题。

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

环境/生产/模块/位点/舱单/ stages.pp

class site::stages {
  stage { 'last':
    # Stage['main'] does not itself need to be declared
    require => Stage['main'],
  }
}

环境/生产/模块/ XYZ /表现/ firstrun.pp

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',
  }

}

环境/生产/表现/ nodes.pp

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'
  }
}

请注意,尽管通常首选类似于类的声明,但必须使用类似资源的声明将类分配给非默认阶段。因此,您必须小心避免多次声明此类。

答案 1 :(得分:1)

您可以使用puppet relationship and ordering执行此操作。 (1)如果你想在最后执行整个类,你可以在init.pp和用户排序箭头( - >)中包含你的类,以便在所有其他类之后执行它。

示例:

  

file:/etc/puppet/modules/tomcat/init.pp

class tomcat {

  include ::archive
  include ::stdlib

  class { '::tomcat::tomcatapiconf': }->

  class { '::tomcat::serverconfig': }
}

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

示例:

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',
}

OR

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',
}

您还可以使用before, require and ->的组合。只需确保不创建依赖循环。