$servername 的 case 语句失败

$servername 的 case 语句失败

我正在独立系统上探索 puppet,在复制 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 未被复制。我做错了什么?

答案1

首先,在哪里$servername设置?这不是标准事实,因此要使其具有内容,您需要有自定义事实或清单变量。您想使用$clientcert还是$fqdn

在您的file资源上.. 我认为这应该是错误的,但可能不是,因为/etc/存在.. 那里的问题是声明的资源正在尝试管理/etc/而不是/etc/my.cnf。在资源名称中声明文件的完整路径并省略参数path

file { '/etc/my.cnf':

或者,让path参数成为文件的完整路径(那么名称无关紧要):

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

但是……我真的不建议在清单中硬编码“此服务器获取哪个配置文件”的逻辑。请改用带有参数化类的 Hiera 或节点定义。

相关内容