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


8

mysql_tzinfo_to_sql每当tzinfo软件包(在Ubuntu服务器上)更改时,我都希望运行。我认为木偶可以解决这个问题。

我以为Puppet会对软件包版本的更改做出反应,或者如果不对软件包中包含的文件的时间戳更改做出反应。

我能看到的唯一方法是拥有一个没有直接动作的资源,并有一个依赖于它的执行程序。

我的问题是:

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

综上所述,似乎势不可挡。

跟进很棒的答案!为了完整性(为了记录),我应注意以下几点:

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

同样,詹姆斯·特恩布尔 James Turnbull 在引入审计时就写下了所有有关审计的内容。元参数参考包含对audit参数工作方式的简短描述。


答案中的任何一个是否确实解决了问题?如果是这样,您能接受哪个解决方案最好?我对这个问题也很感兴趣,这对于后续工作将是一个有用的指针。
汤姆·安德森

我从未完全做到这一点-我放弃了,只是不时手动(或在安装过程中)手动完成。
梅,

Answers:


7

使用audit属性跟踪文件内容或软件包版本号,并通过订阅软件包资源来触发更改。与此相关的一些问题,不适用于--noop,因为state.yaml文件将以--noop模式更新文件md5校验和/软件包的版本。我不确定这是否是待解决的错误,因为目前无法跟踪。

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问题。

关于第三个问题,是的,您可以使用管道和重定向(使用标题并将命令放入command属性):

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

这是一个很好的答案-尽管我对观看当前时区不感兴趣,但对/ usr / share / tzinfo中的时区数据更改不感兴趣。对/ usr / share / tzinfo使用'audit => all'应该足够了吧?

如果您尝试递归该目录,那么这样做不太可行,因为审计仅在指定路径上起作用,并且不递归。audit => all表示审核所有属性,而不是所有文件。如果您选择第二种方法,我会使用递归方法。
刘楠

好点-尽管我并不是要递归。每次更新tzdata软件包时,目录/ usr / share / tzinfo的时间都应该更改-至少,这是我的想法。
Mei

我需要类似的东西并尝试了第一种方法-对文件进行审核。就我而言,该文件是前一个Exec的git checkout的提交哈希。该方法有效,除了对文件所做的更改仅在更改文件后的木偶运行中注意到。
Thomas Vander Stichele

5

是的,您应该能够做到这一点。

*理论代码示例

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%肯定puppet 2.6中的新审核功能会在程序包版本更改超出puppet的控制范围之外时触发通知。

  2. 是的,带有refreshonly => true

  3. 是的,请参阅我的示例。为了简便和安全起见,Puppet在交互式外壳程序外部运行exec命令。您可以使用-c开关让木偶在子外壳模式下使用bash,但请注意引号。


1
我认为,refreshonly在这里很重要。bash命令似乎并不协调:如果该命令有效,那么普通的shell命令也应该有效,对吗?无论如何,听起来确实如此。

您是否需要使用它bash -c来进行重定向?
汤姆·安德森

是,bash -c在此示例中,shell重定向是必需的。Puppet不使用交互式外壳exec
robbyt 2012年

2

我相信我已经能够做到这一点。这是我的木偶清单的相关内容:

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进行测试,它提示mysql_tzinfo exec在下一次运行。


2

这个问题很旧,但是我在其中徘徊,寻找其他东西,并想添加一个替代答案供考虑。

它不使用p:由于我们要在RPM安装/更新上触发,为什么不使用RPM触发?它充分利用了用于执行安装的系统,并按照设计的方式对其进行了适当的扩展。

构建触发器RPM非常简单,虽然学习起来并不有趣,但是一旦完成第一个RPM,它也可以很容易地在其他应用和条件下重复进行-因此,成本为非零,但收益却远远超过了这些费用。

当我们在这里使用Puppet时,并且该问题可以用Puppet解决,但我担心它利用工具的薄弱部分无法很好地响应条件,而这种情况更容易通过主机上已有的工具和工具触发包装盒上的大多数管理员都应该将脚趾浸入其中。很抱歉为您提供解决方案,但如果您像我一样将来在此消息中徘徊,并且可以选择使用RPM触发器,请考虑一下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.