通常在处理复杂的 puppet 模块时,我会在节点级别或类内部设置变量。例如,
node 'foo.com' {
$file_owner = "larry"
include bar
}
class bar {
$file_name = "larry.txt"
include do_stuff
}
class do_stuff {
file { $file_name:
ensure => file,
owner => $file_owner,
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,参数化类如何/何时/为什么会有所帮助?您如何使用参数化类来构建您的 puppet 模块?
我们是一个相对较小的商店(就系统管理员的数量而言),混合了 RHEL、Solaris、Windows 2003 和 Windows 2008 服务器;总共约200台服务器。
对于我们的管理员帐户(root在 Linux 和admnistratorWindows 中),我们有一个密码方案,该方案取决于数据中心位置和服务器的其他几个记录属性。
在Linux上,我们目前的做法是创建一个共享的非特权帐户在那里我们可以su来root。在基于 Windows 的系统上,我们创建了一个具有管理员权限的附加帐户。这两个帐户共享相同的密码。
这已被证明是非常低效的。当有人离开我们的商店时,我们必须:
我想知道在类似环境中是否有人可以建议一种更明智的方式来管理这些凭据。一些相关资料:
任何想法或建议将不胜感激。这是一个困扰了一段时间的问题,我终于想解决它。
我正在使用 puppet 分发 SSH 密钥,如下所示:
ssh_authorized_key { "alice@foo.com":
ensure => present,
key => 'xxxx',
type => 'ssh-rsa',
user => 'deploy',
}
Run Code Online (Sandbox Code Playgroud)
~/.ssh/authorized_keys 文件最终包含来自多个类的密钥的混合,这是所需的结果。但是,如果手动将密钥添加到 $HOME/.ssh/authorized_keys,Puppet 会将其保留在原位。有没有办法始终删除清单中未明确定义的任何键?
我有木偶版本 2.7.1。
我正在尝试运行这样的单个模块:
puppet apply --verbose --modulepath=moduleshere --noop -e 'include myclass'
Run Code Online (Sandbox Code Playgroud)
但是,我收到此类错误,表明未设置路径
Parameter unless failed: '[ -e "${logfile}" ]' is not qualified and no path was specified. Please qualify the command or specify a path.
Run Code Online (Sandbox Code Playgroud)
我不想在每个这样的位置明确指定路径,并且在作为完整木偶运行的一部分运行时它工作正常。运行单个模块时如何指定路径?
你如何配置和使用你的 Puppet 文件桶?
我想:
我是 Puppet 的初学者,我想知道我是否正在使用 Puppet 部署应用程序的正确方法。
应用程序位于 tar.gz 文件中,该文件包含带有版本号的文件。所以,我这样做是为了部署(我在服务器上并重新启动客户端以获取新的 tarball):
nodes.pp
node 'server1.domain.com' inherits basenode {
apps { apps:
version => 56,
apps_name => "apps_tarball.tgz",
}
init.pp (modules)
exec {"apps_wget":
command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}",
unless => "test -f /tmp/${version}-${apps_name}",
require => [ Package["wget"] ],
}
exec {"apps_unzip":
cwd => "/usr/local/apps/path",
command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
unless => "test -f /usr/local/apps/path/apps-version-${version}",
require => [ Package["unzip"], Exec["container_wget"] ],
}
Run Code Online (Sandbox Code Playgroud)
但是,当我要升级时,我不知道说Puppet删除旧目录?例如,如果我想将版本 56 升级到 57:我必须删除 56 的版本目录。
我听说过 Capristrano,使用 Puppet 来管理包、配置文件和使用 Capristrano 部署应用程序似乎更好,不是吗?
谢谢。
是否可以告诉 puppet 为一个(或所有)节点编译目录并将该特定数据保存在某处?
我对获取所有需要的包及其每个节点的版本特别感兴趣,但获取任何数据的通用方法也适用。
我们正在研究一种为基于 RHEL/RHEL 的服务器执行自动更新的方法。
最初的想法:使用 Puppet,我们禁用默认存储库并指向我们自己的存储库。然后,我们使用ensure => latest我们想要自动更新的包。
问题:我们看到某些服务在更新后重新启动(废话)。
问题:有人对如何更好地自动化 Linux 更新和减轻服务自动重启的策略有任何建议吗?我们更喜欢包含 Puppet 的解决方案,但是,如果我们需要使用其他服务,那不是交易破坏者。
可能的解决方案:我提交了一个解决方案,该解决方案实现了@voretaq7 和@ewwhite 建议的许多内容。好像这就是我暂时要走的路线。如果您有其他建议,请发表评论或提交答案。
我们有很多服务器,但仍想全部更新。实际的方法是任何系统管理员从一个服务器到另一个服务器并制作一个aptitude update && aptitude upgrade- 这仍然不是很酷。
我现在正在寻找一个更好、更智能的解决方案。人偶可以做这个工作吗?你怎么做呢?
到目前为止我读过的 Puppet 教程还没有提到如何构建 puppet .pp。
任何人都可以分享一些有效和扩展的经验吗?