【问题标题】:Subscribe to new file(s) in directory in Puppet订阅 Puppet 目录中的新文件
【发布时间】:2014-01-06 08:06:43
【问题描述】:

我知道我可以在 Puppet 中同步目录:

file { 'sqls-store':
    path    => '/some/dir/',
    ensure  => directory,
    source  => "puppet:///modules/m1/db-updates",
    recurse => true,
    purge => true
}

因此,当添加新文件时,它们会被复制到“/some/dir/”。但是我需要为每个新文件执行一些操作。如果我“订阅”此类资源,我不会得到一组新文件。 目前,我创建了外部 shell 脚本,该脚本在该目录中查找新文件并为每个文件执行操作。 自然,我宁愿不依赖外部脚本。有没有办法用 Puppet 做到这一点?

谢谢!

其用例是对不时进行的数据库模式进行更改,并应应用于由 puppet 管理的所有客户端。最后,每个这样的文件都是mysql [args] < update.sql

【问题讨论】:

    标签: puppet provisioning


    【解决方案1】:

    不确定我是否会建议让 puppet 为我应用数据库更改。

    对于小型数据库,它可能有效,但对于现实世界的数据库...您需要了解何时以及如何应用这些更改(更改的顺序,有时需要临时磁盘空间调整,数据库停机时间,前后备份,重组,...),大多数时候你的应用程序应该同时适应。你想要更多编排(而 puppet 不擅长编排)

    为什么不使用专门用于此任务的工具,例如

    一个穷人的解决方案是使用vcs-repo 模块和一个执行程序来列出自上次“应用”以来修改过的文件。

    【讨论】:

    • 这就是我要问的原因,我用shell脚本解决了这个问题,但感觉真的像是滥用Puppet。谢谢指点liquid-base,看来它解决了处理一堆sql补丁的问题。
    【解决方案2】:

    我同意 mestachs,处理数据库更新的 puppet 这不是一个好主意

    您可以尝试某种定义:

    define mydangerousdbupdate($name, $filename){
       file { "/some/dir/$filename":
        ensure  => present,
        source  => "puppet:///modules/m1/db-updates/$filename",
       }
       exec{"apply $name":
         command => "/usr/bin/mysql [args] < /some/dir/$filename > /some/dir/$filename.log",
         creates => "/some/dir/$filename.log"
       }
    }
    

    然后,您可以按首选顺序使用不同的补丁进行实例化

    mydangerousdbupdate{"first_change":
       name => "first",
       filename => "first.sql",
    }->mydangerousdbupdate{"second_change":
       name => "second",
       filename => "second.sql",
    }
    

    【讨论】:

    • 其实我不想在每次更新时都更改清单,只需将新的 sql 脚本添加到某个目录即可。但是,使用 mestachs 建议的 Liquid-base 之类的工具,我不再需要应用不同的文件。我将有一个单独的变更日志和一些额外的表格,用于跟踪应用的变更记录。
    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多