我想跑步,mysql_tzinfo_to_sql
无论何时时区信息软件包(在 Ubuntu Server 上)发生更改。我认为 Puppet 可以处理这个问题。
我认为 Puppet 要么会对软件包版本的变化做出反应,要么如果没有,那么就会对软件包中包含的文件的时间戳的变化做出反应。
我认为做到这一点的唯一方法是拥有一个没有直接行动的资源,并让执行者依赖于它。
我的问题是:
- 是否可以定义一个仅用于通知另一个资源(例如执行)?
- 是否可以定义一个包资源,以便另一个资源(例如执行) 在软件包发生变更或更新时是否被激活?
- 是否可以定义一个执行运行 shell 命令行(例如使用管道和重定向)而不是文件系统命令的资源?
综合考虑所有这些,这似乎令人难以忍受。
跟进:答案太棒了!为了完整起见(也为了记录),我应该注意以下几点:
- 感兴趣的完整 shell 命令是
mysql_tzinfo_to_sql | mysql -u root -p password
(它将 tzinfo 加载到 MySQL 数据库中供 MySQL 使用)。 - 审计是
/etc/tzinfo
徒劳的,因为这仅仅是本地时区配置;目标是监视 tzinfo 数据本身的变化(因此监视/usr/share/zoneinfo
)。 - 同样,内容也不值得观看——因为它们很可能不会改变;最好的办法是观看时光网或者全部因为文件时间应该在每次 tzinfo 更新后改变。
答案1
使用审计属性来跟踪文件内容或软件包版本号,并通过订阅软件包资源来触发更改。这存在一些问题,它不适用于 --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 问题。
关于第三个问题,是的,您可以使用管道和重定向(使用标题并将命令放在命令属性中):
exec {
'/bin/echo foo | grep foo > /tmp/foo':
}
答案2
是的,你应该可以做到这一点。
*理论代码示例
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'",
}
是的,通过通知元参数。但是,我不能 100% 肯定,如果软件包版本在 Puppet 的控制范围之外发生变化,Puppet 2.6 中的新审计功能是否会触发通知。
是的,使用 refreshonly => true
是的,请参阅我的示例。为了简单和安全,Puppet 在交互式 shell 之外运行 exec 命令。您可以使用 -c 开关让 puppet 在子 shell 模式下使用 bash,但请注意引号。
答案3
我相信我已经能够让它发挥作用。这是我的傀儡清单的相关部分:
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 被跳过。通过 touch'ing /usr/share/zoneinfo/Etc/UTC 进行测试,它提示 mysql_tzinfo exec 在下一次启动时运行。
答案4
这个问题很老了,但我徘徊在寻找其他东西的地方,并想添加一个可供考虑的替代答案。
它不使用 puppet:既然我们想在 RPM 安装/更新时触发,为什么不使用 RPM 触发器呢?它利用用于执行安装的系统,以设计的方式对其进行适当扩展。
构建触发器 RPM 非常简单,虽然学习起来并不有趣,但一旦完成第一个,就可以很容易地在其他应用程序和条件下重复构建 - 因此,成本不为零,但收益很快远远超过这些成本。
虽然我们在这里讨论 Puppet,并且这个问题可以用 Puppet 解决,但我担心它利用工具的薄弱环节来错误地响应一个条件,而这个条件更容易通过主机上已有的工具触发,而且大多数管理员都应该尝试过这个工具。很抱歉提出一个超出范围的解决方案,但如果您像我一样,将来看到这条消息,并且 RPM 触发器是您的一个选择,请考虑一下。