Puppet sed и заменить

Я изучаю Puppet и сейчас пытаюсь установить Tomcat. При попытке заменить дом Catalina в startup.sh с помощью sed в блоке exec, я столкнулся с ошибкой ниже.

Ошибка: не удалось получить каталог с удаленного сервера: ошибка 400 на СЕРВЕРЕ: синтаксическая ошибка в '| export CATALINA_HOME =' в /etc/puppetlabs/code/environments/production/modules/tomcat/manifests/init.pp:26:58 on агент узла

Текущее значение 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, но я не уверен, почему он используется и каким должно быть значение моего пути в моем файле манифеста.


person Goku    schedule 08.11.2017    source источник


Ответы (2)


Ваше 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

Выражение содержит 2 команды для CATALINA_HOME и JAVA_HOME. Обе команды используют один и тот же синтаксис для добавления требуемой строки к объявлению переменной.

/<regex>/s выполнит замену на линии с <regex>.

, - это разделитель команд. Я обычно использую /, если поисковый шаблон не является путем к каталогу.

& печатает пространство шаблона, то есть совпавший шаблон.

person oliv    schedule 08.11.2017
comment
Спасибо за ваш вклад .. но все же целевой файл не изменяется ниже - это блок command => "sed '/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", path => '/bin', Я упустил что-то глупое? - person Goku; 08.11.2017
comment
забыл параметр -i в команде sed для замены в файле, повторите попытку и предоставьте сообщение об ошибке, если оно есть. - person oliv; 08.11.2017
comment
На самом деле большое спасибо за то, что уделили время здесь .. Если возможно, вы можете любезно объяснить / s, и, & часть .. Как то, что именно он делает .. Еще раз спасибо .. - person Goku; 08.11.2017
comment
еще какое-то объяснение в ответе - person oliv; 08.11.2017
comment
Еще раз большое спасибо !! - person Goku; 08.11.2017

Вы уже пробовали использовать тип ресурса file_line модуля puppetlabs-stdlib вместо выполнения вызова exec?

Вы можете увидеть, как это работает здесь.

Параметр соответствия получит старое значение и будет заменен значением параметра строки. Например:

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\"',
}
person Mdmansur    schedule 10.11.2017
comment
Большое спасибо за ваш пример, теперь я его получил, кстати, я попытался безуспешно и продолжил с exec. - person Goku; 10.11.2017
comment
Не могли бы вы прислать проблему, которая у вас возникла? - person Mdmansur; 10.11.2017