在现代云计算领域,配置管理是至关重要的一步。配置管理工具允许您可靠地将配置部署到服务器。Puppet是这个领域中比较成熟的配置管理工具之一。
在典型的Puppet环境中,用户在其工作站上编写Puppet模块,将模块推送到版本控制服务器(例如Git),然后将这些模块下拉到Puppet主服务器。运行Puppet客户端的服务器定期连接到Puppet主服务器以查看是否有任何更改,如果是,则应用更改。
这种情况可以正常工作,直到您必须开始扩展登记的服务器数量或模块变得相当复杂。此时你有两个选择:聚集你的Puppet Master以处理负载(这可能需要你购买Puppet的商业版本),或者只是放弃Puppet master。本文将研究第二个选项。
无主的Puppet设置需要通过Git将所有Puppet模块的副本复制到每个节点,然后让Puppet在本地应用更改。这种方法的缺点是每个服务器下载所有模块,然后应用相关的,所以它不是例如具有敏感信息的设置的最佳选择。但是,在没有Puppet master的情况下运行会为您提供很大的灵活性,并且无需扩展基础架构即可实现。
本教程假定您对Puppet和Git有所了解。
在本教程中,我们将使用两个腾讯云CVM:一个作为Git服务器运行,另一个我们将通过Puppet应用更改。我们将分别用your_git_server_ip
和your_puppet_server_ip
引用腾讯云CVM的IP地址。
因此,要学习本教程,您需要:
设置Git Labs的最简单方法是使用单击图像:在选择图像下的腾讯云CVM创建页面上,单击Applications选项卡,然后单击14.04上的GitLab 7.10.0 CE。
第一步是创建一个存储库,其中将存储所有Puppet模块和清单。
首先,通过您喜欢的浏览器访问http://your_git_server_ip
来打开Git Labs UI 。通过在新用户下填写右侧的详细信息来创建帐户,创建一个帐户并按绿色注册按钮。您将收到帐户激活电子邮件,激活帐户后,您将可以在主页面上登录。
单击主页面上的绿色+新建项目按钮。输入项目路径的 “puppet” ,然后单击“ 创建项目”。在“ 项目路径”字段中输入“puppet” ,然后为“ 可见性级别”选择“ 公共 ” ,然后单击绿色的“ 创建项目”按钮。
确保复制SSH URL,您将在项目屏幕的顶部看到它,因为我们将在以后的步骤中使用它。它看起来类似git@your_git_server_ip:username/puppet.git
这样。
在此步骤中,我们将在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设置图标,右侧第二个。在左侧菜单中,单击SSH Keys,然后单击绿色Add a SSH Key按钮。在标题中,字段添加密钥的描述(如“Root Puppet Key”),并将您的公钥粘贴到Key字段中。最后,单击“ 添加”键。
在这一步中,我们将安装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环境。
安装了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项目添加为origin。
git remote add origin git@your_server_ip:username/puppet.git
最后,推动变革。
git push -u origin master
现在已经安装了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
该文件将如下所示:
[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。同时删除templatedir
开头的[main]
部分中的最后一行,因为这是不推荐使用的。最后,改变读取行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
现在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
。这将创建一个名为“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
清单。
您甚至可以在创建腾讯云CVM时使用用户数据自动执行此安装。确保在创建腾讯云CVM时使用SSH密钥,并将该SSH密钥添加到GitLab服务器。然后勾选腾讯云CVM创建屏幕上的启用用户数据复选框,并输入以下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系统,可以启动任意数量的其他服务器,甚至无需登录。
想要了解更多关于设置Masterless Puppet环境的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Set Up a Masterless Puppet Environment on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。