使用Ubuntu 18.04 Bionic Beaver的Masterless Puppet
传统上,Puppet用作服务器-客户端模型的集中式配置管理系统。在本教程中,我们将向我们展示如何脱离该模型,使我们能够在高度可扩展的云环境中继续使用Puppet。
Standard Puppet无法与云完美配合。典型的云环境是高度动态的,节点不断地旋转和下降。但是,Puppet要求每个节点都已向Puppet主服务器注册,然后管理员必须在其中手动批准它。当然,我们始终可以自动批准所有新客户端,但这会带来安全隐患。
通过删除服务器,就像我们在本教程中要做的那样,我们不再担心必须将客户端注册到中央服务器。可以通过自动配置快速轻松地按需旋转实例。
Puppet代理
此设置的最大依赖性是必须在实例上安装和配置Puppet代理。根据托管实例的位置,我们可以准备安装了代理的映像,也可以在新实例联机后安装它。
我们应该在预配过程中准备映像还是自动执行安装?答案取决于我们在管理映像和使新实例联机所需的时间之间所需的平衡。
安全隐患
使用Puppet无主机模型意味着模块将驻留在每个主机上。如果模块中包含敏感信息(例如密码和令牌),则可能会出现问题。
一种解决方案是删除SSH访问并强制通过Puppet进行所有配置更改。但是,任何网络服务中的安全漏洞都可能授予未经授权的root访问服务器。
我们可以使用GPG加密文件,但仍需要将密钥存储在主机上以解密内容。
最好的解决方案之一是使用Ansible Vault。有一些可用的Puppet模块,这些模块允许我们从文件库中获取机密。这是我推荐的方法。无论我们使用哪种配置管理工具,还是清单,配方或者剧本所在的位置,我都主张这样做。
安装和配置Puppet代理
- 从Puppet下载Puppet 5 deb文件
wget https://apt.puppetlabs.com/puppet5-release-bionic.deb
- 安装Deb软件包以添加Puppet存储库。
sudo dpkg -i puppet5-release-bionic.deb
- 安装Puppet和Git核心。
sudo apt install puppet git-core
- 在文本编辑器(例如VI)中打开Puppet配置文件。
sudo vi /etc/puppet/puppet.conf
- 修改Puppet配置文件以启用无主控。它应该类似于以下示例,其中我们删除了[server]部分。
[main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet modulepath=/etc/puppet/code/modules
- 保存更改并退出文本编辑器。
运行本地Puppet模块
自动执行Puppet
手动执行任何操作都是DevOps的反模式,因此仅允许我们允许Puppet自动将新配置应用于服务器是有意义的。除此之外,我们再也没有中央服务器来启动了。
一个非常常见的解决方案是运行cron作业。第一项工作将从Git存储库中提取,下载或者更新我们的Puppet模块。然后,第二个作业将运行puppet apply以应用任何新配置。
为模块创建一个Git存储库
在本地计算机上,创建一个新的存储库,以存储无主播Puppet代理的所有模块。该存储库将托管在Github或者其他一些Git存储库中,并将定期拉出。任何新的提交都将被下拉并应用于服务器。
- 创建目录以保存模块。
mkdir puppet-modules
- 转到新目录。
cd puppet-modules
- 初始化Git仓库。
git init .
这将是我们存储服务器所有模块的目录。
Cron模块
我们的首要任务是创建一个模块,该模块创建我们的cron作业。
- 在模块存储库中创建以下目录结构。
mkdir -p puppet-modules/puppet-cron/manifests
- 转到puppet-cron目录。
- 创建一个名为metadata.json的文件并添加以下内容。
{ "name": "puppet-cron", "version": "0.1.0", "author": "Shane Rainville", "summary": "", "license": "Apache-2.0", "source": "", "dependencies": [ ], "operatingsystem_support": [] "requirements": [ { "name": "puppet", "version_requirement": ">= 4.7.0 < 6.0.0" } ],
- 创建清单文件。在modules / puppet-cron / manifests下创建一个名为init.pp的文件。
- 向其中添加以下内容。