使用 puppet 向“exit 0”上方的 rc.local 添加命令的正确方法是什么?

使用 puppet 向“exit 0”上方的 rc.local 添加命令的正确方法是什么?

作为一名 Puppet 新手,我目前正在编写一个部署脚本,它将启动几个 永远的rc.local在启动时提供服务。

我担心的是,在 Ubuntu 中,文件底部rc.local带有一个。exit 0

我不找到办法使用 stdlib 的file_line指令来确保我的行出现多于退出命令(或其他任何特定命令,如果需要)。

我可以使用一个exec块和一些丑陋的 sed 来完成它,但是在 puppet 中一定有一种更标准、更优雅的方法吗?

答案1

您可以使用PuppetLabs Concat 模块动态地将部分内容插入到rc.local文件中,如下所示:

将文件定义为一个连接文件,并添加一个标题(hash-bang、“由 Puppet 管理”注释等) - 注意下面的内容可能不起作用,我不确定 Puppet 的换行符处理!

concat { '/etc/rc.local':
  ensure => present,
}

concat::fragment { '00_rc.local_header':
  target  => '/etc/rc.local'
  content => '#!/bin/bash\n# This file is manageed by Puppet, do not modify!',
  order   => '01'
}

添加您的自定义部分,确保指定正确的值target以及order高于您的标题的值:

concat::fragment { '05_rc.local_custom':
  target  => '/etc/rc.local',
  content => template('path/to/template.erb'),
  order   => '05'
}

concat::fragment { '15_rc.local_custom_2':
  target  => '/etc/rc.local',
  source  => 'puppet:///modules/mymodule/myfile.txt',
  order   => '06'
}

添加exit 0页脚:

concat::fragment { '99_rc.local_footer':
  target  => '/etc/rc.local',
  content => 'exit 0\n',
  order   => '99'
}

完了!

您可以concat::fragment在多个子类(以及多个模块)中使用,尽管这真的不推荐!)只要您设置正确的target值并将该文件声明为concat资源即可。该order参数允许您在文件中定位元素。

检查模块的使用自述文件了解更多信息。

答案2

如果您安装了 cron 服务,则可以使用 @reboot 时间规范将其用于此目的。使用 puppet 管理此操作更容易,因为您只需在 /etc/cron.d 中创建一个单独的文件,而不必尝试编辑单个整体文件。

经测试,以下方法有效:

file { "/etc/cron.d/at_startup_myscript":
    content => "@reboot root /usr/local/bin/myscript.sh \n",
}

相关内容