[英]Have puppet conditionally execute multiple commands
我有一个工作的puppet配置来帮助在机器上安装mysql实例。 我的环境设置为在同一台机器上运行多个实例(具有不同的配置/端口/等)。
我在清单中的基本设置看起来像
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命令之后,但有点在同一“创建”后卫。
我发现了一些只是将数组传递给命令参数的引用,但该引用的形式是错误报告并不总是一致地工作。
什么是首选的方法来完成这样的事情,并确保命令以确定的顺序执行,并且只有在运行mysql_install_db之后?
有几种方法只运行一次exec
,并且仅在"mysql_install_db-${name}"
:
cmd1 && cmd2 && cmd3 ...
)。 unless
或onlyif
参数,以便在运行命令之前检查存储过程或是否已存在。 这可能很复杂,所以另一种方法是让命令创建一个文件( "command && touch /root/blah-${name}"
)并使用creates
参数。 refreshonly
,并subscribe
以前的exec。 虽然所有这些解决方案都有效,但您不会尊重Puppet描述系统最终状态的精神。 对于数据库,用户和授权设置,您可以使用puppetlabs-mysql
模块,它可以让您以自然的方式描述它们。 存储的资源是另一个问题,可以在应用程序部署过程中更加逻辑地打包(因为它们必须与应用程序保持同步)。 如果这是不可能的,那么您可以使用条件使SQL脚本具有幂等性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.