如何在 Ubuntu 14.04 上建立无主 Puppet 环境

介绍

在现代云计算的世界中,配置管理是一个关键的步骤。 Configuration management tools 允许您可靠地部署配置到您的服务器上。

在典型的 Puppet 环境中,用户在工作站上写 Puppet 模块,将模块推到版本控制服务器(如 Git),然后将这些模块拖到 Puppet 主机上。

此场景工作很好,直到你必须开始扩展多少服务器正在检查或模块变得相当复杂. 在那时,你有两种选择:将你的娃娃主组合来处理负载(这可能需要你购买的商用版本的娃娃),或者只是完全放下娃娃主。

一个无神论的Puppet设置需要将所有Puppet模块的副本复制到每个节点通过Git,然后让Puppet在本地应用这些更改。这种方法的缺点是,每个服务器都下载所有模块,然后应用相关的内容,所以它不是例如具有敏感信息的设置的最佳选择。

前提条件

如果你对 Puppet 是新手,那么你可能想在这里停下来阅读 这篇关于 Puppet 的文章,因为本教程假定你对工具有工作知识。

在本教程中,我们将使用两个Dropplets:一个作为Git服务器运行,另一个我们将通过Puppet应用更改,我们将参考这些Dropplets的IP地址分别为your_git_server_ipyour_puppet_server_ip

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

设置 Git Labs 最简单的方法是使用单击图像:在选择图像下的 Droplet 创建页面上,点击应用程序选项卡,然后点击GitLab 7.10.0 CE在 14.04**上。

步骤 1 – 创建一个 Git 存储库

第一步是创建一个存储库,在那里我们所有的娃娃模块和宣言将被存储。

首先,打开Git Labs的用户界面,在您最喜欢的浏览器中进入http://your_git_server_ip。 通过在新用户下右侧填写详细信息来创建一个帐户,然后点击绿色登录按钮。 您将收到一个帐户激活电子邮件,在激活您的帐户后,您将能够在主页上登录。

点击主页上的绿色 **+ 新项目 ** 按钮。 输入 ** 项目路径 ** 的娃娃,然后点击 ** 创建项目 **. 在 ** 项目路径 ** 字段中输入娃娃,然后选择 ** 可见性级别 ** 的 ** 公共 **,然后点击绿色 ** 创建项目 ** 按钮。

请确保您复制 SSH URL,您将看到项目屏幕的顶部,因为我们将在以后的步骤中需要它。

步骤 2 — 将 SSH 密钥添加到 Git Labs

在此步骤中,我们将在 Puppet 服务器上创建一个 SSH 密钥,然后将该密钥添加到 Git Labs 服务器中。

登录 Puppet 服务器作为 root. (由于 Puppet 文件将由 root 拥有,我们需要在 Puppet 文件夹中设置初始 Git 复制程序的权限。

为 root 用户创建 SSH 密钥. 请确保不输入密码,因为这个密钥将被脚本使用,而不是用户。

1ssh-keygen -t rsa

接下来,用以下命令显示您的公共密钥。

1cat ~/.ssh/id_rsa.pub

它会看起来像 ssh-rsa long_alphanumeric_string root@hostname

现在,在您的 Git Labs 仪表板页面上,点击顶部栏的 Profile settings 图标,从右边开始。在左边的菜单中,点击 SSH Keys,然后点击绿色 添加 SSH 密钥 按钮。在 Title 字段中,添加密钥的描述(如根娃娃密钥),然后将您的公共密钥粘贴到 Key 字段中。

步骤 3 – 安装 Puppet 和 Git

在此步骤中,我们将安装 Puppet 和 Git。

在 Puppet 服务器上,先下载 Ubuntu 14.04 的 Puppet 包。

1wget http://apt.puppetlabs.com/puppetlabs-release-trusty.deb

安装包。

1dpkg -i /tmp/puppetlabs-release-trusty.deb

更新您的系统的包列表。

1apt-get update

最后,安装 Puppet 和 git。

1apt-get install puppet git-core

在此时刻,您应该根据 本教程中的说明来配置您的 Git 环境。

步骤 4 – 推开初始娃娃配置

有了 Puppet 和 Git 安装,我们已经准备好将初始推向我们的 Puppet 存储库。

首先,移动到/etc/puppet目录,在那里配置文件活着。

1cd /etc/puppet

点击这里启动 git 存储库。

1git init

在当前目录中添加所有内容。

1git add .

用描述性评论承诺这些变化。

1git commit -m "Initial commit of Puppet files"

将我们之前创建的 Git 项目添加为源,使用您在步骤 1 中复制的 SSH URL。

1git remote add origin git@your_server_ip:username/puppet.git

最后,推动变革。

1git push -u origin master

第5步:清理娃娃的配置

现在Puppet已安装,我们可以把一切都整合在一起. 在此时,您可以作为 root 登录,而不是作为您在前提条件下创建的 sudo 非 root 用户登录。

首先,我们将清理 /etc/puppet/puppet.conf 文件. 使用您最喜欢的编辑器 (vim, nano,等等) 编辑 /etc/puppet/puppet.conf 与以下变化。

让我们开始通过对我们特定的设置的 /etc/puppet/puppet.conf 文件进行一些更改。

1sudo nano /etc/puppet/puppet.conf

文件将看起来像这样:

 1[label Original /etc/puppet/puppet.conf]
 2
 3[main]
 4logdir=/var/log/puppet
 5vardir=/var/lib/puppet
 6ssldir=/var/lib/puppet/ssl
 7rundir=/var/run/puppet
 8factpath=$vardir/lib/facter
 9templatedir=$confdir/templates
10
11[master]
12# These are needed when the puppetmaster is run by passenger
13# and can safely be removed if webrick is used.
14ssl_client_header = SSL_CLIENT_S_DN 
15ssl_client_verify_header = SSL_CLIENT_VERIFY

首先,从[主]行删除所有东西,因为我们没有运行娃娃大师。在[主]部分中删除以templatedir开头的最后一行,因为这被贬值了。最后,将读取factpath=$vardir/lib/facter的行更改为factpath=$confdir/facter

以下是您的「puppet.conf」在完成上述更改后应该是什么样子。

1[label Modified /etc/puppet/puppet.conf]
2
3[main]
4logdir=/var/log/puppet
5vardir=/var/lib/puppet
6ssldir=/var/lib/puppet/ssl
7rundir=/var/run/puppet
8factpath=$confdir/facter

步骤 6 – 添加一个娃娃模块

现在Puppet设置了,但它没有做任何工作。Puppet的工作方式是通过查看称为宣言的文件来定义它应该做什么,所以在这个步骤中,我们将创建一个有用的模块来运行Puppet。

我们的第一个模块,我们将称之为Cron-puppet,将通过Git部署Puppet,它将安装一个Git绑架器,在成功合并后运行Puppet(例如 git pull),它将安装一个Cron任务,每30分钟执行一个git pull

首先,进入 Puppet 模块目录。

1cd /etc/puppet/modules

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

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

表现目录中创建并打开名为init.pp的文件。

1sudo nano cron-puppet/manifests/init.pp

将以下代码复制到init.pp,这就是Puppet 每半小时从 Git 中提取的信息。

 1[label init.pp]
 2
 3class cron-puppet {
 4    file { 'post-hook':
 5    	ensure  => file,
 6    	path    => '/etc/puppet/.git/hooks/post-merge',
 7    	source  => 'puppet:///modules/cron-puppet/post-merge',
 8    	mode    => 0755,
 9    	owner   => root,
10    	group   => root,
11    }
12    cron { 'puppet-apply':
13    	ensure  => present,
14    	command => "cd /etc/puppet ; /usr/bin/git pull",
15    	user    => root,
16    	minute  => '*/30',
17    	require => File['post-hook'],
18    }
19}

保存并关闭文件,然后在文件目录中打开另一个名为合并后的文件。

1sudo nano cron-puppet/files/post-merge

将下面的 bash 脚本复制为合并后。这个 bash 脚本将在成功的 Git 合并后运行,并记录运行结果。

 1[label post-merge]
 2
 3#!/bin/bash -e
 4## Run Puppet locally using puppet apply
 5/usr/bin/puppet apply /etc/puppet/manifests/site.pp
 6
 7## Log status of the Puppet run
 8if [ $? -eq 0 ]
 9then
10    /usr/bin/logger -i "Puppet has run successfully" -t "puppet-run"
11    exit 0
12else
13    /usr/bin/logger -i "Puppet has ran into an error, please run Puppet manually" -t "puppet-run"
14    exit 1
15fi

保存并关闭此文件

最后,我们必须告诉Puppet通过创建一个全球宣言来运行此模块,该宣言可在/etc/puppet/manifests/site.pp上找到。

1sudo nano /etc/puppet/manifests/site.pp

将下列内容粘贴到site.pp中,创建一个称为默认的节点分类。包含在默认节点中的任何内容都会在每个服务器上运行,在这里我们告诉它运行我们的cron-puppet模块。

1[label site.pp]
2
3node default {
4    include cron-puppet
5}

保存并关闭文件. 现在,让我们通过运行它来确保我们的模块工作。

1sudo puppet apply /etc/puppet/manifests/site.pp

成功运行后,你应该看到一些输出以这样的线路结束。

1...
2
3Notice: Finished catalog run in 0.18 seconds

最后,让我们对 Git 存储库进行更改,首先,作为 root 用户登录,因为这是具有 SSH 密钥访问存储库的用户。

接下来,转到/etc/puppet目录。

1cd /etc/puppet

将该目录中的所有内容添加到 commit。

1git add .

用描述性消息承诺更改。

1git commit -m "Added the cron-puppet module"

最后,推动变化。

1git push -u origin master

结论

若要添加更多服务器,只需按照上面的步骤 3 安装 Puppet 和 Git 在新服务器上,然后将 Git 存储库克隆为 /etc/puppet' 并应用 site.pp' 宣言。

您甚至可以通过使用 用户数据来自动化此安装,当您创建 Droplet 时,请确保您在创建 Droplet 时使用 SSH 密钥,并将 SSH 密钥添加到您的 GitLab 服务器中。

 1#!/bin/bash -e
 2
 3## Install Git and Puppet
 4wget -O /tmp/puppetlabs.deb http://apt.puppetlabs.com/puppetlabs-release-`lsb_release -cs`.deb
 5dpkg -i /tmp/puppetlabs.deb
 6apt-get update
 7apt-get -y install git-core puppet
 8
 9# Clone the 'puppet' repo
10cd /etc
11mv puppet/ puppet-bak
12git clone http://your_git_server_ip/username/puppet.git /etc/puppet
13
14# Run Puppet initially to set up the auto-deploy mechanism
15puppet apply /etc/puppet/manifests/site.pp

你现在有一个无与伦比的Puppet系统,你可以打开任何数量的额外服务器,而不必登录它们。

Published At
Categories with 技术
comments powered by Disqus