介绍
在现代云计算的世界中,配置管理是一个关键的步骤。 Configuration management tools 允许您可靠地部署配置到您的服务器上。
在典型的 Puppet 环境中,用户在工作站上写 Puppet 模块,将模块推到版本控制服务器(如 Git),然后将这些模块拖到 Puppet 主机上。
此场景工作很好,直到你必须开始扩展多少服务器正在检查或模块变得相当复杂. 在那时,你有两种选择:将你的娃娃主组合来处理负载(这可能需要你购买的商用版本的娃娃),或者只是完全放下娃娃主。
一个无神论的Puppet设置需要将所有Puppet模块的副本复制到每个节点通过Git,然后让Puppet在本地应用这些更改。这种方法的缺点是,每个服务器都下载所有模块,然后应用相关的内容,所以它不是例如具有敏感信息的设置的最佳选择。
前提条件
如果你对 Puppet 是新手,那么你可能想在这里停下来阅读 这篇关于 Puppet 的文章,因为本教程假定你对工具有工作知识。
在本教程中,我们将使用两个Dropplets:一个作为Git服务器运行,另一个我们将通过Puppet应用更改,我们将参考这些Dropplets的IP地址分别为your_git_server_ip
和your_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
接下来,创建一个包含manifests
和files
目录的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系统,你可以打开任何数量的额外服务器,而不必登录它们。