Автоматическая инсталляция и конфигурирование софта во FreeBSD, используя puppet

В процессе внедрения puppet под FreeBSD обнаружились некоторые нюансы, на которые я хотел бы обратить внимание.

Мне потребовалось автоматически собирать, устанавливать, конфигурировать и запускать ряд сервисов. Инструкция на сайте puppet ссылалась на провайдер ports для типа ресурса package, в документации этот провайдер тоже был описан.

Однако, как показала практика, такой провайдер в puppet отсутствует. При изучении исходников обнаружилось, что его заменил провайдер portupgrade, о котором в документации ничего не сказано.

Рассмотрим, как его можно использовать на практике:

modules/monit/manifests/init.pp

class monit {
 
 $prefix = $monit_prefix ? {
    "" => "/usr/local/etc",
    default => $monit_prefix
  }

  # constants
  $monitd_dir = "$prefix/monit.d"
  $monit_bin = "/usr/local/bin/monit"
  $monitrc = "${prefix}/monitrc"

  file {
    $monitrc:
      alias => monitrc,
      mode => 600,
      content => template("monit/monitrc.erb"),
      notify => Exec[monit_reload];
    $monitd_dir:
      alias => monitd_dir,
      ensure => directory;
  }

  freebsd::rc_conf_local {
    monit_enable: value => YES,
    require => Package["sysutils/monit"];
  }

  service {
    monit:
      enable => true,
      ensure => running,
      require => [ Package["sysutils/monit"], File[monitd_dir],  File[monitrc] ]
  }

  package {
    "sysutils/monit":
      provider => portupgrade,
      ensure => present;
  }

  exec {
    monit_reload:
      command => "monit reload",
      onlyif => "monit -t",
      refreshonly => true,
      require => Service[monit];
  }

  # repcached recipe
  define repcached (
    $ip,
    $memcached_port = 11211,
    $repcached_port = 11212,
    $memory_size = 256,
    $user = nobody
  ) {

  exec {
    "monit_restart_repcached_${name}":
      command => "monit restart repcached_${name}",
      onlyif => "monit reload",
      refreshonly => true,
      require => Service[monit],
  }
    file {
      "${monit::monitd_dir}/repcached_${name}":.
        content => template("monit/repcached.erb"),
        require => File[$monit::monitd_dir],
        notify => Exec["monit_restart_repcached_${name}"];
    }
  }
}

modules/monit/templates/monitrc.erb

# PUPPET template

set daemon 60
set logfile syslog facility log_daemon
set mailserver localhost  with timeout 15 seconds
set eventqueue
    basedir /var/monit
set mail-format { From: root@$HOST }
set alert admin@domain.tld
set idfile /var/.monit.id
set statefile /var/.monit.state
set httpd port 2812
  allow localhost
include /usr/local/etc/monit.d/*

modules/monit/templates/repcached.erb

check process repcached_<%= name %> with pidfile "/tmp/repcached_<%= name %>.pid"
    start program = "/usr/local/bin/memcached -l <%= ip.split(' ')[0] %> -m <%= memory_size %> -x <%= ip.split(' ')[1] %> -u <%= user %> -p <%= memcached_port %> -X <%= repcached_port %> -d -P /tmp/repcached_<%= name %>.pid"
    stop program = "/bin/sh -c 'kill `cat /tmp/repcached_<%= name %>.pid`; rm /tmp/repcached_<%= name %>.pid'"

Пример использования:

node host1 {
  include monit
  monit::repcached {
    host1_sessions:.
      ip => "192.168.0.1 192.168.0.2",
      memory_size => 128;
  }
}

node host2 {
  include monit
  monit::repcached {
    host2_sessions:.
      ip => "192.168.0.2 192.168.0.1",
      memory_size => 128;
  }
}

node host3 {
  include monit
}

Приведенный выше рецепт устанавливает monit из портов, создает необходимые директории, записывает файл конфигурации и запускает monit. При изменении шаблона файла конфигурации — будет запускаться monit reload.

Кроме того, в указанном выше примере используется дефайн monit::repcached, который инсталлирует в конфигурацию monit на двух нодах, host1 и host2, описание сервиса repcached. После перезагрузки конфигурации monit — repcached на обеих нодах запускается и начинает работать в режиме master-master.

UPD:
костыль freebsd::rc_conf_local необязателен, как показала практика — при указании в описании сервиса enable => true puppet пытается сделать следующее:

  • при наличии директории /etc/rc.conf.d — создает в ней файл конфигурации сервиса и добавляет в него строку servicename_enable=»YES», иначе
  • при наличии файла /etc/rc.conf.local — добавляет строку включения сервиса в него, иначе
  • добавляет строку включения сервиса в /etc/rc.conf

Автоматическая инсталляция и конфигурирование софта во FreeBSD, используя puppet: 5 комментариев

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *