介绍
在云计算的现代世界中,配置管理是至关重要的一步。 配置管理工具允许您配置,可靠部署到服务器。 其中一个在这个领域比较成熟的配置管理工具是Puppet 。
在典型的Puppet环境中,用户在他们的工作站上写Puppet模块,将模块推送到版本控制服务器(例如Git),然后将这些模块下拉到Puppet master。 运行Puppet客户端的服务器会定期连接到Puppet主服务器,以查看是否有任何更改,并应用更改(如果有)。
这种情况工作正常,直到你必须开始扩大有多少服务器正在检入或模块变得相当复杂。 在这一点上,你有两个选择:集群你的Puppet Master来处理负载(这可能需要你购买Puppet的商业版本),或者只是放弃Puppet master。 本文将探讨第二个选项。
无主Puppet设置需要所有Puppet模块的副本通过Git复制到每个节点,然后使用Puppet在本地应用更改。 这种方法的缺点是每个服务器下载所有的模块,然后应用相关的,所以它不是最好的选择,例如设置与敏感信息。 但是,没有Puppet master的情况下运行会给你很大的灵活性,而且不需要扩展你的基础设施。
先决条件
如果你是新的Puppet,那么你可能想在这里停下来阅读这篇文章Puppet首先,本教程假设工具的知识。 如果你是新来的Git,你可以看看这个介绍到Git系列了。
在本教程中,我们将使用两个Droplet:一个作为Git服务器运行,另一个,我们将通过Puppet应用更改。 我们将把这些Droplet的IP地址与your_git_server_ip
和your_puppet_server_ip
分别。
因此,要遵循本教程,您将需要:
- 一个Ubuntu的14.04Droplet与Sudo非root用户和SSH密钥加 。
- 另一个Ubuntu 14.04 Dropet,添加了SSH密钥并安装了Git Labs。
设置的Git实验室最简单的方法是使用点击图片:在选择图片的Droplet创建页面上,单击应用程序选项卡,然后单击14.04 GitLab 7.10.0 CE。 您也可以按照本教程中手动设置的Git实验室。
第1步 - 创建Git存储库
第一步是创建一个存储库,其中将存储所有Puppet模块和清单。
首先,要打开Git的实验室UI http:// your_git_server_ip
在你喜欢的浏览器。 通过下新用户的权利细节尽显创建一个帐户? 创建一个帐户,并按下绿色注册按钮。 您会收到帐户启用电子邮件,启用帐户后,您就可以在主页上登入。
点击主界面上的绿色+新建项目按钮。 输入“Puppet”,为项目的路径 ,然后单击创建项目 。 在项目路径字段中输入“Puppet”,并选择公共的可见性级别 ,然后单击绿色创建项目按钮。
确保您复制SSH URL,您将看到在项目屏幕的顶部,因为我们将需要它在以后的步骤。 它会看起来像git@ your_git_server_ip : username /puppet.git
。
第2步 - 向Git Labs添加SSH密钥
在这一步中,我们将在Puppet服务器上创建一个SSH密钥,然后将该密钥添加到Git Labs服务器。
登录到Puppet作为根服务器。 (因为Puppet的文件将由root拥有,我们需要有权在Puppet文件夹中设置初始Git仓库)。
为root用户创建SSH密钥。 确保不要输入密码,因为此密钥将由脚本使用,而不是用户。
ssh-keygen -t rsa
接下来,使用以下命令显示您的公共密钥。
cat ~/.ssh/id_rsa.pub
复制此键。 它看起来像ssh-rsa long_alphanumeric_string root@ hostname
。
现在,你的Git实验室仪表板页面上,点击配置文件设置图标,顶部栏上,右二。 在左侧菜单中,单击SSH密钥 ,然后单击绿色添加SSH密钥按钮。 在标题 ,字段中添加键(如“根Puppet密钥”)的描述,并粘贴您的公共钥匙插入钥匙领域。 最后,点击添加键 。
第3步 - 安装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,纳米等)编辑/etc/puppet/puppet.conf
有以下变化。
让我们通过向一些改变开始/etc/puppet/puppet.conf
文件中我们的具体设置。 使用nano或您喜欢的文本编辑器打开文件。
sudo nano /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
应该像一旦你用上面的修改完成。
[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的工作方式是通过查看名为manifest的文件来定义它应该做什么,所以在这一步中,我们将为Puppet创建一个有用的模块来运行。
我们的第一个模块,我们称之为cron-puppet,将通过Git部署Puppet。 它会安装一个Git钩子将一个成功的合并(如混帐拉)后运行Puppet,它会安装一个cron作业来执行一个git pull
每次30分钟。
首先,进入Puppet modules目录。
cd /etc/puppet/modules
接下来,做一个cron-puppet
包含的目录manifests
和files
目录。
sudo mkdir -p cron-puppet/manifests cron-puppet/files
创建并打开一个名为init.pp
在manifests
目录。
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'],
}
}
保存并关闭该文件,然后打开名为另一个文件post-merge
的files
目录。
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
。 这将创建一个名为“default”的节点分类。 “默认”节点中包含的任何内容都将在每个服务器上运行。 在这里,我们告诉它运行我们cron-puppet
模块。
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创建画面上的启用用户数据复选框,并输入以下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系统,并且可以启动任何数量的附加服务器,而无需登录到它们。