我正在独立系统上探索 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 或节点定义。