如何在Ubuntu14.04上设置无主Puppet环境
介绍
在现代云计算世界中,配置管理是至关重要的一步。 配置管理工具允许您可靠地将配置部署到您的服务器。 这个领域中比较成熟的配置管理工具之一是 Puppet。
在典型的 Puppet 环境中,用户在他们的工作站上编写 Puppet 模块,将模块推送到版本控制服务器(例如 Git),然后将这些模块下拉到 Puppet master。 运行 Puppet 客户端的服务器会定期连接到 Puppet master 以查看是否有任何更改,如果有,则应用更改。
在您必须开始扩展正在检查的服务器数量或模块变得相当复杂之前,此方案工作得很好。 那时你有两个选择:集群你的 Puppet Master 来处理负载(这可能需要你购买商业版的 Puppet),或者干脆放弃 Puppet Master。 本文将研究第二个选项。
无主 Puppet 设置需要通过 Git 将所有 Puppet 模块的副本复制到每个节点,然后让 Puppet 在本地应用更改。 这种方法的缺点是每个服务器下载所有模块,然后应用相关的,所以它不是例如的最佳选择 带有敏感信息的设置。 但是,在没有 Puppet Master 的情况下运行可以为您提供很大的灵活性,并且无需扩展您的基础架构就可以很好地工作。
先决条件
如果您是 Puppet 的新手,那么您可能想先在这里暂停一下,先阅读 这篇关于 Puppet 的文章,因为本教程假定您了解该工具的工作知识。 如果您是 Git 新手,也可以查看 这个 Git 简介系列 。
在本教程中,我们将使用两个 Droplet:一个作为 Git 服务器运行,另一个将通过 Puppet 应用更改。 我们将分别用 your_git_server_ip
和 your_puppet_server_ip
来引用这些 Droplet 的 IP 地址。
因此,要遵循本教程,您将需要:
- 一个 Ubuntu 14.04 Droplet 添加了 sudo 非 root 用户 和 SSH 密钥 。
- 另一个 Ubuntu 14.04 Dropet 添加了 SSH 密钥并安装了 Git Labs。
设置 Git Labs 最简单的方法是使用单击图像:在 选择图像 下的 Droplet 创建页面上,单击 Applications 选项卡,然后单击 GitLab 7.10。 0 CE 在 14.04。 您也可以按照本教程手动设置Git Labs。
第 1 步 — 创建 Git 存储库
第一步是创建一个存储库,用于存储我们所有的 Puppet 模块和清单。
首先,通过在您喜欢的浏览器中转到 http://your_git_server_ip
打开 Git Labs UI。 通过填写右侧下方的详细信息创建一个帐户新的用户? 创建一个帐户并按下绿色注册按钮。 您将收到一封帐户激活电子邮件,激活帐户后,您将能够在主页上登录。
点击主页面上绿色的【X19X】+新建项目【X36X】按钮。 工程路径输入“puppet”,点击创建工程。 在Project path字段中输入“puppet”,在Visibility Level中选择Public,然后点击绿色的Create Project按钮。
确保复制 SSH URL,您将在项目屏幕顶部看到它,因为我们将在后面的步骤中需要它。 它看起来像 git@your_git_server_ip:username/puppet.git
。
第 2 步 — 向 Git Labs 添加 SSH 密钥
在这一步中,我们将在 Puppet 服务器上创建一个 SSH 密钥,然后将该密钥添加到 Git Labs 服务器。
以 root 身份登录 Puppet 服务器。 (因为 Puppet 的文件将归 root 所有,我们需要有权在 Puppet 文件夹中设置初始 Git 存储库。)
为 root 用户创建 SSH 密钥。 确保不要输入密码,因为此密钥将由脚本使用,而不是用户。
ssh-keygen -t rsa
接下来,使用以下命令显示您的公钥。
cat ~/.ssh/id_rsa.pub
复制此密钥。 它看起来像 ssh-rsa long_alphanumeric_string root@hostname
。
现在,在您的 Git Labs Dashboard 页面上,单击右数第二个顶部栏上的 Profile settings 图标。 在左侧菜单中,点击SSH Keys,然后点击绿色的Add an SSH Key按钮。 在 Title 字段中添加密钥的描述(如“Root Puppet Key”),并将您的公钥粘贴到 Key 字段中。 最后点击【X15X】添加键【X26X】。
第三步——安装 Puppet 和 Git
在这一步中,我们将安装 Puppet 和 Git。
在 Puppet 服务器上,首先下载适用于 Ubuntu 14.04 的 Puppet 包。
wget http://apt.puppetlabs.com/puppetlabs-release-trusty.deb
安装软件包。
dpkg -i /tmp/puppetlabs-release-trusty.deb
更新系统的软件包列表。
apt-get update
最后,安装 Puppet 和 git。
apt-get install puppet git-core
此时,您应该按照本教程中的说明配置您的Git环境。
第 4 步 — 推送初始 Puppet 配置
安装 Puppet 和 Git 后,我们就可以对 Puppet 存储库进行初始推送了。
首先,移动到配置文件所在的 /etc/puppet
目录。
cd /etc/puppet
在此处初始化一个 git 存储库。
git init
在当前目录中添加所有内容。
git add .
使用描述性注释提交这些更改。
git commit -m "Initial commit of Puppet files"
使用您在步骤 1 中复制的 SSH URL 添加我们之前创建的 Git 项目作为源。
git remote add origin git@your_server_ip:username/puppet.git
最后,推动改变。
git push -u origin master
第 5 步 — 清理 Puppet 的配置
现在安装了 Puppet,我们可以将所有内容放在一起。 此时,您可以以 root 身份注销,而以您在先决条件期间创建的 sudo 非 root 用户身份登录。 除非绝对必要,否则以 root 用户身份操作不是一个好习惯。
为了打好基础,我们需要做一些改变。 首先,我们要清理 /etc/puppet/puppet.conf
文件。 使用您最喜欢的编辑器(vim、nano 等)编辑 /etc/puppet/puppet.conf
并进行以下更改。
让我们首先针对我们的特定设置对 /etc/puppet/puppet.conf
文件进行一些更改。 使用 nano 或您喜欢的文本编辑器打开文件。
sudo nano /etc/puppet/puppet.conf
该文件将如下所示:
原 /etc/puppet/puppet.conf
[main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet factpath=$vardir/lib/facter templatedir=$confdir/templates [master] # These are needed when the puppetmaster is run by passenger # and can safely be removed if webrick is used. ssl_client_header = SSL_CLIENT_S_DN ssl_client_verify_header = SSL_CLIENT_VERIFY
首先,从 [master]
行中删除所有内容,因为我们没有运行 Puppet master。 同时删除 [main]
部分中以 templatedir
开头的最后一行,因为它已被弃用。 最后,将读取 factpath=$vardir/lib/facter
的行改为 factpath=$confdir/facter
。 $confdir
等价于 /etc/puppet/
,即 我们的 Puppet 存储库。
完成上述更改后,您的 puppet.conf
应该是这样的。
修改/etc/puppet/puppet.conf
[main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet factpath=$confdir/facter
第 6 步 — 添加 Puppet 模块
现在 Puppet 已经设置好了,但是它没有做任何工作。 Puppet 的工作方式是查看名为 manifests 的文件,这些文件定义了它应该做什么,因此在这一步中,我们将创建一个有用的模块供 Puppet 运行。
我们的第一个模块,我们称之为 cron-puppet,将通过 Git 部署 Puppet。 它将安装一个 Git 钩子,该钩子将在成功合并后运行 Puppet(例如 git pull),它会安装一个 cron 作业,每 30 分钟执行一次 git pull
。
首先,进入 Puppet 模块目录。
cd /etc/puppet/modules
接下来,创建一个包含 manifests
和 files
目录的 cron-puppet
目录。
sudo mkdir -p cron-puppet/manifests cron-puppet/files
在 manifests
目录中创建并打开一个名为 init.pp
的文件。
sudo nano cron-puppet/manifests/init.pp
将以下代码复制到 init.pp
中。 这就是告诉 Puppet 每半小时从 Git 拉取的原因。
初始化程序
class cron-puppet { file { 'post-hook': ensure => file, path => '/etc/puppet/.git/hooks/post-merge', source => 'puppet:///modules/cron-puppet/post-merge', mode => 0755, owner => root, group => root, } cron { 'puppet-apply': ensure => present, command => "cd /etc/puppet ; /usr/bin/git pull", user => root, minute => '*/30', require => File['post-hook'], } }
保存并关闭文件,然后在 files
目录中打开另一个名为 post-merge
的文件。
sudo nano cron-puppet/files/post-merge
将以下 bash 脚本复制到 post-merge
。 此 bash 脚本将在 Git 合并成功后运行,并记录运行结果。
合并后
#!/bin/bash -e ## Run Puppet locally using puppet apply /usr/bin/puppet apply /etc/puppet/manifests/site.pp ## Log status of the Puppet run if [ $? -eq 0 ] then /usr/bin/logger -i "Puppet has run successfully" -t "puppet-run" exit 0 else /usr/bin/logger -i "Puppet has ran into an error, please run Puppet manually" -t "puppet-run" exit 1 fi
保存并关闭此文件
最后,我们必须通过创建一个全局清单来告诉 Puppet 运行这个模块,该清单在 /etc/puppet/manifests/site.pp
中可以找到。
sudo nano /etc/puppet/manifests/site.pp
将以下内容粘贴到 site.pp
中。 这将创建一个称为“默认”的节点分类。 “默认”节点中包含的任何内容都将在每台服务器上运行。 在这里,我们告诉它运行我们的 cron-puppet
模块。
网站.pp
node default { include cron-puppet }
保存并关闭文件。 现在,让我们通过运行它来确保我们的模块正常工作。
sudo puppet apply /etc/puppet/manifests/site.pp
成功运行后,您应该会看到一些以这样的行结尾的输出。
... Notice: Finished catalog run in 0.18 seconds
最后,让我们将更改提交到 Git 存储库。 首先,以 root 用户身份登录,因为那是对存储库具有 SSH 密钥访问权限的用户。
接下来,切换到 /etc/puppet
目录。
cd /etc/puppet
将该目录中的所有内容添加到提交中。
git add .
使用描述性消息提交更改。
git commit -m "Added the cron-puppet module"
最后,推送更改。
git push -u origin master
结论
要添加更多服务器,只需按照上面的步骤 3 在新服务器上安装 Puppet 和 Git,然后将 Git 存储库克隆到 /etc/puppet
并应用 site.pp
清单。
您甚至可以在创建 Droplet 时使用 用户数据 自动执行此安装。 确保在创建 Droplet 时使用 SSH 密钥,并将该 SSH 密钥添加到 GitLab 服务器。 然后只需在 Droplet 创建屏幕上勾选 Enable User Data 复选框并输入以下 bash 脚本,将红色突出显示的变量替换为您自己的变量。
#!/bin/bash -e ## Install Git and Puppet wget -O /tmp/puppetlabs.deb http://apt.puppetlabs.com/puppetlabs-release-`lsb_release -cs`.deb dpkg -i /tmp/puppetlabs.deb apt-get update apt-get -y install git-core puppet # Clone the 'puppet' repo cd /etc mv puppet/ puppet-bak git clone http://your_git_server_ip/username/puppet.git /etc/puppet # Run Puppet initially to set up the auto-deploy mechanism puppet apply /etc/puppet/manifests/site.pp
就这样! 您现在拥有一个无主 Puppet 系统,并且可以启动任意数量的附加服务器,甚至无需登录它们。