Назад | Перейти на главную страницу

оператор case с $ servername не работает

Я изучаю марионетку в автономной системе и наткнулся на стену с копированием файла конфигурации для MySQL. Используя приведенный ниже манифест, MySQL установлен, но файл my.cnf не копируется.

init.pp (имя хоста: dev_one.site.com)

class mysql {

  case $servername {
    "prod_one.site.com", "dev_one.site.com", "sandbox_one.site.com": {
      $conf_file    = 'my.cnf.one'
    }
    "prod_two.site.com", "dev_two.site.com", "sandbox_two.site.com": {
      $conf_file    = 'my.cnf.two'
    }
  }


  package { "mysql-server":
    ensure => present,
  }

  package { "mysql":
    ensure => present,
  }

  file { 'my.cnf':
    path    => '/etc/',
    ensure  => file,
    require => Package['mysql'],
    source  => "puppet:///modules/mysql/${conf_file}"
  }

  service { "mysqld":
    ensure => running,
    enable => true,
    require => Package["mysql-server"]
  }

}

И вот результат:

[root@dev_one manifests]# puppet apply --verbose ./init.pp 
Info: Applying configuration version '1379018555'
Notice: /Stage[main]/Mysql/Package[mysql-server]/ensure: created
Notice: /Stage[main]/Mysql/Service[mysqld]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Mysql/Service[mysqld]: Unscheduling refresh on Service[mysqld]
Notice: Finished catalog run in 14.34 seconds

[root@dev_one manifests]# ll /etc/my*
total 0

Ошибок нет, но my.cnf не копируется. Что я делаю не так?

Во-первых, где $servername устанавливается? Это нестандартный факт, поэтому для того, чтобы иметь контент, вам потребуется либо настраиваемый факт, либо переменная манифеста. Вы хотите использовать $clientcert или $fqdn вместо?

На ваше file ресурс .. Я бы подумал, что это должно быть ошибкой, но, возможно, нет, так как /etc/ существует .. проблема в том, что заявленный ресурс пытается управлять /etc/ вместо того /etc/my.cnf. Либо объявите полный путь к файлу в имени ресурса и опустите path параметр:

file { '/etc/my.cnf':

Или, есть path параметр - полный путь к файлу (тогда имя не имеет значения):

file { 'MySQL Config':
    path    => '/etc/my.cnf',

Но ... я бы действительно не рекомендовал жестко указывать логику «какой конфигурационный файл получает этот сервер» в вашем манифесте. Вместо этого используйте Hiera или определения узлов с параметризованными классами.