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

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

我想跑步,mysql_tzinfo_to_sql无论何时时区信息软件包(在 Ubuntu Server 上)发生更改。我认为 Puppet 可以处理这个问题。

我认为 Puppet 要么会对软件包版本的变化做出反应,要么如果没有,那么就会对软件包中包含的文件的时间戳的变化做出反应。

我认为做到这一点的唯一方法是拥有一个没有直接行动的资源,并让执行者依赖于它。

我的问题是:

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

综合考虑所有这些,这似乎令人难以忍受。

跟进:答案太棒了!为了完整起见(也为了记录),我应该注意以下几点:

  1. 感兴趣的完整 shell 命令是 mysql_tzinfo_to_sql | mysql -u root -p password (它将 tzinfo 加载到 MySQL 数据库中供 MySQL 使用)。
  2. 审计是/etc/tzinfo徒劳的,因为这仅仅是本地时区配置;目标是监视 tzinfo 数据本身的变化(因此监视/usr/share/zoneinfo)。
  3. 同样,内容也不值得观看——因为它们很可能不会改变;最好的办法是观看时光网或者全部因为文件时间应该在每次 tzinfo 更新后改变。

此外,詹姆斯·特恩布尔写道审计刚引入时,人们就开始关注它。元参数参考包含参数运作的简短描述audit

答案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'",
}
  1. 是的,通过通知元参数。但是,我不能 100% 肯定,如果软件包版本在 Puppet 的控制范围之外发生变化,Puppet 2.6 中的新审计功能是否会触发通知。

  2. 是的,使用 refreshonly => true

  3. 是的,请参阅我的示例。为了简单和安全,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 触发器是您的一个选择,请考虑一下。

相关内容