例如,让我们试着让Puppet 安装opengeo套件 。
做类似的事情
wget -qO- http://apt.opengeo.org/gpg.key | apt-key add - echo "deb http://apt.opengeo.org/suite/v3/ubuntu lucid main" >> /etc/apt/sources.list
我们可以用
exec {'getKey': command => "wget -qO- http://apt.opengeo.org/gpg.key | apt-key add -", } exec {'addRepo': command => "echo "deb http://apt.opengeo.org/suite/v3/ubuntu lucid main" >> /etc/apt/sources.list", }
问题1:如果我们再次运行木偶脚本,wget和echo是否会运行两次? 我们将在/etc/apt/sources.d结尾重复回购。 运行package { "opengeo-suite": }两次不会试图安装这个包两次,它只是确保它的安装。
问题2:做apt-get install opengeo-suite有几个用户input的promopts。 木偶会不知何故知道使用的默认input,还是会崩溃?
如果你不阻止它,那么这个命令将在每个木偶运行中运行,包括sources.list多个条目。 这不应该发生,因为木偶期望exec电话是幂等的。 一个办法是创build“检查”文件,只有在检查文件不存在时才运行exec 。 请参阅文档以了解如何执行此操作。 另外请注意,存在用户提供的模块来维护Puppet的回收站。
我还没有在基于apt的系统上使用过Puppet,但是我想上面链接的Puppet或者apt模块足够聪明来处理这个问题。 如果没有, 请看这个 。
你可以使用onlyif来执行exec。 testing必须返回true才能执行命令,在你的情况下见下图(PUBLIC_KEY_ID是apt provider的关键ID)
exec {'getKey': command => "wget -qO- http://apt.opengeo.org/gpg.key | apt-key add -", onlyif => "test `apt-key list |grep PUBLIC_KEY_ID | wc -l ` -eq 0" } exec {'addRepo': command => "echo "deb http://apt.opengeo.org/suite/v3/ubuntu lucid main" /etc/apt/sources.list", onlyif => "test `grep http://apt.opengeo.org/suite/v3/ubuntu /etc/apt/sources.list | wc -l ` -eq 0" }