如何将通过 puppet 运行的 augeas 附加到同一个变量?

如何将通过 puppet 运行的 augeas 附加到同一个变量?

我有以下资源声明来setenv.sh通过 puppet 中的 augeas 设置文件。

augeas {'test':
    lens    => 'Properties.lns',
    incl    => '/tmp/setenv.sh',
    changes => "set CATALINA_OPTS \" $CATALINA_OPTS -XX:PermSize=192m -XX:MaxPermSize=192m \"",
}

我遇到了上述一些问题。

  1. 该文件基本上将配置附加到CATALINA_OPTS变量,这意味着当我运行 augeas 时,它会删除该变量的所有实例并将其替换为我的更改。我如何实现以下目标?

    CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/appdynamics/appagent/javaagent.jar"
    CATALINA_OPTS="$CATALINA_OPTS -XX:PermSize=192m -XX:MaxPermSize=192m"
    
  2. 由于引号的原因,尝试运行上述程序失败。调试输出显示:

    Debug: Augeas[test](provider=augeas): sending command 'set' with params ["/files/tmp/setenv.sh/CATALINA_OPTS", "  -XX:PermSize=192m -XX:MaxPermSize=192m "]
    Debug: Augeas[test](provider=augeas): Put failed on one or more files, output from /augeas//error:
    Debug: Augeas[test](provider=augeas): /augeas/files/tmp/setenv.sh/error = put_failed
    Debug: Augeas[test](provider=augeas): /augeas/files/tmp/setenv.sh/error/path = /files/tmp/setenv.sh
    Debug: Augeas[test](provider=augeas): /augeas/files/tmp/setenv.sh/error/lens = /usr/share/augeas/lenses/dist/properties.aug:50.25-.100:
    Debug: Augeas[test](provider=augeas): /augeas/files/tmp/setenv.sh/error/message = Malformed child node 'CATALINA_OPTS'
    

我怎样才能让字符串中使用双引号?

答案1

如果您只想将行附加到文件,请尝试使用 file_line 资源而不是 augeas,例如:

file_line { 'line1':
  path => '/tmp/setenv.sh',
  line => 'CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/appdynamics/appagent/javaagent.jar"',
}

file_line { 'line2':
  path => '/tmp/setenv.sh',
  line => 'CATALINA_OPTS="$CATALINA_OPTS -XX:PermSize=192m -XX:MaxPermSize=192m"',
}

为了避免双引号问题,只需用单引号括住整个文件行即可。如果要将行添加到文件中的特定位置,可以使用“after”属性。

file_line 在‘puppetlabs/stdlib’模块中可用。

答案2

如果要影响最后一个CATALINA_OPTS变量,则需要指定它:

augeas {'test':
    lens    => 'Properties.lns',
    incl    => '/tmp/setenv.sh',
    changes => "set CATALINA_OPTS[last()] \" $CATALINA_OPTS -XX:PermSize=192m -XX:MaxPermSize=192m \"",
}

您可以使用[2]而不是[last()],但至少后者可以确保它是文件中变量的最后一次出现。

相关内容