Как использовать Puppet для выполнения скрипта на виртуальной машине Linux - PullRequest
0 голосов
/ 27 июня 2019

Мне нужен puppet, чтобы выполнить скрипт, который находится внутри установленного приложения. Кроме того, мне нужно запустить только если он обнаруживает более старую версию и не находится на определенном сервере, а затем установить новую версию

Я перепробовал кучу вещей и теряю трек. Сначала я попытался использовать компакт-диск, чтобы перейти к сценарию where, а затем попытался запустить сценарий напрямую, но постоянно получаю ту же ошибку.

install.pp

# Install required packages
class tripwire::install {

  exec { 'uninstall_tripwire':
    command => './usr/local/tripwire/te/agent/bin/uninstall.sh',
    cwd     => '/usr/local/tripwire/te/agent/bin',
    path    => '/usr/bin/sh',

    onlyif  => [
                  "${::fqdn} != 'server.com'",
                  '/usr/bin/test -f 
/usr/local/tripwire/te/agent/bin/uninstall.sh',
                  "grep -c '8.6.0' /usr/local/tripwire/te/agent/data/version",
      ],
    notify  => Exec['install_tripwire'],

Я бы подумал, что это выполнит скрипт, но все, что я получаю, это: Ошибка: / Stage [main] / Tripwire :: Install / Exec [uninstall_tripwire]: Не удалось оценить: Не удалось найти команду 'server.com'

1 Ответ

2 голосов
/ 27 июня 2019

Мне нужен марионетка, чтобы выполнить скрипт, который находится внутри установленного приложения.Кроме того, мне нужно запускаться, только если он обнаруживает более старую версию и не находится на определенном сервере, а затем устанавливает новую версию

Конкретная задача, которую вы, похоже, пытаетесь выполнить с помощью Exec дублирует стандартное поведение ресурса Package.Вы действительно, действительно должны управлять программным обеспечением через пакеты, даже если вам придется самостоятельно создавать пакеты и поддерживать локальное хранилище пакетов.Время, затрачиваемое на упаковку, легко компенсируется экономией времени, затрачиваемой на управление программным обеспечением, даже с учетом Puppet.

Кроме того, что касается контроля над машинами, с которыми нужно работать, вам следует относиться к этому как к вопросу.классификации.Если этот класс не должен применяться к машине server.com, то он не должен быть объявлен в каталоге этой машины.Если он должен применяться к этой машине иначе, чем к другим, то он должен быть соответствующим образом параметризован, и эти параметры должны использоваться (во время классификации, может быть, с помощью Hiera), чтобы выбрать подходящее поведение для каждой целевой машины.

Тем не менее, что касается фактически представленного кода, сообщение об ошибке

Не удалось оценить: не удалось найти команду 'server.com'

, что этот элемент отражаетвашего onlyif массива ...

                  "${::fqdn} != 'server.com'",

... не является командой.onlyif требуется команда или их массив, который может быть выполнен в целевой системе, поэтому, возможно, вместо этого:

                  "test ${::fqdn} != server.com",

Кроме того, это выглядит неправильно:

    command => './usr/local/tripwire/te/agent/bin/uninstall.sh',

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

Более того, это, вероятно, не соответствует вашим намерениям:

    path    => '/usr/bin/sh',

Атрибут path определяет двоичный путь поиска, например, переменную среды PATH.Возможно, вы действительно захотите указать один, например, '/bin:/usr/bin:/sbin:/usr/sbin', но если вы хотели, чтобы команда выполнялась через оболочку, то вы искали

    provider => 'shell',
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...