如何建立一个全自动(Masterless)Puppet环境在Ubuntu 14.04

通常情况下,用户按下其Puppet模块版本控制服务器,然后拉这些模块向下一个Puppet主。Puppet客户端定期连接到Puppet Master拉和应用任何更改。 这种情况下正常工作,直到很多客户都在检查或模块变得复杂。在这一点上,你可以集群的Puppet师来处理负载,或只是下降的Puppet Master干脆。本文将考虑第二个选项。

介绍

在云计算的现代世界中,配置管理是至关重要的一步。 配置管理工具允许您配置,可靠部署到服务器。 其中一个在这个领域比较成熟的配置管理工具是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_ipyour_puppet_server_ip分别。

因此,要遵循本教程,您将需要:

设置的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

该文件将如下所示:

原始/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/facterfactpath=$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的工作方式是通过查看名为manifest的文件来定义它应该做什么,所以在这一步中,我们将为Puppet创建一个有用的模块来运行。

我们的第一个模块,我们称之为cron-puppet,将通过Git部署Puppet。 它会安装一个Git钩子将一个成功的合并(如混帐拉)后运行Puppet,它会安装一个cron作业来执行一个git pull每次30分钟。

首先,进入Puppet modules目录。

cd /etc/puppet/modules

接下来,做一个cron-puppet包含的目录manifestsfiles目录。

sudo mkdir -p cron-puppet/manifests cron-puppet/files

创建并打开一个名为init.ppmanifests目录。

sudo nano cron-puppet/manifests/init.pp

以下代码复制到init.pp 这是告诉Puppet从Git每半小时拉一次。

init.pp

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-mergefiles目录。

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模块。

site.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创建画面上的启用用户数据复选框,并输入以下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系统,并且可以启动任何数量的附加服务器,而无需登录到它们。