Puppet是一种配置管理工具,可帮助系统管理员自动化服务器基础架构的准备、配置和管理。提前规划并使用Puppet等配置管理工具可以减少重复基本任务所花费的时间,并有助于确保配置在整个基础架构中保持一致和准确。
Puppet有两种,Puppet Enterprise和开源Puppet。它们都可以在大多数Linux发行版、各种UNIX平台和Windows上运行。
在本教程中,我们将演示如何在Ubuntu 16.04上的主代理设置中安装开源Puppet 4。在此设置中,运行Puppet Server软件的Puppet master服务器可用于控制所有其他服务器,称为Puppet agent节点。Puppet 的原理和语法介绍详见腾讯云社区相关教程。
要学习本教程,您需要三台Ubuntu 16.04服务器,每台服务器都有一位具有sudo
权限的非root用户。
一台服务器将是Puppet master。Puppet master将运行资源密集型的Puppet Server,需要:
为了管理更大的基础架构,Puppet master需要更多资源。
另外两台服务器将是由Puppet master管理的Puppet agent节点。我们将他们命名为db1
和web1
。
这三台服务器到位后,您就可以开始了。
Puppet master服务器及其管理的节点需要能够相互通信。在大多数情况下,使用DNS即可完成,可以在外部托管服务上配置,也可以在作为基础结构一部分维护的自托管DNS服务器上配置。
DNS有它自己专业的域,在托管服务上也有,但是为了专注于Puppet本身的基础知识并消除我们学习过程中的故障排除的潜在复杂性,在本教程中我们将使用该/etc/hosts
文件。
在每台计算机上,编辑/etc/hosts
文件。在文件的末尾,指定Puppet master服务器,如下所示,用您的Puppet master 替换IP地址:
$ sudo nano /etc/hosts
/etc/hosts
. . .
puppet_ip_address puppet
. . .
完成后,保存并退出。
注意:默认情况下,Puppet agent会在puppet查找Puppet master,以便更轻松地设置Puppet。这意味着在
/etc/hosts
我们必须使用puppet
。如果puppet
没有解析为Puppet master,则agent将无法在未_配置_server代理的puppet.conf
中的值的情况下进行联系。
Puppet Server是将配置从Puppet主服务器推送到其他服务器的软件。它只在Puppet master上运行; 其他主机将运行Puppet agent。
注意: Ubuntu软件包管理器确实包含Puppet的软件包,但许多管理员需要管理多个操作系统和版本。在这种情况下,使用官方Puppet Labs存储库可以简化管理,允许您在所有系统上维护相同的Puppet版本。
我们将使用以下命令启用官方Puppet Labs集合存储库:
puppet$ curl -O https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
puppet$ sudo dpkg -i puppetlabs-release-pc1-xenial.deb
puppet$ sudo apt-get update
当apt-get update
完成,确保我们将从木偶实验室库成为拉动,我们将安装puppetserver
包:
puppet$ sudo apt-get install puppetserver
按Y
继续。安装完成后,启动服务器之前,我们将花点时间配置内存。
默认情况下,Puppet Server配置为使用2GB的RAM。您可以根据主服务器具有多少可用内存以及它将管理多少代理节点来自定义此设置。
要自定义它,请打开/etc/default/puppetserver
:
puppet$ sudo nano /etc/default/puppetserver
然后找到JAVA_ARGS
行,使用-Xms
和-Xmx
参数来设置内存分配。我们将增加到3千兆字节:
/etc/default/ puppetserver
JAVA_ARGS="-Xms3g -Xmx3g -XX:MaxPermSize=256m"
完成后保存并退出。
当我们启动Puppet Server时,它将使用端口8140进行通信,因此我们要确保它是开放的:
puppet$ sudo ufw allow 8140
接下来,我们将启动Puppet server。
我们将使用systemctl启动Puppet server:
puppet$ sudo systemctl start puppetserver
这需要一些时间才能完成。
一旦我们返回到命令提示符,我们将验证我们是否已成功,因为systemctl不会显示所有服务管理命令的结果:
puppet$ sudo systemctl status puppetserver
我们应该看到一行显示“active (running)”,最后一行应该如下所示:
Dec 07 16:27:33 puppet systemd[1]: Started puppetserver Service.
现在我们确保服务器正在运行,我们将其配置为开机自启:
puppet$ sudo systemctl enable puppetserver
如果服务器正在运行,现在我们可以在两台代理机器上设置Puppet Agent,db1
和web1
。
Puppet agent软件必须安装在Puppet master管理的服务器上。在大多数情况下包括基础架构中的每个服务器。
注意: Puppet agent可以在所有主要Linux发行版、某些UNIX平台和Windows上运行。安装说明因操作系统而异。
首先,我们将使用以下命令启用官方Puppet Labs集合存储库:
db1$ wget https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
db1$ sudo dpkg -i puppetlabs-release-pc1-xenial.deb
db1$ sudo apt-get update
然后,我们将安装puppet-agent
包:
db1$ sudo apt-get install puppet-agent
启动代理并使其开机自启:
db1$ sudo systemctl start puppet
db1$ sudo systemctl enable puppet
最后,在web1重复以下步骤:
web1$ wget https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
web1$ sudo dpkg -i puppetlabs-release-pc1-xenial.deb
web1$ sudo apt-get update
web1$ sudo apt-get install puppet-agent
web1$ sudo systemctl enable puppet
web1$ sudo systemctl start puppet
现在两个代理节点都在运行Puppet agent软件,我们将在Puppet master上签署证书。
Puppet第一次在代理节点上运行时,它会向Puppet master发送证书签名请求。在Puppet Server能够与代理节点通信并控制代理节点之前,它必须签署该特定代理节点的证书。
要列出所有未签名的证书请求,请在Puppet master上运行以下命令:
puppet$ sudo /opt/puppetlabs/bin/puppet cert list
您设置的每个主机应该有一个请求,如下所示:
"db1.localdomain" (SHA256) 46:19:79:3F:70:19:0A:FB:DA:3D:C8:74:47:EF:C8:B0:05:8A:06:50:2B:40:B3:B9:26:35:F6:96:17:85:5E:7C
"web1.localdomain" (SHA256) 9D:49:DE:46:1C:0F:40:19:9B:55:FC:97:69:E9:2B:C4:93:D8:A6:3C:B8:AB:CB:DD:E6:F5:A0:9C:37:C8:66:A0
证书前面的+
表示已签名。没有加号表示我们的新证书尚未签署。
要对单个证书请求进行签名,请使用puppet cert sign
命令以及证书请求中显示的证书的主机名。
例如,要签署db1
的证书,您将使用以下命令:
puppet$ sudo /opt/puppetlabs/bin/puppet cert sign db1.localdomain
类似于以下示例的输出表明证书请求已签名:
Notice: Signed certificate request for db.localdomain
Notice: Removing file Puppet::SSL::CertificateRequest db1.localdomain at '/etc/puppetlabs/puppet/ssl/ca/requests/db1.localdomain.pem'
Puppet master现在可以通信并控制签名证书所属的节点。您也可以立即签署所有当前请求。
我们将使用--all
选项签署剩余的证书:
puppet$ sudo /opt/puppetlabs/bin/puppet cert sign --all
现在所有证书都已签名,Puppet可以管理基础架构。您可以在如何管理Puppet 4证书备忘单中了解有关管理证书的更多信息。
Puppet使用域的特定语言来描述系统配置,这些描述将保存到名为“manifests”的文件中,这些文件具有文件扩展名.pp。现在我们将创建一个简短的指令来验证Puppet Server是否可以按预期管理代理。
我们首先在默认位置创建默认清单site.pp:
puppet$ sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp
我们将使用Puppet的域的特定语言来创建一个名为it_works.txt
代理节点的文件,该代理节点位于tmp
包含代理服务器的公共IP地址的目录中,并将权限设置为-rw-r--r--
:
site.pp example
1 file {'/tmp/it_works.txt': # resource type file and filename
2 ensure => present, # make sure it exists
3 mode => '0644', # file permissions
4 content => "It works on ${ipaddress_eth0}!\n", # Print the eth0 IP fact
5 }
默认情况下,Puppet Server默认情况下每30分钟在其清单中运行命令。如果删除该文件,ensure
指令将导致重新创建它。mode
指令将设置文件权限,并将content
指令添加到指令中。
我们还可以使用puppet agent --test
在单个节点上测试清单。注意,这--tes
不是试运行;如果成功,它将改变代理的配置。
我们不会等待Puppet master应用更改,而是立即在db1
应用清单:
db1$ sudo /opt/puppetlabs/bin/puppet agent --test
输出应该类似于:
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog for db1.localdomain
Info: Applying configuration version '1481131595'
Notice: /Stage[main]/Main/File[/tmp/it_works.txt]/ensure: defined content as '{md5}acfb1c7d032ed53c7638e9ed5e8173b0'
Notice: Applied catalog in 0.03 seconds
完成后,我们将检查文件内容:
db1$ cat /tmp/it_works.txt
It works on 203.0.113.0!
在web1
重复此操作,或者,如果您愿意,请在半小时左右检查以验证Puppet主服务器是否自动运行。
注意:您可以检查Puppet主服务器上的日志文件,以查看Puppet上次编译代理程序目录的时间,这表明应该已应用所需的任何更改。
puppet$ tail /var/log/puppetlabs/puppetserver/puppetserver.log
. . .
2016-12-07 17:35:00,913 INFO [qtp273795958-70] [puppetserver] Puppet Caching node for web1.localdomain
2016-12-07 17:35:02,804 INFO [qtp273795958-68] [puppetserver] Puppet Caching node for web1.localdomain
2016-12-07 17:35:02,965 INFO [qtp273795958-68] [puppetserver] Puppet Compiled catalog for web1.localdomain in environment production in 0.13 seconds
. . .
恭喜!您已在 Master/Agent模式下成功安装了Puppet。
现在您已经安装了基本的Puppet Master/Agent,您可以了解有关如何使用Puppe的更多信息。查看腾讯云社区:puppet学习笔记的相关教程。
参考文献:《How To Install Puppet 4 on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。