我正在编写Puppet清单,以便在我的机器上安装许多软件。
许多软件包在PPA中只包含最新版本的二进制文件,例如一个名为AutoKey的非常简单的服务。
要安装此最新版本的软件包,必须执行以下操作:
sudo add-apt-repository -y ppa:cdekter/ppa
sudo apt-get update
sudo apt-get install autokey-gtk此发行版中还存在许多其他包;必须先安装PPA存储库,然后更新APT,然后再安装它。
不幸的是,apt-get update需要相当长的时间才能运行,虽然像这样安装了几十个包,但如果我只在添加了所有PPA存储库之后运行apt-get update,我可以节省大量的配置时间。
有没有办法在Puppet中以一种直接的方式做到这一点?
发布于 2014-03-22 21:57:06
Puppetlabs' apt module做的正是您想要的。
只需像这样添加您的repo:
apt::ppa { 'ppa:cdekter/ppa ': }如果之前没有添加存储库,这将自动添加cdekter ppa并执行apt-get update。如果已经添加了它,则不会发生任何事情。
它是如何工作的
在Puppetlabs的apt模块中,ppa.pp清单的顶部包含了apt::update:
include apt::updateupdate.pp清单围绕以下exec展开:
exec { 'apt_update':
command => "${apt::params::provider} update",
logoutput => 'on_failure',
refreshonly => true,
timeout => $apt::update_timeout,
}此exec被定义为refreshonly => true,即除非由a refresh event触发,否则不会执行。刷新事件基本上是资源之间发生变化的信号,可以通过notify和subscribe参数设置。因此,当您简单地刷新时,此exec将不会触发,除非其他资源向它发送了include apt::update事件。
ppa.pp清单围绕以下代码展开:
exec { "add-apt-repository-${name}":
environment => $proxy_env,
command => "/usr/bin/add-apt-repository ${options} ${name}",
unless => "/usr/bin/test -s ${sources_list_d}/${sources_list_d_filename}",
user => 'root',
logoutput => 'on_failure',
notify => Exec['apt_update'],
require => [
File['sources.list.d'],
Package[$package],
],
}一旦此exec触发,通过将此事件设置为notify => Exec['apt_update'],它将向apt_update exec资源发送刷新,从而触发apt-get update。不是每次puppet运行都会发生这种情况的原因是,如果之前已经添加了存储库,则此属性会阻止执行命令:
unless => "/usr/bin/test -s ${sources_list_d}/${sources_list_d_filename}",希望这能有所帮助。
祝好运!
https://stackoverflow.com/questions/22571622
复制相似问题