我正在编写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中以直截了当的方式做到这一点?
答案 0 :(得分:2)
Puppetlabs' apt module完全符合您的要求。
只需添加您的回购:
apt::ppa { 'ppa:cdekter/ppa ': }
如果未添加存储库,则会自动添加cdekter ppa并执行apt-get update
。如果它已经添加,将不会发生任何事情。
位于Puppetlabs的ppa.pp
清单顶部的apt模块apt::update
包含在内:
include apt::update
update.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触发,否则不会执行此include apt::update
。刷新事件基本上是资源之间的信号,这些信息已经发生变化,并且可以由通知和订阅元参数设置。因此,当您只是ppa.pp
时,除非其他资源向其发送刷新事件,否则此exec将不会触发。
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],
],
}
清单围绕此代码展开:
notify => Exec['apt_update']
通过在此exec触发后将此事件设置为apt_update
,它将向apt-get update
exec资源发送刷新,从而触发 unless => "/usr/bin/test -s ${sources_list_d}/${sources_list_d_filename}",
。每次木偶运行都不会发生这种情况的原因是因为如果先前已经添加了存储库,则此属性会阻止执行该命令:
{{1}}
希望这有帮助。
祝你好运!