1

我们有一个基本上像这样工作的木偶设置:

  1. 创建用户“puppetdeploy”
  2. 授予用户“puppetdeploy”对所有表的访问权限
  3. 使用“puppetdeploy”运行从 .sql 文件创建和更新数据库的脚本
  4. 撤销对用户“puppetdeploy”的所有访问权限

.pp 文件如下所示:

mysql_user { 'puppetdeploy@localhost':
   ensure => 'present',
   password_hash => '*****',           
}->
mysql_grant { 'grant_all_for_puppetdeploy':
   ensure     => 'present',
   options    => ['GRANT'],
   privileges => ['ALL'],
   table      => '*.*',
   user       => 'puppetdeploy@localhost',
}
#... execute scripts to import bunch of .sql files using mysql user 'puppetdeploy'
mysql_grant { 'revoke_all_for_puppetdeploy':
   options    => ['REVOKE'],
   privileges => ['ALL'],
   table      => '*.*',
   user       => 'puppetdeploy@localhost',
}   

在更高版本的 mysql-module 中,这不再有效,因为每个授权的名称需要采用格式“[user]/[table]”,并且我不允许两个或多个 mysql_grants 具有相同的名称。

有没有办法在 puppetlabs-mysql 3.0.0 中解决这个限制,或者有更好的方法来处理临时 mysql 用户?

4

1 回答 1

0

问题是这样的工作流程不符合 Puppet 的范式。Puppet 清单不是脚本。这是您希望 Puppet 强制执行的状态描述。当然,转换通常需要序列化的配置步骤才能正确完成,但所有东西都应该有一个 Puppet 必须同步到的明确状态,并且应该保持在这个状态。

在同一个 Puppet 事务中需要一个或多个资源来获取多个不同状态的所有工作流都会带来困难,通常会通过某种 hack 来解决。

在您的特定场景中,最好放弃mysql_grant类型以支持 Puppet 部署和运行的脚本,该脚本将执行清单摘录中概述的所有步骤。这不是一件非常 Puppet 的事情,但更干净,因为您不会尝试让 Puppet 将相同的资源从一个状态转移到另一个状态。

更好的是,使 Puppet 能够使用实际管理帐户的权限。

作为一种折衷方案,您可以添加一个自定义事实,允许 Puppet 在后续事务开始时确定所有 GRANT 都是有序的,然后删除用户。

if $grants_are_deployed {
    mysql_grant { 'revoke_all_for_puppetdeploy': ... }
else {
    mysql_user { 'puppetdeploy@localhost': }
}   
于 2014-11-13T12:47:35.973 回答