Puppet:文件(或包)更新时运行shell命令

每当tzinfo软件包(在Ubuntu服务器上)发生变化时,我想运行mysql_tzinfo_to_sql 。 我想木偶可以照顾这个。

我以为Puppet会对软件包版本的变化做出反应,如果不是的话,那么对包中包含的文件的时间戳进行更改。

我能看到做到这一点的唯一方法是有一个没有直接行动的资源,并有一个执行取决于它。

我有的问题是:

  1. 是否可以定义仅用于通知其他资源(如exec )的文件?
  2. 是否可以定义一个包资源,以便在包更改或更新时激活另一个资源(如exec )?
  3. 是否可以定义一个运行shell命令行的exec资源(例如pipe道和redirect)而不是文件系统的命令?

综合起来,这似乎是压倒性的。

跟随 :神奇的答案! 为了完整性(和logging),我应该注意以下几点:

  1. 完整的shell命令是mysql_tzinfo_to_sql | mysql -u root -p password mysql_tzinfo_to_sql | mysql -u root -p password (它将tzinfo加载到MySQL数据库中供MySQL使用)。
  2. 审计/etc/tzinfo将是徒劳的,因为这仅仅是本地时区configuration; 目标是监视tzinfo数据本身的变化(从而监视/usr/share/zoneinfo )。
  3. 同样,内容将是错误的观看 – 因为他们可能不会改变; 最好的办法是观看mtime全部,因为在每次tzinfo更新后,文件时间应该改变。

此外,詹姆斯·特恩布尔在介绍审计时写下了所有关于审计的内容。 “元参数参考”包含audit参数工作的简短说明。

使用audit属性来跟踪文件内容或包版本号,并通过订阅包资源来触发更改。 有几个问题,这不适用于–noop,因为state.yaml文件将以–noop模式更新文件md5 checksum / package版本。 我不确定这是否是一个悬而未决的问题,因为我现在无法追踪它。

 file { '/etc/tzinfo': audit => content, } exec { '/usr/bin/mysql_tzinfo_to_sql': subscribe => File['/etc/tzinfo'], } 

一个更可靠的方法就是复制其他地方的文件,并使用它来触发更新(位置不重要,我们只是跟踪原始的tzinfo作为源)。

 file { '/etc/puppet/stage/tzinfo': source => '/etc/tzinfo', } exec { '/usr/bin/mysql_tzinfo_to_sql': subscribe => File['/etc/tzinfo'], } 

第二种方法当然不适用于包,但是你可以避免使用–noop和state.yaml问题。

关于第三个问题,是的,你可以使用pipe道和redirect(使用标题并把命令放在命令属性中):

 exec { '/bin/echo foo | grep foo > /tmp/foo': } 

是的,你应该可以做到这一点。

*理论代码示例

 package{'tzinfo': audit => all, notify => Exec['mysql_tzinfo_to_sql'], } exec{'mysql_tzinfo_to_sql': refreshonly => true, command => "bash -c '/usr/local/bin/mysql_tzinfo_to_sql >> /var/log/stuff.log'", } 
  1. 是的,通过通知元参数。 但是,我不是100%肯定的是,如果包版本在傀儡控制范围之外变化,那么2.6版本中的新审计function将触发通知。

  2. 是的,用refreshonly => true

  3. 是的,看我的例子。 为了简单和安全,Puppet在交互式shell之外运行exec命令。 您可以使用-c开关在puphell模式下使用bash,但请注意引号。

我相信我已经能够得到这个工作。 这是我傀儡清单的相关部分:

 file { '/usr/share/zoneinfo': audit => mtime, recurse => true, notify => Exec['mysql_tzinfo'] } exec { 'mysql_tzinfo': refreshonly => true, command => 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql', } 

在第一次之后,mysql_tzinfo exec被跳过。 通过触摸/ usr / share / zoneinfo / Etc / UTC进行testing,它提示mysql_tzinfo exec在下一次运行。

这个问题很古老,但是我在其他地方徘徊,寻求其他的东西,并且想要考虑另外的答案。

它不使用puppet:因为我们想要在RPM安装/更新上触发,为什么不使用RPM触发器? 它利用用于安装的系统,并按照devise的方式正确地扩展它。

构build触发器RPM是非常简单的,虽然学习起来没什么乐趣,但一旦第一个完成,它也可以很容易地重复用于其他应用程序和条件 – 因此,成本不是零,而是快速获益,远远超过那些成本。

虽然我们在这里是为了Puppet,而且这个问题可以用puppet来解决,但是我担心它会利用工具的一个弱部分对一个已经在主机上的工具和一个工具大部分pipe理员都应该把脚趾弄脏。 对不起,build议在线以外的解决scheme,但如果你在未来像我一样在这个消息中漫游,并且RPM触发器是你的select,请考虑。