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

Mei*_*Mei 8 puppet

我想mysql_tzinfo_to_sqltzinfo包(在 Ubuntu 服务器上)更改时运行。我想 Puppet 可以解决这个问题。

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

我能看到的唯一方法是拥有一个没有直接操作的资源,并有一个依赖它的 exec。

我的问题是:

  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参数工作的简短描述。

Nan*_*Liu 7

使用审计属性跟踪文件内容或包版本号,并通过订阅包资源触发更改。与此有关的一些问题,这不适用于 --noop,因为 state.yaml 文件将在 --noop 模式下更新文件 md5 校验和/包版本。我不确定这是否是一个悬而未决的错误,因为我目前无法追踪它。

file { '/etc/tzinfo':
  audit => content,
}

exec { '/usr/bin/mysql_tzinfo_to_sql':
  subscribe => File['/etc/tzinfo'],
}
Run Code Online (Sandbox Code Playgroud)

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

file { '/etc/puppet/stage/tzinfo':
  source => '/etc/tzinfo',
}

exec { '/usr/bin/mysql_tzinfo_to_sql':
  subscribe => File['/etc/tzinfo'],
}
Run Code Online (Sandbox Code Playgroud)

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

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

exec { 
  '/bin/echo foo | grep foo > /tmp/foo':
}
Run Code Online (Sandbox Code Playgroud)


rob*_*byt 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'",
}
Run Code Online (Sandbox Code Playgroud)
  1. 是的,通过通知元参数。但是,我并不是 100% 肯定 puppet 2.6 中的新审计功能会在包版本更改超出 puppet 控制范围时触发通知。

  2. 是的,使用 refreshonly => true

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