使用 Puppet 管理 shell 命令

使用 Puppet 管理 shell 命令

例如,让我们尝试让 Puppet安装 opengeo-suite

做类似的事情

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:如果我们再次运行 puppet 脚本,wget 和 echo 不会运行两次吗?我们最终会在 中得到重复的 repo /etc/apt/sources.d。运行package { "opengeo-suite": }两次并不会尝试安装包两次,它只是确保包已安装。

问题2:确实apt-get install opengeo-suite有多个提示用户输入。Puppet 是否会以某种方式知道要使用的默认输入,还是会崩溃?

答案1

  1. 如果不阻止,命令将在每次 Puppet 运行时运行,包括 中的多个条目sources.list。这不应该发生,因为 Puppet 期望调用是幂等的。解决此问题的一种方法是创建“检查”文件,并仅在检查文件不存在时exec运行。请参阅exec文档学习如何做到这一点。还要注意的是,存在用户贡献的模块使用 Puppet 来维护 apt repos。

  2. 我还没有在基于 apt 的系统上使用过 Puppet(目前还没有),但我猜想 Puppet 或我上面链接的 apt 模块足够聪明来处理这个问题。如果没有,看到这个

答案2

您可以在 exec 中使用 onlyif。测试必须返回 true 才能执行命令,在您的例子中请参见下文(PUBLIC_KEY_ID 是 apt 提供商的密钥 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"
}

相关内容