我正在一个独立系统上探索 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 没有被复制。我究竟做错了什么?
首先,在哪里
$servername
设置?这不是一个标准的事实,因此要使其具有内容,您需要具有自定义事实或清单变量。你想使用$clientcert
还是$fqdn
代替?在你的
file
资源上..我认为这应该是错误的,但也许不是,因为/etc/
存在..问题是声明的资源试图管理/etc/
而不是/etc/my.cnf
. 在资源名称中声明文件的完整路径并省略path
参数:或者,让
path
参数成为文件的完整路径(然后名称无关紧要):但是.. 我真的建议不要在清单中硬编码“此服务器获取哪个配置文件”的逻辑。改为使用带有参数化类的 Hiera 或节点定义。