Linux 使用puppet在启动时运行自定义服务

Linux 使用puppet在启动时运行自定义服务,linux,debian,puppet,Linux,Debian,Puppet,我正在将我们进行linux配置的旧过程迁移到puppet来管理,但我在试图找出如何做到这一点时遇到了问题。我们将一些自定义脚本添加到系统的init.d文件夹中,以管理一些进程,然后这些进程需要在启动时对其执行以下命令: update-rc.d $file defaults 因此,我对puppet所做的是将所有这些脚本驻留在一个目录中,然后将它们复制到init.d。然后,我想用前面的命令调用这些文件中的每个文件的“exec”,并使用文件名作为参数。这就是我到目前为止所做的: #copy init

我正在将我们进行linux配置的旧过程迁移到puppet来管理,但我在试图找出如何做到这一点时遇到了问题。我们将一些自定义脚本添加到系统的init.d文件夹中,以管理一些进程,然后这些进程需要在启动时对其执行以下命令:

update-rc.d $file defaults
因此,我对puppet所做的是将所有这些脚本驻留在一个目录中,然后将它们复制到init.d。然后,我想用前面的命令调用这些文件中的每个文件的“exec”,并使用文件名作为参数。这就是我到目前为止所做的:

#copy init files    
file { '/etc/init.d/':
      ensure => 'directory',
      recurse => 'remote',
      source => ["puppet:///files/init_files/"],
      mode => 755,
      notify => Exec[echo],
    }

exec { "echo":
  command => "update-rc.d $file defaults",
  cwd => "/tmp", #directory to execute from
  path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:",
  refreshonly => true
}
这将复制所有文件,并在添加/更新某些内容时调用exec,但我不知道如何将文件名作为参数传递到exec命令中。看起来我真的很接近,但我就是找不到任何东西来帮助我做我需要做的事情。这是实现这一目标的正确途径吗


谢谢。

如果您使用
确保=>'directory'
,您可能无法实现这一点。您需要为每个单独的init脚本声明
文件
资源。而且exec不是启用服务的方式。使用
服务
资源

 file { '/etc/init.d':
   ensure => 'directory',
   mode   => '0755'
 }

 file { '/etc/init.d/init_script_1':
   ensure => 'present',
   owner  => 'root',
   group  => 'root',
   mode   => '0755',
   notify => Service['init_script_1']
 }

 file { '/etc/init.d/init_script_2':
   ensure => 'present',
   owner  => 'root',
   group  => 'root',
   mode   => '0755',
   notify => Service['init_script_2']
 }

 service { 'init_script_1':
   ensure => running,
   enable => true
 }

 service { 'init_script_2':
   ensure => running,
   enable => true
 }

希望这能有所帮助。

是的,各方面都有帮助。另外,创建一个已定义的类型来合并
文件
/
类型
对。然后,您可以非常简单地枚举您的文件,如
my_initscript{['foo',bar',baz']:}
。谢谢大家,这正是我要找的。我不得不考虑用upstart来管理我的脚本,但这对我来说更有效。@Felix:我设置了一个定义的类型来获取不同的文件并启动服务,但我对你所说的迭代有点迷茫。我将其设置为
definefoo($file=$title,$source){file{'$file':source=>$source}}}foo{'bar':source=>'baz'}
但是如何使用不同名称/源的列表调用foo?@aykyu如果每个initscript的
源代码
不同,那么它应该是一个参数。硬编码,否则。可以同时声明具有相同源的所有文件:
foo{['one','two','three']:source=>'baz'}
。如果你在工作中遇到更多困难,请作为新问题提问。