我有这样的配置:
file {
"/tmp/apc.ini":
source => "puppet:///modules/uc/php/apc.ini",
require => Package["php-apc"]
}
exec {
"Add apc.ini to php mods-available":
command => 'mv /tmp/apc.ini /etc/php5/mods-available/apc.ini',
onlyif => "test -d /etc/php5/mods-available",
require => File["/tmp/apc.ini"]
}
exec {
"Add apc.ini to php conf.d":
command => 'mv /tmp/apc.ini /etc/php5/conf.d/apc.ini',
unless => "test -d /etc/php5/mods-available",
require => File["/tmp/apc.ini"]
}
我希望能够简化这个过程,这样每次运行时就不会创建 /tmp/apc.ini 文件puppet agent --test
目前,我得到以下输出:
info: Retrieving plugin
info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
info: Loading facts in /var/lib/puppet/lib/facter/concat_basedir.rb
info: Loading facts in /var/lib/puppet/lib/facter/postgres.rb
info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
info: Caching catalog for frontapp0.demo.infra.universcine.com
info: Applying configuration version '1376302253'
notice: /Stage[main]/Uc::Role::Php/File[/tmp/apc.ini]/ensure: defined content as '{md5}e5f5a158bd83469ce031b20ec72ce717'
notice: /Stage[main]/Uc::Role::Php/Exec[Add apc.ini to php mods-available]/returns: executed successfully
notice: Finished catalog run in 36.12 seconds
我可以尝试什么?
更新目标是让 apc.ini 位于 mods-available 或 conf.d 中,具体取决于前者是否存在
答案1
实现此目的的一种简单方法是部署自定义事实。如果您正在使用该puppet-stdlib
模块,则可以通过将可执行脚本放入/etc/facter/facts.d
(请参阅本文了解详情)。例如,如果您创建了一个/etc/facter/facts.d/apc_ini_path
包含以下内容的脚本(并确保它是可执行的):
#!/bin/sh
if [ -d /etc/php5/mods-available ]; then
echo "apc_ini_path=/etc/php5/mods-available"
else
echo "apc_ini_path=/etc/php5/conf.d/"
fi
然后你就会有可用的事实“apc_ini_path”,你可以这样做:
file { "$apc_ini_path/apc.ini":
source => "puppet:///modules/uc/php/apc.ini",
require => Package["php-apc"]
}
当然,如果你熟悉 Ruby,你也可以直接使用YOURMODULE/lib/facter/yourfact.rb
所提供的示例来了解 Ruby 知识在同一篇文章中。他们提供了一个非常简单的 Ruby 事实示例:
# hardware_platform.rb
Facter.add("hardware_platform") do
setcode do
Facter::Util::Resolution.exec('/bin/uname -i')
end
end
用目录存在检查来代替这一点应该相当容易。