Puppet - перезапустить сервис после каждого цикла - PullRequest
0 голосов
/ 06 мая 2019

Я пишу модуль Puppet для обеспечения конфигурации и перезапуска службы при необходимости. Я хотел бы сделать что-то подобное:

    class app_cfg {
      $app_files = ['file1', 'file2', 'file3']
      $app_files.each |String $file| {
        exec {"sed -i 's/bar/foo/g' $file":
          path   => ['/bin'],
          onlyif => 'grep "bar" $file 2>/dev/null',
          cwd    => '/opt/app/config/',
        }
      } ~>
      service { 'app':
        ensure => running,
        enable => true,
      }
    }

Я мог бы добавить «notify» в exec, но я не хочу перезапускать свой сервис для каждого файла, и похоже, что стрелка notify chaining не работает после каждого цикла. Ребята, вы знаете, как это сделать?

Большое спасибо:)

Я нашел обходной путь, вставив цикл for в ресурс exec вместо использования каждого:

    class app_cfg {
      service { 'app':
        ensure => running,
        enable => true,
      }
      exec {"for file in file1 file2 file3; do sed -i 's/bar/foo/g' \$file; done":
        path   => ['/bin'],
        onlyif => 'grep "bar" $file 2>/dev/null',
        cwd    => '/opt/app/config/',
        provider => shell,
        notify => Service['app']
      }
    }

Мне все еще довольно любопытно первое решение! Вам когда-нибудь удавалось сделать что-то подобное?

Спасибо!

1 Ответ

2 голосов
/ 06 мая 2019

Я мог бы добавить «notify» в exec, но я не хочу перезапускать свой сервис для каждого файла, и похоже, что стрелка notify chaining не работает после каждого цикла.

Важно понимать, что код в манифесте Puppet описывает только то, как создать каталог , который, в свою очередь, описывает желаемую конфигурацию вашего сервера.В каталоге перечислены объявленные классы и ресурсы, их параметры и свойства, а также взаимосвязи между ними.Логика в манифесте не отображается на действия, выполняемые при применении результирующего каталога;это отражается только в том, какие классы и ресурсы каталогизированы, и каковы их параметры, свойства и отношения.

Таким образом, когда вы используете одну из стрелок в манифесте, вы даете указание разработчику каталога:записывать отношения между двумя ресурсами в каталоге, а не явную инструкцию для применения или обновления ресурса.Ни один объявленный ресурс не будет применен более одного раза или обновлен больше, чем применен.Поэтому будет очень хорошо поместить соответствующее цепное выражение в ваш цикл, но вы не можете сделать это, просто поместив объявление Service внутри цикла, потому что это приведет к его множественному объявлению.Таким образом, вы можете выполнить любое из следующих действий:

Объявить службу (один раз) и использовать ссылку на ресурс в ней в выражении цепочки внутри цикла:

class app_cfg {
  service { 'app':
    ensure => running,
    enable => true,
  }

  ['file1', 'file2', 'file3'].each |String $file| {
    exec {"sed -i 's/bar/foo/g' $file":
      path   => ['/bin'],
      onlyif => 'grep "bar" $file 2>/dev/null',
      cwd    => '/opt/app/config/',
    } ~> Service['App']
  }
}

Как и выше, но используйте соответствующий метапараметр ресурса вместо цепного выражения:

class app_cfg {
  service { 'app':
    ensure => running,
    enable => true,
  }

  ['file1', 'file2', 'file3'].each |String $file| {
    exec {"sed -i 's/bar/foo/g' $file":
      path   => ['/bin'],
      onlyif => 'grep "bar" $file 2>/dev/null',
      cwd    => '/opt/app/config/',
      notify => Service['app'],
    }
  }
}

Или объявите отношения с помощью сборщика:

class app_cfg {
  ['file1', 'file2', 'file3'].each |String $file| {
    exec {"sed -i 's/bar/foo/g' $file":
      path   => ['/bin'],
      onlyif => 'grep "bar" $file 2>/dev/null',
      cwd    => '/opt/app/config/',
      tag    => 'app_notifier',
    }
  }

  Exec<|tag == 'app_notifier|>
  ~> service { 'app':
    ensure => running,
    enable => true,
  }
}
...