介绍
来自Puppet Labs的Puppet是一种配置管理工具,可帮助系统管理员自动化服务器基础架构的配置,配置和管理。提前规划并使用Puppet等配置管理工具可以减少重复基本任务所花费的时间,并有助于确保您的配置在整个基础架构中保持一致和准确。一旦掌握了使用Puppet和其他自动化工具管理服务器的情况,您将有更多的空闲时间可用于改进设置的其他方面。
Puppet有两个品种,Puppet Enterprise和开源Puppet。它可以在大多数Linux发行版,各种UNIX平台和Windows上运行。
在本教程中,我们将介绍如何在CentOS 7上的代理/主设置中安装开源Puppet 4。在此设置中,运行Puppet Server软件的Puppet主服务器可用于控制所有其他服务器,或Puppet代理节点。请注意,我们将使用Puppet Server软件包,而不是Passenger或任何其他运行时环境。
要完成本教程,您需要具备一台已经设置好可以使用sudo
命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
准备
要学习本教程,您必须拥有对要使用Puppet的所有服务器的root用户或超级用户访问权限。您还需要创建一个新的CentOS 7服务器作为Puppet主服务器。如果您没有现有的服务器基础结构,请按照准备DNS设置教程重新创建示例基础结构(如下所述)。
在开始安装Puppet之前,请确保您做好了以下:
- 专用网络DNS:必须配置正向和反向DNS,并且每个服务器必须具有唯一的主机名。如果未配置DNS,则必须使用
hosts
文件进行名称解析。我们假设您将使用您的专用网络在您的基础架构中进行通信。 - 防火墙打开端口:必须在端口8140上访问Puppet主机。
基础结构示例
我们将使用以下基础结构来演示如何设置Puppet:
主机名 | 角色 | 私人FQDN |
---|---|---|
主机1 | 通用CentOS 7服务器 | host1.nyc3.example.com |
主机2 | 通用CentOS 7服务器 | host2.nyc3.example.com |
NS1 | 主名称服务器 | ns1.nyc3.example.com |
NS2 | 辅助名称服务器 | ns2.nyc3.example.com |
puppet代理将安装在所有这些主机上。这些主机将由其专用网络接口引用,这些接口映射到DNS中的“.nyc3.example.com”子域。这与准备教程中描述的基础结构相同:如何在CentOS 7上将BIND配置为专用网络DNS服务器。
做好这些准备后,让我们继续创建Puppet主服务器!
创建Puppet主服务器
创建一个新的CentOS 7 x64服务器,使用“puppet”作为其主机名。硬件要求取决于您要管理的代理节点数量; 两个CPU核心和1 GB内存是管理少数节点的最低要求,但如果您的服务器基础架构较大,则需要更多资源。Puppet Server默认配置为使用2 GB的RAM。
主机名 | 角色 | 私人FQDN |
---|---|---|
puppet | Puppet master | puppet.nyc3.example.com |
如果您只是设置DNS并且不确定如何包含新主机,请参阅DNS教程的维护DNS记录部分。实质上,您需要添加“A”和“PTR”记录,并允许新主机执行递归查询。此外,请确保配置搜索域,以便服务器可以使用短主机名相互查找。
注意:本教程假设您的Puppet master的主机名是“puppet”。如果您使用其他名称,则需要与本教程略有不同。具体而言,您必须在Puppet代理节点的配置文件中指定Puppet master的主机名,并且必须在签署任何代理证书之前重新生成Puppet master的SSL证书。否则,您将收到此错误:Error: Could not request certificate: The certificate retrieved from the master does not match the agent's private key.
。
本教程不介绍配置此设置。
安装NTP
由于它充当代理节点的证书颁发机构,因此Puppet主服务器必须保持准确的系统时间,以避免在颁发代理证书时出现潜在问题 - 如果存在时间差异,证书似乎已过期。我们将使用网络时间协议(NTP)来实现此目的。
首先,使用此命令查看可用的时区:
代码语言:javascript复制timedatectl list-timezones
这将为您提供服务器可用的时区列表。当您找到适合您的服务器的区域/时区设置时,请使用此命令设置它(替换您首选的区域和时区):
代码语言:javascript复制sudo timedatectl set-timezone America/New_York
使用以下命令通过yum安装NTP:
代码语言:javascript复制sudo yum -y install ntp
使用ntpdate
命令执行一次性时间同步:
sudo ntpdate pool.ntp.org
通常的做法是更新NTP配置以使用地理位置更靠近NTP服务器的“池区域”。在Web浏览器中,转到NTP池项目并查找在地理位置上关闭您正在使用的数据中心的池区域。
打开ntp.conf
进行编辑:
sudo vi /etc/ntp.conf
将NTP池项目页面中的时间服务器添加到文件顶部(将其替换为您选择的服务器):
代码语言:javascript复制server 0.us.pool.ntp.org
server 1.us.pool.ntp.org
server 2.us.pool.ntp.org
server 3.us.pool.ntp.org
保存并退出。
启动NTP以添加新的时间服务器:
代码语言:javascript复制sudo systemctl restart ntpd
最后,启用NTP守护程序:
代码语言:javascript复制sudo systemctl enable ntpd
现在我们的服务器保持准确的时间,让我们安装Puppet Server软件。
安装Puppet Server
Puppet Server是在Puppet主服务器上运行的软件。它是将配置推送到其他服务器的组件,这些服务器将运行Puppet代理软件。
使用以下命令启用官方Puppet Labs集合存储库:
代码语言:javascript复制sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
安装puppetserver
包:
sudo yum -y install puppetserver
Puppet Server现在已安装在主服务器上,但尚未运行。
配置内存分配(可选)
默认情况下,Puppet Server配置为使用2 GB的RAM。您应该根据主服务器有多少可用内存以及它将管理多少个代理节点来自定义此设置。
首先,在您喜欢的文本编辑器中打开/etc/sysconfig/puppetserver
。我们将使用编辑器vi
:
sudo vi /etc/sysconfig/puppetserver
然后找到JAVA_ARGS
行,并使用-Xms
和-Xmx
参数来设置内存分配。例如,如果要使用3 GB内存,则该行应如下所示:
JAVA_ARGS="-Xms3g -Xmx3g"
完成后保存并退出。
启动Puppet Server
现在我们准备用这个命令启动Puppet Server:
代码语言:javascript复制sudo systemctl start puppetserver
接下来,启用Puppet Server,以便在主服务器启动时启动它:
代码语言:javascript复制sudo systemctl enable puppetserver
Puppet Server正在运行,但它还没有管理任何代理节点。让我们来学习如何安装和添加Puppet代理吧!
安装Puppet Agent
Puppet代理软件必须安装在Puppet master将管理的任何服务器上。在大多数情况下,这将包括基础架构中的每个服务器。正如介绍中所提到的,Puppet代理可以在所有主要的Linux发行版,一些UNIX平台和Windows上运行。由于每个操作系统的安装略有不同,本教程只介绍CentOS 7服务器上的安装。
在所有代理服务器上执行这些步骤。
使用以下命令启用官方Puppet Labs集合存储库:
代码语言:javascript复制sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
安装puppet-agent
包:
sudo yum -y install puppet-agent
现在已经安装了Puppet代理,使用以下命令启动它:
代码语言:javascript复制sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
第一次运行Puppet代理时,它会生成SSL证书并向Puppet主服务器发送签名请求。在Puppet master签署代理证书后,它将能够与代理节点通信并对其进行控制。
请记住为所有Puppet代理节点重复此部分。
注意:如果这是您的第一个Puppet代理,建议您在添加其他代理之前尝试在Puppet主服务器上签署证书,该证书将在下一步中介绍。验证一切正常后,您可以回过头来自信地添加剩余的代理节点。
在Puppet Master上签署证书
Puppet第一次在代理节点上运行时,它会向Puppet主机发送证书签名请求。在Puppet Server能够与代理节点通信并控制代理节点之前,它必须签署该特定代理节点的证书。我们将介绍如何签名和检查签名请求。
列出当前证书请求
在Puppet master上,运行以下命令以列出所有未签名的证书请求:
代码语言:javascript复制sudo /opt/puppetlabs/bin/puppet cert list
如果您只是设置了第一个代理节点,您将看到一个请求。使用代理节点的主机名,它看起来如下所示:
代码语言:javascript复制"host1.nyc3.example.com" (SHA256) 15:90:C2:FB:ED:69:A4:F7:B1:87:0B:BF:F7:DD:B5:1C:33:F7:76:67:F3:F6:23:AE:07:4B:F6:E3:CC:04:11:4C
请注意,它前面没有
。这表明它尚未签署。
签署请求
要对证书请求进行签名,请使用puppet cert sign
命令以及要签名的证书的主机名。例如,要签署host1.nyc3.example.com
证书,您将使用以下命令:
sudo /opt/puppetlabs/bin/puppet cert sign host1.nyc3.example.com
您将看到以下输出,表明证书请求已签名:
代码语言:javascript复制Notice: Signed certificate request for host1.nyc3.example.com
Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc3.example.com at '/etc/puppetlabs/puppet/ssl/ca/requests/host1.nyc3.example.com.pem'
Puppet master现在可以通信并控制签名证书所属的节点。
如果要签署所有当前请求,请使用--all
选项,如下所示:
sudo /opt/puppetlabs/bin/puppet cert sign --all
撤销证书
您可能想要从Puppet中删除主机,或者重建主机然后将其添加回Puppet。在这种情况下,您将需要从Puppet主服务器撤消主机的证书。为此,您可以使用clean
操作:
sudo /opt/puppetlabs/bin/puppet cert clean hostname
指定主机的关联证书将从Puppet中删除。
查看所有签名请求
如果要查看已签名和未签名的所有请求,请运行以下命令:
代码语言:javascript复制sudo /opt/puppetlabs/bin/puppet cert list --all
您将看到所有请求的列表。签名请求前面有一个
,而未签名的请求没有
。
"puppet" (SHA256) 5A:71:E6:06:D8:0F:44:4D:70:F0:BE:51:72:15:97:68:D9:67:16:41:B0:38:9A:F2:B2:6C:BB:33:7E:0F:D4:53 (alt names: "DNS:puppet", "DNS:puppet.nyc3.example.com")
"host1.nyc3.example.com" (SHA256) F5:DC:68:24:63:E6:F1:9E:C5:FE:F5:1A:90:93:DF:19:F2:28:8B:D7:BD:D2:6A:83:07:BA:FE:24:11:24:54:6A
"host2.nyc3.example.com" (SHA256) CB:CB:CA:48:E0:DF:06:6A:7D:75:E6:CB:22:BE:35:5A:9A:B3:93:63:BF:F0:DB:F2:D8:E5:A6:27:10:71:78:DA
"ns2.nyc3.example.com" (SHA256) 58:47:79:8A:56:DD:06:39:52:1F:E3:A0:F0:16:ED:8D:40:17:40:76:C2:F0:4F:F3:0D:F9:B3:64:48:2E:F1:CF
恭喜!您的基础架构现在已准备好由Puppet管理!
Puppet入门
现在您的基础架构已设置为使用Puppet进行管理,我们将向您展示如何使用Puppet执行一些基本任务。
如何收集事实
Puppet使用名为facter的工具收集有关其每个节点的事实。默认情况下,Facter收集对系统配置有用的信息(例如,OS名称,主机名,IP地址,SSH密钥等)。可以添加不属于默认事实集的自定义事实。
收集的事实在许多情况下都很有用。例如,您可以创建Web服务器配置模板,并自动为特定虚拟主机填写适当的IP地址。或者您可以确定您的服务器的分发是“CentOS”,因此您应该运行apache2
服务而不是httpd
。这些是基本的例子,但它们应该让您了解如何使用事实。
要查看代理节点上自动收集的事实列表,请运行以下命令:
代码语言:javascript复制/opt/puppetlabs/bin/facter
主要清单文件
Puppet使用特定于域的语言来描述系统配置,这些描述保存到名为“manifests”的文件中,这些文件具有.pp文件扩展名。默认主清单文件位于/etc/puppetlabs/code/environments/production/manifests/site.pp
上的Puppet主服务器上。我们现在创建一个占位符文件:
sudo touch /etc/puppetlabs/code/environments/production/manifests/site.pp
请注意,主清单现在是空的,因此Puppet不会在代理节点上执行任何配置。
如何执行主要清单
Puppet代理定期检查Puppet Server(通常每30分钟一次)。当它检入时,它将向主机发送关于它自己的事实,并拉出当前目录 - 由主清单确定的编译的资源列表及其与代理相关的所需状态。然后,代理节点将尝试进行适当的更改以实现其所需的状态。只要Puppet master正在运行并与代理节点通信,此循环将继续。
在特定代理节点上立即执行
也可以通过运行以下命令(在相关的代理节点上)手动启动对特定代理节点的检查:
代码语言:javascript复制/opt/puppetlabs/bin/puppet agent --test
运行此命令会将主清单应用于运行测试的代理。您可能会看到如下输出:
代码语言:javascript复制Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
...
Info: Loading facts
Info: Caching catalog for host1
Info: Applying configuration version '1457389302'
Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: defined content as '{md5}dd769ec60ea7d4f7146036670c6ac99f'
Notice: Applied catalog in 0.04 seconds
此命令对于查看主清单如何立即影响单个服务器非常有用。
一次性清单
puppet apply
命令允许您根据需要执行与主清单无关的清单。它仅将清单应用于您运行apply的节点。这是一个例子:
sudo /opt/puppetlabs/bin/puppet apply /path/to/your/manifest/init.pp
如果要在代理节点上测试新清单,或者只想运行清单一次(例如,将代理节点初始化为所需状态),则以这种方式运行清单非常有用。
示例清单
您可能还记得,Puppet master上的主要清单文件位于/etc/puppetlabs/code/environments/production/manifests/site.pp
。
在Puppet主服务器上,立即编辑它:
代码语言:javascript复制sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
现在添加以下行来描述文件资源:
代码语言:javascript复制file {'/tmp/example-ip': # resource type file and filename
ensure => present, # make sure it exists
mode => '0644', # file permissions
content => "Here is my Public IP Address: ${ipaddress_eth0}.n", # note the ipaddress_eth0 fact
}
现在保存并退出。内联注释应该解释我们正在定义的资源。用简单的英语,这将确保所有代理节点在/tmp/example-ip
都有一个具有-rw-r--r--
权限的文件,其内容包含节点的公共IP地址。
您可以等到代理自动检入主服务器,也可以运行puppet agent --test
命令(来自其中一个代理节点)。然后运行以下命令来打印文件:
cat /tmp/example-ip
您应该看到如下所示的输出(使用该节点的IP地址):
代码语言:javascript复制Here is my Public IP Address: 128.131.192.11.
指定节点
如果要为特定节点定义资源,请在清单中定义一个node
。
在主服务器,编辑site.pp
:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
现在添加以下行:
代码语言:javascript复制node 'ns1', 'ns2' { # applies to ns1 and ns2 nodes
file {'/tmp/dns': # resource type file and filename
ensure => present, # make sure it exists
mode => '0644',
content => "Only DNS servers get this file.n",
}
}
node default {} # applies to nodes that aren't explicitly defined
保存并退出。
现在Puppet将确保在ns1和ns2上存在一个在/tmp/dns
中的文件。如果您不想等待计划的Puppet代理程序拉取,则可能需要运行puppet agent --test
命令(来自ns1或ns2)。
请注意,如果您没有定义资源,Puppet将尽力不要触摸它。因此,如果从清单中删除这些资源,Puppet将不会删除它创建的文件。如果要删除文件,请更改ensure
为absent
。
这些示例没有做任何有用的事情,但它们确实证明了Puppet正常工作。
使用模块
现在让我们使用一个模块。模块可用于将任务分组在一起。Puppet社区中有许多模块,您甚至可以编写自己的模块。
在Puppet master上,从forgeapi 安装模块puppetlabs-apache
:
sudo /opt/puppetlabs/bin/puppet module install puppetlabs-apache
警告:请勿在现有Apache设置上使用此模块。它将清除任何不受Puppet管理的Apache配置。
现在编辑site.pp
:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
现在添加以下行以在host2上安装Apache :
代码语言:javascript复制node 'host2' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}
# node default {} # uncomment this line if it doesn't already exist in your manifest
保存并退出。现在Puppet下次更新host2时,它将安装Apache软件包,并配置名为“example.com”的虚拟主机,侦听端口80,以及文档根目录/var/www/html
。
在host2上,运行以下命令:
代码语言:javascript复制sudo /opt/puppetlabs/bin/puppet agent --test
您应该看到一堆输出,表明正在安装Apache。完成后,在Web浏览器中打开host2的公共IP地址。您应该看到Apache正在提供的页面。
恭喜!你使用过你的第一个Puppet模块!
结论
现在您已经安装了基本的代理/主Puppet,现在您可以了解有关如何使用Puppet管理服务器基础结构的更多信息。查看以下教程:10分钟带你光速入门运维工具之-Puppet
想要了解更多关于在主代理安装程序中安装Puppet 4的相关教程,请前往腾讯云 社区学习更多知识。
参考文献:《How To Install Puppet 4 in a Master-Agent Setup on CentOS 7》