2013-12-18 67 views
4

我有一个工作木偶配置来帮助在机器上安装mysql实例。我的环境设置为在同一台计算机上运行多个实例(具有不同的configs/ports/etc)。让木偶有条件地执行多个命令

基本设置我有一个清单看起来像

File{ 
    owner => $owner, 
    group => $group, 
    before => Exec["mysql_install_db-${name}"], 
} 

exec{"mysql_install_db-${name}": 
    creates => "/var/lib/mysql/${name}/mysql", 
    command => "/usr/local/percona/mysql-${version}/usr/bin/mysql_install_db --user=mysql --datadir=/var/lib/mysql/${name} --basedir=/usr/local/percona/mysql-${version}/usr", 
    logoutput => true, 
} 

这工作完全正常,但现在我想修改该安装程序运行一些后续命令来引导新的一些内部安装存储过程以及我们为新安装做的其他“准备工作”。

的命令将基本上像

mysql -u user < /path/to/bootstrap1.sql 
mysql -u user < /path/to/bootstrap2.sql 
mysql -u user < /path/to/bootstrap3.sql 

我只希望这些运行一次,mysql_install_db的命令之后,但略低于同一个“创造”后卫。

我发现了一些仅仅将数组传递给command参数的引用,但引用的形式并不总是一致地工作。

完成这样的事情的首选方法是什么,并确保命令按确定的顺序执行并且仅在运行mysql_install_db之后执行?

回答

6

有几种方法来运行exec只有一次,"mysql_install_db-${name}"后才:

  • 只要改变命令行添加其他所有的命令(cmd1 && cmd2 && cmd3 ...)。
  • 使用unlessonlyif参数,以便在运行命令之前检查您的存储过程或任何已存在的参数。这可能很复杂,因此另一种方法是使命令创建一个文件("command && touch /root/blah-${name}")并使用creates参数。
  • refreshonlysubscribe设置为之前的exec。

尽管所有这些解决方案都可行,但您不会尊重Puppet描述系统最终状态的精神。对于数据库,用户和授权设置,您可以使用puppetlabs-mysql模块,这可让您以自然的方式描述它们。存储资源是另一个问题,可能与应用程序部署过程逻辑上打包在一起(因为它们必须与应用程序保持同步)。如果这是不可能的,那么你可以使用条件使你的SQL脚本是幂等的。

+1

用于幂等SQL脚本的+1。我曾经用'create'命令创建一个文件,指示数据库不应再被触摸,但最终在我的脚本中解决了“DROP ... IF EXISTS”和“CREATE IF NOT EXISTS”,现在已经有了安心。 – xiankai