我听说 puppet 需要安装在服务器端,而不仅仅是桌面端,我们要从服务器端启动命令。
我的问题:还有其他使用 puppet 的方法吗?我的意思是我们不想将其安装在服务器端,只需从服务器上的桌面运行脚本即可。
答案1
您可以在无主模式下使用 puppet,但您的服务器仍然需要安装 puppet 客户端。这篇博客文章讨论了有关设置的详细信息:使用 Git 扩展 Puppet。
本文展示了如何设置 Git 存储库来维护 Puppet 清单文件 ( .pp
),然后手动运行 Puppet 来应用它们。
例子
package { "screen":
ensure => installed,
}
只需将其保存为 Something.pp 并使用 Puppet 运行它:
$ sudo puppet -v something.pp
info: Applying configuration version '1264090058'
notice: //Package[screen]/ensure: created
但这种方法仍然非常符合您通常在 Puppet 部署中看到的客户端/服务器模型。
puppet-users 邮件列表中还有一个帖子,标题为:回复:[傀儡用户]无主:我会失去什么?这可能会揭示一些其他选择。我还发现这篇博文标题为:没有主人的傀儡其中还讨论了执行您正在寻找的操作的选项。
我还会引导您阅读这篇标题为:配置管理:推与拉其中讨论了进行配置管理时方法的差异。严格来说,Puppet 是一个拉式解决方案,因此您所建议的使用它会很困难,因为您正在寻找的内容听起来更像是从桌面到服务器的推送解决方案。
如果您确实想采用推送方法,还有其他解决方案,但这超出了您的问题范围。
答案2
我会详细说明我的评论在这里,提出我的实际建议。
我的主要假设是,您不想在客户端节点上安装 Puppet,因为它们数量庞大。如果您由于权限问题而无法“触摸它们”,那么我怀疑您是否可以推送配置,无论是通过 Puppet 还是任何其他方法。
您可以配置ssh
为无需密码即可登录计算机,ssh-keygen
如下所示:
[user@host]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host
The key's randomart image is:
+--[ RSA 2048]----+
| E++.+. |
| -./ . |
| . = o |
| o o |
| X + |
| . $ + |
| 0 . |
| . .S |
| ..cb.. |
+-----------------+
确保密码为空(因此使用此密码的脚本ssh
将不需要密码)。
第二步,您需要将公钥复制到所有主机:
while IFS= read -r host; do
ssh-copy-id -i ~/.ssh/id_rsa.pub "$host"
done < hostnames_file
我假设hostnames_file
每行有一个主机名,列出了您要配置的所有主机。
该脚本很可能会要求您输入密码,次数与主机数量一样多,但这种情况只会在您设置密钥时发生一次。
如果您user
碰巧在所有客户端之间共享主目录(例如通过 NFS),您可以这样做:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
现在,您应该为刚刚配置的无密码设置sudo
对apt-get
命令(或yum
或pacman
您选择的任何包管理器)的无密码访问。现在就这么简单:user
ssh
while IFS= read -r host;do
ssh "$host" 'sudo apt-get install puppet' # also, modify puppet.conf
end < hostnames_file
请注意,您也可以使用此方法作为配置管理的基本形式*,但它比使用 Puppet 或 Chef 或类似方法要脆弱得多。
参考
(*)只需替换sudo apt-get install puppet
为您希望在所有节点上运行的任何命令。
答案3
典型的木偶模型由木偶主人和木偶客户组成。也就是说,可以完全跳过 puppet master,只使用 puppet 客户端。 (称为无主木偶模块)。
为此,您可以将该puppet apply
命令包装在 bash 脚本中。
这是一个无主傀儡清单的简单示例,它从源代码编译最新版本的 redis,然后创建 RPM。
https://github.com/spuder/fpm-redis
这是我们在我的公司使用的一个更复杂的示例,称为构建器。您可以在这里观看有关它的演示:
https://www.youtube.com/watch?v=EFByexKKkIE
Builder 只是一个脚本,任何开发人员都可以在任何虚拟机上应用该脚本,该脚本将通过 puppet 自动安装产品套件。它是闭源的,但我会尽力解释基本架构。
它的编写是为了当开发人员执行builder时,系统会提示他们想要安装哪个版本和版本的软件。
$ sudo ./builder.sh
"Welcome to Builder"
1) Enterprise
2) Basic
3) Quit
Please select an edition: 1
"You have selected: Enterprise"
1) 7.5.0
2) 7.6.0
3) 7.7.0
4) 7.8.0
5) Quit
Please select a release: 2
"You have selected 7.6.0, applying manifests"
将 puppet 清单包装在这样的 bash 脚本中的优点之一是,您可以简单地编写自己的因素变量,以便稍后使用。查看 github/spuder/fpm-redis 中的简单示例:
在变量前面加上大写的“FACTER”
cat fpm-redis
#!/bin/bash
export FACTER_REDIS_VERSION='2.8.8'
puppet apply ./manifests/init.pp
然后,puppet 清单可以引用小写变量(单词“FACTER_”会自动被删除)。
cat ./manifests/init.pp
class foo {
file { "${::redis_version}":
ensure => file,
content => 'foo'
}
}
include foo
回到构建器代码,它是模块化的,因此每个需要安装的产品都有一个目录。这样您就可以定义属性文件。
$ tree /tmp/builder
|
build
\_ Enterprise.prop
\_ Basic.prop
|
packages
\_ java_7
\_ manifests
\_ init.pp
\_ java_6
\_ manifests
\_ init.pp
\_ foo
\_ manifests
\_ init.pp
|
builder.sh
属性文件只是包含环境变量的 bash 脚本,以及要应用的 puppet 清单列表。有时软件包需要按特定顺序安装,因此分为前置操作和后置操作。
$ cat Enterprise.prop
PRE_APPLY_LIST= "build/java_6/manifests/init.pp \
build/foo/manifests/init.pp"
POST_APPLY_LIST= "build/foobar/manifests/init.pp"
export FACTER_FOO='bar'
export FACTER_DB_PASSWORD='correct horse battery staple'
$ cat Basic.prop
PRE_APPLY_LIST= "build/java_7"
export FACTER_HERP='derp'
回到前面提到的菜单提示。构建器通过迭代构建目录来生成菜单选项列表。
$ cat /tmp/builder.sh
# prompt the user for which product
OPTIONS=`ls build/*.prop`
for opt in $OPTIONS
do
PP_APPLY=$opt
break
done
# import the variables from the property file
source $PP_APPLY
# install the desired packages
puppet apply $PRE_APPLY_LIST
puppet apply $POST_APPLY_LIST
这是利用木偶优势的好方法,而不需要木偶大师。
答案4
Puppet 旨在管理包、文件和服务。(称为三重奏)。如果您想在没有 Puppet Master 的情况下管理这些内容,则可以使用以下应用程序之一。
卡福
一个 ruby gem,它接受 yaml 配置文件并生成目录结构和 puppet 清单来安装任何应用程序。
https://github.com/theforeman/kafo
它是由制作者创建的工头。这就是他们生成安装程序的方式。
氟PM
氟PM是快速创建 rpm 和 deb 包的最佳方法。它还可以创建独立(无主)的木偶清单。在撰写本文时,它仍处于实验阶段。
您没有具体指定您尝试运行的脚本类型。如果您正在管理包、文件或服务,那么您可能会很幸运地使用 kafo 创建应用程序。