介绍
Puppet,来自Puppet Labs,是一个配置管理工具,可以帮助系统管理员自动配置,配置和管理服务器基础设施。提前规划和使用Puppet等配置管理工具可以减少重复基本任务的时间,并有助于确保您的配置在整个基础设施中一致和准确。
Puppet 有两种类型, Puppet Enterprise 和开源 Puppet. 它在大多数 Linux 发行版、各种 UNIX 平台和 Windows 上运行。
在本教程中,我们将介绍如何在 CentOS 7 上的代理/主设置中安装开源 Puppet 4。 在此设置中,可以使用运行 Puppet Server 软件的 Puppet master 服务器来控制所有其他服务器或 ** Puppet agent** 节点。
前提条件
要遵循本教程,您必须有 root 或超级用户访问您想要使用 Puppet 的所有服务器。 您还将被要求创建新的 CentOS 7 服务器作为 Puppet 主服务器 . 如果您没有现有的服务器基础设施,请通过遵循先决条件的 DNS 设置教程来重建示例基础设施(如下所述)。
在我们开始安装 Puppet 之前,请确保您具备以下先决条件:
- 私人网络DNS: 前向和反向DNS必须配置,每个服务器必须有一个独特的主机名称. 这里有一个教程 配置自己的私人网络DNS服务器 如果您没有配置DNS,您必须使用您的
主机
文件来解决名称。 我们将假定您将使用您的私人网络在您的基础设施内进行通信。 - 防火墙开放端口: 娃娃大师必须在端口8140上可访问。
基础设施的例子
我们将使用以下基础设施来展示如何设置Puppet:
主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名
这些主机将被他们的私人网络接口所引用,这些接口在DNS中被绘制为 ".nyc3.example.com"子域,这是前提教程中描述的相同的基础设施: 如何在CentOS 7上配置BIND作为私人网络DNS服务器。
一旦你有所有前提条件,让我们继续创建Puppet主服务器!
创建 Puppet Master 服务器
创建一个新的 CentOS 7 x64 服务器,使用puppet
作为其主机名称。硬件要求取决于您想要管理多少代理节点;两个 CPU 核心和 1 GB 的内存是管理少数节点的 minimum 要求,但如果您的服务器基础设施更大,您需要更多的资源。
主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名
如果您刚刚设置了 DNS 并不知道如何添加新主机,请参阅 DNS 教程的 维护 DNS 记录部分。基本上,您需要添加一个A
和PTR
记录,并允许新主机执行重复性查询。
<$>[note]
注: 本教程假定你的娃娃主人的主机名是娃娃
。如果你使用不同的名字,你需要从本教程中做出一些偏差。具体来说,你必须在你的娃娃主机节点的配置文件中指定你的娃娃主机的主机名,你必须在签署任何代理证书之前再生你的娃娃主机的SSL证书。否则,你会收到这个错误:`错误:无法请求证书:从主机获取的证书不匹配代理的私钥。
配置此设置不是本教程所涵盖的。 <$>
安装 NTP
由于它作为代理节点的证书授权机构,所以Puppet主服务器必须保持准确的系统时间,以避免在发行代理证书时出现潜在问题 - 如果存在时间差异,证书可能会过期。
首先,用这个命令查看可用的时区:
1timedatectl list-timezones
當您找到適合您的伺服器的區域/時區設定時,請使用此命令設定它(取代您偏好的區域和時區):
1sudo timedatectl set-timezone America/New_York
使用此命令通过 yum 安装 NTP:
1sudo yum -y install ntp
使用ntpdate
命令进行一次性时间同步:
1sudo ntpdate pool.ntp.org
常见的做法是更新 NTP 配置以使用地理上更接近您的 NTP 服务器的池区
。在 Web 浏览器中,请访问 NTP 池项目并搜索一个地理上接近您正在使用的数据中心的 _pool zone。
打开ntp.conf
来编辑:
1sudo vi /etc/ntp.conf
将 NTP Pool Project 页面的时间服务器添加到文件的顶部(用您选择的服务器替换):
1[label /etc/ntp.conf excerpt]
2server 0.us.pool.ntp.org
3server 1.us.pool.ntp.org
4server 2.us.pool.ntp.org
5server 3.us.pool.ntp.org
保存和退出。
启动 NTP 以添加新的时间服务器:
1sudo systemctl restart ntpd
最后,启用 NTP Daemon:
1sudo systemctl enable ntpd
现在我们的服务器正在保持准确的时间,让我们安装 Puppet Server 软件。
安装 Puppet 服务器
Puppet Server 是运行在 Puppet 主服务器上的软件,它是将配置推向其他服务器的组件,该组件将运行 Puppet 代理软件。
使用此命令启用官方 Puppet Labs 收藏库:
1sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
安装Puppetserver
包:
1sudo yum -y install puppetserver
Puppet Server 现在已安装在您的主服务器上,但尚未运行。
配置内存分配(可选)
默认情况下,Puppet Server 配置为使用 2 GB 的 RAM. 您应该根据主服务器有多少免费内存,以及它将管理多少代理节点来定制此设置。
首先,在你最喜欢的文本编辑器中打开/etc/sysconfig/puppetserver
。
1sudo vi /etc/sysconfig/puppetserver
然后找到JAVA_ARGS
行,然后使用-Xms
和-Xmx
参数来设置内存分配。
1[label Memory Allocation]
2JAVA_ARGS="-Xms3g -Xmx3g"
保存和退出,当你完成。
启动人偶服务器
现在我们已经准备好用这个命令启动 Puppet Server:
1sudo systemctl start puppetserver
接下来,启用 Puppet Server,以便在主服务器启动时启动:
1sudo systemctl enable puppetserver
Puppet Server 正在运行,但它尚未管理任何代理节点. 让我们学习如何安装和添加 Puppet 代理!
安裝娃娃代理
在大多数情况下,这将包括你的基础设施中的每个服务器,正如介绍中提到的,Puppet Agent可以运行在所有主要的Linux发行版,一些UNIX平台和Windows上,因为安装在每个操作系统上略有不同,所以我们只会涵盖CentOS 7服务器上的安装。
** 在所有代理服务器上执行这些步骤。
使用此命令启用官方 Puppet Labs 收藏库:
1sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
安装Puppet-agent
包:
1sudo yum -y install puppet-agent
现在已经安装了 Puppet 代理,请使用此命令启动:
1sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
第一次运行 Puppet 代理时,它会生成 SSL 证书并向 Puppet 主人发送签名请求,然后 Puppet 主人签署代理人的证书后,它将能够与代理节点进行通信并控制。
请记住,重复此部分对您的所有娃娃代理节点。
<$>[注] 注: 如果这是你的第一个娃娃代理,建议您在添加其他代理之前,尝试在下一步覆盖的娃娃主机上签署证书。
标签 关于 Puppet Master 的证书
在 Puppet 首次在代理节点上运行时,它会向 Puppet 主人发送证书签名请求. 在 Puppet 服务器能够与代理节点进行通信和控制之前,它必须签署该特定的代理节点的证书。
目前申请证书列表
在娃娃大师
中,运行以下命令列出所有未签名的证书请求:
1sudo /opt/puppetlabs/bin/puppet cert list
如果您刚刚设置了第一个代理节点,您将看到一个请求,它将看起来像以下某些东西,与代理节点的主机名称:
1[secondary_label Output:]
2 "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
的证书,您将使用以下命令:
1sudo /opt/puppetlabs/bin/puppet cert sign host1.nyc3.example.com
您将看到以下输出,表明证书请求已被签署:
1[secondary_label Output:]
2Notice: Signed certificate request for host1.nyc3.example.com
3Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc3.example.com at '/etc/puppetlabs/puppet/ssl/ca/requests/host1.nyc3.example.com.pem'
Puppet 主人现在可以通信和控制签名的证书所属的节点。
如果您想要签署所有当前请求,请使用--全部
选项,如下:
1sudo /opt/puppetlabs/bin/puppet cert sign --all
撤销证书
您可能想从 Puppet 删除主机,或者重建主机,然后将其重新添加到 Puppet. 在这种情况下,您将想要从 Puppet 主机中撤销主机的证书。
1sudo /opt/puppetlabs/bin/puppet cert clean hostname
指定的主机的相关证书将从 Puppet 中删除。
查看所有签名的申请
如果要查看所有请求,签名和未签名,请运行以下命令:
1sudo /opt/puppetlabs/bin/puppet cert list --all
您将看到所有请求的列表. 签名的请求先有+
,未签名的请求没有+
。
1[secondary_label Output:]
2+ "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")
3+ "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
4+ "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
5+ "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 通过一个名为 facter 的工具收集了关于每个节点的事实,事实上,默认情况下,它收集了对系统配置有用的信息(例如操作系统名称,主机名称,IP 地址,SSH 密钥等)。
例如,你可以创建一个Web服务器配置模板,并自动填写特定虚拟主机的适当IP地址,或者你可以确定你的服务器的分布是CentOS
,所以你应该运行apache2
服务而不是httpd
。
若要查看在您的代理节点上自动收集的事实列表,请运行以下命令:
1/opt/puppetlabs/bin/facter
主要宣言文件
Puppet 使用特定域的语言来描述系统配置,这些描述被保存到名为manifests
的文件中,这些文件具有.pp 文件扩展. 默认的主要manifest 文件位于您的 Puppet 主服务器上,位于 /etc/puppetlabs/code/environments/production/manifests/site.pp
。
1sudo touch /etc/puppetlabs/code/environments/production/manifests/site.pp
请注意,主要宣言现在是空的,因此Puppet不会对代理节点进行任何配置。
主要宣言是如何执行的
娃娃代理人会定期与娃娃服务器进行检查(通常每30分钟进行一次)。当它检查时,它会向主人发送有关自己的事实,并引导当前目录 - 一个对代理人相关的资源和他们想要的状态的编译列表,由主要表现确定。
在特定的代理节点上立即执行
还可以手动启动特定代理节点的检查,通过运行以下命令(在有关代理节点上):
1/opt/puppetlabs/bin/puppet agent --test
运行此操作将将主要表现应用于运行测试的代理,您可能会看到如下的输出:
1[secondary_label Output:]
2Info: Using configured environment 'production'
3Info: Retrieving pluginfacts
4Info: Retrieving plugin
5...
6Info: Loading facts
7Info: Caching catalog for host1
8Info: Applying configuration version '1457389302'
9Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: defined content as '{md5}dd769ec60ea7d4f7146036670c6ac99f'
10Notice: Applied catalog in 0.04 seconds
此命令有助于查看主宣言如何立即影响单个服务器。
一次性宣言
娃娃应用
命令允许您按要求执行与主宣言无关的宣言,它只将宣言应用于您运行 apply 的节点。
1sudo /opt/puppetlabs/bin/puppet apply /path/to/your/manifest/init.pp
如果您想在一个代理节点上测试一个新的宣言,或者如果您只想一次运行一个宣言(例如,将一个代理节点初始化为所需状态),则此方法非常有用。
示例宣言
正如你可能记得的那样,娃娃大师的主要表现文件位于 /etc/puppetlabs/code/environments/production/manifests/site.pp
。
在 Puppet 主服务器上,现在编辑它:
1sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
现在,添加以下行来描述一个文件资源:
1[label site.pp example]
2file {'/tmp/example-ip': # resource type file and filename
3 ensure => present, # make sure it exists
4 mode => '0644', # file permissions
5 content => "Here is my Public IP Address: ${ipaddress_eth0}.\n", # note the ipaddress_eth0 fact
6}
现在保存和退出. 内线评论应该解释我们正在定义的资源. 在简单的英语中,这将确保所有代理节点都具有在 /tmp/example-ip
上的文件,具有 -rw-r--r--
权限,其中包含节点的公共 IP 地址的内容。
您可以等到代理人自动检查主人,或者您可以运行玩偶代理 - 测试
命令(从您的代理节点之一)。
1cat /tmp/example-ip
您应该看到输出显示如下(该节点的IP地址):
1[secondary_label Output:]
2Here is my Public IP Address: 128.131.192.11.
定义一个节点
如果要为特定节点定义资源,请在宣言中定义一个节点
。
在主机上,编辑site.pp
:
1sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
现在添加以下几行:
1[label site.pp example]
2node 'ns1', 'ns2' { # applies to ns1 and ns2 nodes
3 file {'/tmp/dns': # resource type file and filename
4 ensure => present, # make sure it exists
5 mode => '0644',
6 content => "Only DNS servers get this file.\n",
7 }
8}
9
10node default {} # applies to nodes that aren't explicitly defined
保存和退出。
现在 Puppet 将确保在 ns1 和 ns2 上存在一个 /tmp/dns' 文件. 如果您不想等待计划的 Puppet 代理拖动,您可能需要运行
puppet agent --test` 命令(从 ns1 或 ns2)。
请注意,如果您不定义资源,Puppet 将尽最大努力不要触摸它,因此,如果您从示例中删除这些资源,Puppet 将不会删除它创建的文件。
这些例子没有做任何有用的事情,但它们确实证明娃娃的工作是正确的。
使用一个模块
现在让我们使用一个模块. 模块有助于将任务组合在一起. Puppet 社区中有很多模块,你甚至可以写自己的。
在 Puppet 主机上,从 forgeapi 安装puppetlabs-apache
模块:
1sudo /opt/puppetlabs/bin/puppet module install puppetlabs-apache
<$>[warning] ** Warning** : 不要在现有 Apache 设置中使用此模块. 它将清除未由 Puppet 管理的任何 Apache 配置。
现在编辑site.pp
:
1sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
现在添加以下行以在 host2 上安装 Apache:
1[label site.pp example]
2node '<$>host2<$>' {
3 class { 'apache': } # use apache module
4 apache::vhost { 'example.com': # define vhost resource
5 port => '80',
6 docroot => '/var/www/html'
7 }
8}
9
10# node default {} # uncomment this line if it doesn't already exist in your manifest
现在下次 Puppet 更新 host2 时,它将安装 Apache 包,并配置一个名为example.com
的虚拟主机,在端口 80 上聆听,并具有文档根 /var/www/html
。
在 host2 上,运行以下命令:
1sudo /opt/puppetlabs/bin/puppet agent --test
您应该看到一堆输出,表明Apache正在安装。一旦完成,请在网页浏览器中打开host2的公共IP地址。
!你已经使用了你的第一个娃娃模块!
结论
现在你有一个基本的代理 / 主人 Puppet 安装,你现在已经准备好了解如何使用 Puppet 来管理你的服务器基础设施. 查看以下教程: Getting Started With Puppet Code: Manifests and Modules。