Note:本教程的较新版本使用 Puppet Server 而不是 Puppet with Passenger,可以在此处找到:如何在 Ubuntu 14.04 上的主代理设置中安装 Puppet 4.
Puppet 来自 Puppet Labs,是一款配置管理工具,可帮助系统管理员自动配置、配置和管理服务器基础设施。提前规划并使用 Puppet 等配置管理工具可以减少重复基本任务所花费的时间,并有助于确保您的配置在整个基础设施中保持一致和准确。一旦掌握了使用 Puppet 和其他自动化工具管理服务器的窍门,您就可以腾出时间来改进整体设置的其他方面。
Puppet 有两种类型:Puppet Enterprise 和开源 Puppet。它可以在大多数 Linux 发行版、各种 UNIX 平台和 Windows 上运行。
在本教程中,我们将介绍如何在 Agent/Master 设置中安装开源 Puppet。该设置包括一个中央木偶大师服务器,您的所有配置数据都将从这里进行管理和分发,并且所有剩余的服务器将傀儡特工节点,可以由 puppet master 服务器配置。
要学习本教程,您必须拥有要配置 Puppet 的所有服务器的 root 访问权限。您还需要创建一个新的 Ubuntu 14.04 VPS 来充当 Puppet 主服务器。如果您没有现有基础设施,请随时按照必备 DNS 设置教程重新创建示例基础设施(如下所述)。
在我们开始安装 Puppet 之前,请确保您满足以下先决条件:
-
私网DNS:必须配置正向和反向 DNS,并且每个服务器必须有唯一的主机名。这是一个教程配置自己的私网DNS服务器。如果您没有配置 DNS,则必须使用您的
hosts
用于名称解析的文件。我们假设您将使用您的专用网络在基础设施内进行通信。
-
防火墙开放端口:Puppet master 必须可通过端口 8140 访问。如果您的防火墙限制过多,请查看此UFW 教程有关如何允许端口 8140 上的传入请求的说明。
我们将使用以下基础设施来演示如何设置 Puppet:
Hostname |
Role |
Private FQDN |
host1 |
Generic Ubuntu 14.04 VPS |
host1.nyc2.example.com |
host2 |
Generic Ubuntu 14.04 VPS |
host2.nyc2.example.com |
ns1 |
Primary nameserver |
ns1.nyc2.example.com |
ns2 |
Secondary nameserver |
ns2.nyc2.example.com |
puppet 代理将安装在所有这些主机上。这些主机将由其专用网络接口引用,这些接口映射到 DNS 中的“.nyc2.example.com”子域。这与先决条件教程中描述的基础设施相同:如何在 Ubuntu 14.04 上将 BIND 配置为专用网络 DNS 服务器.
满足所有先决条件后,让我们继续创建 Puppet 主服务器!
创建一个新的乌班图14.04x64 VPS,使用“puppet”作为其主机名。使用以下详细信息将其专用网络添加到您的 DNS:
Hostname |
Role |
Private FQDN |
puppet |
Puppet Master |
puppet.nyc2.example.com |
如果您刚刚设置 DNS 并且不确定如何将主机添加到 DNS,请参阅维护 DNS 记录DNS 教程的部分。本质上,您需要添加“A”和“PTR”记录,并允许新主机执行递归查询。另外,请确保配置搜索域,以便服务器可以使用短主机名相互查找。
使用“puppet”作为 Puppet master 的主机名可以稍微简化代理设置,因为它是代理在尝试连接到 master 时将使用的默认名称。
现在我们需要设置 NTP。
由于它充当代理节点的证书颁发机构,puppet master 服务器必须维护准确的系统时间,以避免在颁发代理证书时出现潜在问题 - 如果存在时间差异,证书可能会显示为已过期。为此,我们将使用网络时间协议 (NTP)。
首先,使用以下命令进行一次性时间同步ntpdate
命令:
sudo ntpdate pool.ntp.org
您的系统时间将会更新,但您需要安装 NTP 守护程序来自动更新时间,以最大限度地减少时间漂移。使用以下 apt 命令安装它:
sudo apt-get update && sudo apt-get -y install ntp
通常的做法是更新 NTP 配置以使用地理位置更靠近 NTP 服务器的“池区域”。在网络浏览器中,转至NTP池项目并查找泳池区该数据中心在地理位置上靠近您正在使用的数据中心。我们将选择美国池(http://www.pool.ntp.org/zone/us)在我们的示例中,因为服务器位于纽约数据中心。
Open ntp.conf
用于编辑:
sudo vi /etc/ntp.conf
将 NTP 池项目页面中的时间服务器添加到文件顶部:
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 以添加新的时间服务器。
sudo service ntp restart
现在我们的服务器保持了准确的时间,让我们安装 Puppet master 软件。
有多种方法可以安装开源 Puppet。我们将使用名为的 debian 软件包傀儡师乘客,由 Puppet Labs 提供。这傀儡师乘客软件包包括 Puppet master 和生产就绪的 Web 服务器(带有 Apache 的 Passenger),与使用基本的相比,它消除了一些配置步骤木偶大师包裹。
下载 Puppet 实验室包:
cd ~; wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
安装包:
sudo dpkg -i puppetlabs-release-trusty.deb
更新 apt 的可用软件包列表:
sudo apt-get update
安装puppetmaster-passenger
包裹:
sudo apt-get install puppetmaster-passenger
Puppet master、Passenger、Apache 和其他必需的软件包现已安装。因为我们将 Passenger 与 Apache 一起使用,所以 Puppet master 进程由 Apache 控制,即它在 Apache 运行时运行。
在继续之前,通过停止apache2
服务:
sudo service apache2 stop
接下来,我们要锁定 Puppet 的版本。
版本之间的更改有时会导致您的 Puppet 环境停止正常工作。因此,您需要在整个基础设施中保持一致的 Puppet 版本。如果您决定升级到较新版本,请确保升级您的master在任何代理节点之前,因为主节点无法管理具有更高版本号的代理。
让我们使用以下命令查找 Puppet 安装的版本:
puppet help | tail -n 1
在撰写本文时,上一个命令的输出是Puppet v3.6.2
。我们可以使用 apt 的 pin 功能将 Puppet 安装锁定到3.6.*
,这将阻止 apt 将 Puppet 升级到更高的主要版本。在 apt 首选项目录中创建一个名为的新文件:
sudo vi /etc/apt/preferences.d/00-puppet.pref
添加以下行来锁定puppet
, puppet-common
, and puppetmaster-passenger
包裹到3.6.*
(更改此设置以匹配您安装的版本):
# /etc/apt/preferences.d/00-puppet.pref
Package: puppet puppet-common puppetmaster-passenger
Pin: version 3.6*
Pin-Priority: 501
保存并退出。您的 Puppet 版本现已锁定。
下一步是设置您的 Puppet master 名称和证书。
Puppet 使用 SSL 证书来验证主节点和代理节点之间的通信。 Puppet Master 充当证书颁发机构 (CA),并且必须生成自己的证书,用于签署代理证书请求。我们现在将设置硕士证书。
删除在软件包安装期间创建的任何现有 SSL 证书。 Puppet 的 SSL 证书的默认位置是/var/lib/puppet/ssl
:
sudo rm -rf /var/lib/puppet/ssl
创建 puppet master 的证书时,请包含代理节点可以联系 master 的每个 DNS 名称。在我们的示例中,我们将使用“puppet”和“puppet.nyc2.example.com”,分别是短主机名和 FQDN。
编辑master的puppet.conf文件:
sudo vi /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
删除带有templatedir
选项,因为该选项已被弃用。
将以下两行添加到末尾[main]
部分(将突出显示的文本替换为私有 FQDN):
certname = puppet
dns_alt_names = puppet,puppet.nyc2.example.com
使用分配很重要certname
为“puppet”,因为 Apache/Passenger 配置期望证书被命名为“puppet”。如果您决定想要不同的certname
设置,请务必编辑 Apache 配置文件(/etc/apache2/sites-available/puppetmaster.conf
) 更改 SSL 证书路径的名称。
保存并退出。
现在通过运行以下命令创建新的 CA 证书:
sudo puppet master --verbose --no-daemonize
您将看到几行输出,表明正在创建 SSL 密钥和证书。一旦你看到Notice: Starting Puppet master version 3.6.2
,证书设置完成。按CTRL-C
返回到外壳。
示例输出:
Info: Creating a new SSL key for ca
Info: Creating a new SSL certificate request for ca
Info: Certificate Request fingerprint (SHA256): EC:7D:ED:15:DE:E3:F1:49:1A:1B:9C:D8:04:F5:46:EF:B4:33:91:91:B6:5D:19:AC:21:D6:40:46:4A:50:5A:29
Notice: Signed certificate request for ca
...
Notice: Signed certificate request for puppet
Notice: Removing file Puppet::SSL::CertificateRequest puppet at '/var/lib/puppet/ssl/ca/requests/puppet.pem'
Notice: Removing file Puppet::SSL::CertificateRequest puppet at '/var/lib/puppet/ssl/certificate_requests/puppet.pem'
Notice: Starting Puppet master version 3.6.2
如果您想查看刚刚创建的证书的证书信息,请输入以下内容:
sudo puppet cert list -all
上一个命令实际上列出了所有已签名的证书和未签名的证书请求。目前,仅显示主证书,因为尚未添加其他证书:
+ "puppet" (SHA256) 05:22:F7:65:64:CF:46:0E:09:2C:5D:FD:8C:AC:9B:31:17:2B:7B:05:93:D5:D1:01:52:72:E6:DF:84:A0:07:37 (alt names: "DNS:puppet", "DNS:puppet.nyc2.example.com")
我们的 Puppet master 服务即将启动。我们先看一下master的配置。
主要的傀儡配置文件,puppet.conf
,由三部分组成:[main]
, [master]
, and [agent]
。正如您可能已经猜到的,“main”部分包含全局配置,“master”部分特定于puppet master,“agent”用于配置puppet代理。除了我们之前所做的更改之外,默认设置对于基本设置来说也可以正常工作。
配置文件有许多可能与您自己的设置相关的选项。 Puppet Labs 提供了该文件的完整描述:主配置文件(puppet.conf).
如果您想编辑它,请运行以下命令:
sudo vi /etc/puppet/puppet.conf
让我们看一下主要的清单文件。
Puppet 使用特定于域的语言来描述系统配置,这些描述被保存到称为“清单”的文件中,该文件具有.pp
文件扩展名。默认的主清单文件位于/etc/puppet/manifests/site.pp
。稍后我们将介绍一些基本清单,但现在我们将创建一个占位符文件:
sudo touch /etc/puppet/manifests/site.pp
我们现在准备启动 Puppet master。通过运行以下命令启动它apache2
服务:
sudo service apache2 start
您的 Puppet Master 正在运行,但尚未管理任何代理节点。让我们学习如何安装和添加 Puppet 代理!
Puppet 代理必须安装在 Puppet Master 将管理的任何服务器上。在大多数情况下,这包括基础设施中的每台服务器。正如简介中提到的,Puppet 代理可以在所有主要 Linux 发行版、一些 UNIX 平台和 Windows 上运行。由于每个操作系统的安装略有不同,因此我们仅介绍 Ubuntu 和 Debian 服务器上的安装。
在其他平台上安装 Puppet 的说明位于Puppet 实验室文档– 请务必按照您选择的操作系统的“在代理节点上安装 Puppet”部分进行操作。
Note:假设您的所有 Puppet 节点(包括代理节点)都配置为使用您的 DNS。如果您要创建全新的服务器,请确保将其添加到您的 DNS在安装 Puppet 代理之前。
Note:我们所有的示例代理节点,host1, host2, ns1, and ns2,是 Ubuntu 14.04 VPS。我们将为每台服务器重复此步骤,以便每台服务器都可以由 Puppet Master 管理。
在您的 Puppet 代理节点上,下载 Puppet Labs 包:
cd ~; wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
安装包:
sudo dpkg -i puppetlabs-release-trusty.deb
更新 apt 的可用软件包列表:
sudo apt-get update
安装 Puppet 代理包(puppet
):
sudo apt-get install puppet
默认情况下,傀儡代理处于禁用状态。要更改此设置,请更新其默认文件:
sudo vi /etc/default/puppet
并改变值START
到“是”:
START=yes
保存并退出/etc/default/puppet
.
与 Puppet master 一样,我们需要使用 apt pin 功能来锁定 Puppet 代理的版本:
sudo vi /etc/apt/preferences.d/00-puppet.pref
添加以下行来锁定puppet
and puppet-common
包裹到3.6.*
(更改此设置以匹配您安装的版本):
# /etc/apt/preferences.d/00-puppet.pref
Package: puppet puppet-common
Pin: version 3.6*
Pin-Priority: 501
保存并退出。您的 Puppet 版本现已锁定。
在运行代理之前,我们必须进行一些配置更改。
编辑代理puppet.conf
:
sudo vi /etc/puppet/puppet.conf
它看起来与 Puppet master 的初始配置文件一模一样。
再次删除templatedir
线。然后删除[master]
部分及其下面的所有行。
假设可以通过“puppet”访问 Puppet master,则代理应该能够连接到 master。如果主控在“puppet”上不可用,您将需要添加 Puppet 主控的 FQDN。我们建议无论如何进行配置(用您自己的 FQDN 替换):
[agent]
server = puppet.nyc2.example.com
保存并退出。
Puppet 代理已准备好运行。通过运行以下命令来执行此操作:
sudo service puppet start
如果一切配置正确,您不应该看到任何输出。第一次运行 Puppet 代理时,它会生成 SSL 证书并向 Puppet Master 发送签名请求。 Puppet Master 签署 Agent 的证书后,就可以与 Agent 节点进行通信。
Note:如果这是您的第一个 Puppet 代理,建议您在添加其他代理之前尝试在 Puppet Master 上签署证书。一旦验证一切正常,您就可以放心地返回并添加剩余的代理节点。
Puppet 第一次在代理节点上运行时,它将向 Puppet Master 发送证书签名请求。在主节点能够通信和控制代理节点之前,它必须签署该特定代理节点的证书。我们将描述如何签名和检查签名请求。
在 Puppet Master 上,运行以下命令列出所有未签名的证书请求:
sudo puppet cert list
如果您刚刚设置了第一个代理节点,您将看到一个请求。它将类似于以下内容,其中代理节点的 FQDN 作为主机名:
"host1.nyc2.example.com" (SHA256) B1:96:ED:1F:F7:1E:40:53:C1:D4:1B:3C:75:F4:7C:0B:A9:4C:1B:5D:95:2B:79:C0:08:DD:2B:F4:4A:36:EE:E3
请注意,没有+
在它的前面。这表明该协议尚未签署。
要签署证书请求,请使用puppet cert sign
命令,以及要签名的证书的主机名。例如,要签名host1.nyc2.example.com
,您将使用以下命令:
sudo puppet cert sign host1.nyc2.example.com
您将看到以下输出,这表明证书请求已签名:
Notice: Signed certificate request for host1.nyc2.example.com
Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc2.example.com at '/var/lib/puppet/ssl/ca/requests/host1.nyc2.example.com.pem'
Puppet Master 现在可以通信并控制签名证书所属的节点。
如果您想签署所有当前请求,请使用-all
选项,像这样:
sudo puppet cert sign --all
您可能想要从 Puppet 中删除主机,或者重建主机然后将其添加回 Puppet。在这种情况下,您需要从 Puppet Master 撤销主机的证书。为此,您需要使用clean
action:
sudo puppet cert clean hostname
指定主机的关联证书将从 Puppet 中删除。
如果要查看所有请求(已签名和未签名),请运行以下命令:
sudo puppet cert list --all
您将看到所有请求的列表。签名的请求前面有一个+
并且未签名的请求没有+
.
"ns2.nyc2.example.com" (SHA256) E4:F5:26:EB:B1:99:1F:9D:6C:B5:4B:BF:86:14:40:23:E0:50:3F:C1:45:D0:B5:F0:68:6E:B2:0F:41:C7:BA:76
+ "host1.nyc2.example.com" (SHA256) 71:A2:D3:82:15:0D:80:20:D4:7E:E3:42:C2:35:87:83:79:2B:57:1D:D5:5A:EC:F6:8B:EE:51:69:53:EB:6B:A1
+ "host2.nyc2.example.com" (SHA256) F4:79:A6:7C:27:0C:EA:8E:BC:31:66:FF:F2:01:AB:B1:35:7B:9F:5E:C8:C9:CE:82:EE:E8:2F:23:9F:0C:2B:ED
+ "puppet" (SHA256) 05:22:F7:65:64:CF:46:0E:09:2C:5D:FD:8C:AC:9B:31:17:2B:7B:05:93:D5:D1:01:52:72:E6:DF:84:A0:07:37 (alt names: "DNS:puppet", "DNS:puppet.nyc2.example.com")
恭喜!您的基础设施现在已准备好由 Puppet 管理!
现在您的基础设施已设置为使用 Puppet 进行管理,我们将向您展示如何执行一些基本任务来帮助您入门。
Puppet 使用名为的工具收集有关其每个节点的事实facter。默认情况下,Facter 收集对系统配置有用的信息(例如操作系统名称、主机名、IP 地址、SSH 密钥等)。如果您需要其他事实来执行配置,可以添加自定义事实。
收集到的事实在许多情况下都很有用。例如,您可以创建 Web 服务器配置模板并自动为特定虚拟主机填写适当的 IP 地址。或者您可以确定您的服务器操作系统是“Ubuntu”,因此您应该运行apache2
服务而不是httpd
。这些是基本示例,但它们应该让您了解如何使用事实。
要查看代理节点上自动收集的事实列表,请运行以下命令:
facter
Puppet 代理会定期与 Puppet Master 进行检查(通常每 30 分钟一次)。在此期间,它将向主节点发送有关自身的事实,并提取当前目录——由主清单确定的与代理相关的资源及其所需状态的编译列表。然后,代理节点将尝试进行适当的更改以实现其所需的状态。只要 Puppet Master 正在运行并与代理节点通信,这个循环就会持续下去。
还可以通过运行以下命令(在相关代理节点上)手动启动对特定代理节点的检查:
puppet agent --test
运行此命令会将主清单应用于运行测试的代理。您可能会看到如下输出:
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb
Info: Caching catalog for host1.nyc2.example.com
Info: Applying configuration version '1407966707'
此命令对于查看主清单将如何立即影响单个服务器很有用。
The puppet apply
命令允许您根据需要执行与主清单无关的清单。它仅将清单应用到您运行应用的节点。这是一个例子:
sudo puppet apply /etc/puppet/modules/test/init.pp
如果您想在代理节点上测试新清单,或者只想运行一次清单(例如,将代理节点初始化为所需状态),以这种方式运行清单非常有用。
您可能还记得,Puppet master 上的主要清单文件位于/etc/puppet/manifests/site.pp
.
On the master,立即编辑:
sudo vi /etc/puppet/manifests/site.pp
现在添加以下行来描述文件资源:
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
}
现在保存并退出。内联注释应该解释我们正在定义的资源。用简单的英语来说,这将使ensure所有代理节点都会有一个文件/tmp/example-ip
, with -rw-r--r--
权限以及包含节点公共 IP 地址的文本。
您可以等待代理自动与主服务器签入,也可以运行puppet agent --test
命令(来自您的代理节点之一)。然后运行以下命令来打印该文件:
cat /tmp/example-ip
您应该看到如下所示的输出(带有该节点的 IP 地址):
Here is my Public IP Address: 128.131.192.11.
如果要为特定节点定义资源,请定义node
在清单中。
在master上,编辑site.pp
:
sudo vi /etc/puppet/manifests/site.pp
现在添加以下行:
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 将确保文件位于/tmp/dns
将存在于ns1 and ns2。您可能想运行puppet agent --test
命令(来自 ns1 或 ns2),如果您不想等待计划的 Puppet 代理拉取。
请注意,如果您没有定义资源,Puppet 将尽力不接触它。因此,如果您从清单中删除了这些资源,Puppet 将不会删除它创建的文件。如果您想让它删除文件,请更改ensure
to absent
.
这些示例没有做任何有用的事情,但它们确实证明了 Puppet 工作正常。
现在让我们使用一个模块。模块对于将任务分组在一起非常有用。 Puppet 社区中有许多可用的模块,您甚至可以编写自己的模块。
在 Puppet Master 上安装puppetlabs-apache
来自 forgeapi 的模块:
sudo puppet module install puppetlabs-apache
Warning:请勿在现有 Apache 设置上使用此模块。它将清除任何不受 Puppet 管理的 Apache 配置。
现在编辑site.pp
:
sudo vi /etc/puppet/manifest/site.pp
现在添加以下行来安装 Apachehost2:
node 'host2' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}
保存并退出。现在,下次 Puppet 更新 host2 时,它将安装 Apache 软件包,并配置一个名为“example.com”,监听端口 80,并带有文档根目录/var/www/html
.
On host2,运行以下命令:
sudo puppet agent --test
您应该看到一堆输出,表明正在安装 Apache。完成后,转到host2的公共IP地址。您应该会看到默认的 Apache 欢迎页面。
恭喜!您已经使用了第一个 Puppet 模块!
现在您已经完成了基本的代理/主 Puppet 安装,您现在可以了解有关如何使用 Puppet 管理服务器基础设施的更多信息。查看以下教程:Puppet 代码入门:清单和模块.