人偶 sed 和替换

Puppet sed and replace

我正在学习 Puppet,目前正在尝试安装 tomcat。在尝试使用 exec 块中的 sed 替换 startup.sh 上的 Catalina 主页时,我遇到了以下错误。

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Syntax error at '|export CATALINA_HOME=' at /etc/puppetlabs/code/environments/production/modules/tomcat/manifests/init.pp:26:58 on node agent

startup.sh

的当前值
export CATALINA_HOME="/home/john"
export JAVA_HOME="/usr"
......
.....

预期输出

export CATALINA_HOME="/home/john/apache-tomcat-6.0.44"
export JAVA_HOME="/usr/java/default"

我的代码片段

 .......
  exec { 'modify_file':
    command => "sed -i 's|export CATALINA_HOME="/home/john"|export CATALINA_HOME="/home/john/apache-tomcat-6.0.44"|g' /home/john/apache-tomcat-6.0.44/bin/startup.sh"
    path => '/bin',
}

非常感谢任何帮助,提前致谢。

此外,我已经浏览了关于 exec 块路径属性的 puppet 文档,但我不确定为什么要使用它以及我的清单文件中的路径值应该是什么。

您的 sed 表达式可能由于引用不匹配而损坏。

您可以使用以下方法简化 sed 命令:

sed -i '/CATALINA_HOME=/s,/home/john,&/apache-tomcat-6.0.44,;/JAVA_HOME=/s,/usr,&/java/default,' /home/john/apache-tomcat-6.0.44/bin/startup.sh

表达式包含 CATALINA_HOMEJAVA_HOME 的 2 个命令。这两个命令使用相同的语法将所需的字符串附加到变量声明。

/<regex>/s 将与 <regex>.

在线执行替换

,是命令分隔符。我通常使用 / 除非要搜索的模式是目录路径。

& 正在打印模式 space,即匹配的模式。

您是否已经尝试使用 file_line 资源类型的 puppetlabs-stdlib 模块而不是执行 exec 调用?

你可以看到它是如何工作的here

匹配参数接收旧值,将被行参数值替换。例如:

file_line { 'catalina':
  ensure => present,
  path   => '/etc/catalina/startup.sh',
  line   => 'export CATALINA_HOME=\"/home/john/apache-tomcat-6.0.44\"',
  match  => 'export CATALINA_HOME=\"/home/john\"',
}