让puppet有条件地执行多个命令

 那年差点做歌神 发布于 2023-02-09 13:09

我有一个工作的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之后?

1 个回答
  • 有几种方法只能运行exec一次,并且仅在"mysql_install_db-${name}"以下情况之后:

    只需更改命令行即可添加所有其他命令(cmd1 && cmd2 && cmd3 ...).

    使用unlessonlyif参数,以便在运行命令之前检查存储过程或已存在的过程.这可能很复杂,因此另一种方法是让命令创建一个文件("command && touch /root/blah-${name}")并使用该creates参数.

    设置refreshonly,并subscribe以前的执行.

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

    2023-02-09 13:11 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有