如何安装 Puppet 管理服务器基础设施

<$>[注] 注: 本教程的更新的版本,它使用Puppet Server而不是Puppet with Passenger,可以在这里找到: 如何在Ubuntu 14.04上的Master-Agent设置中安装Puppet 4

介绍

Puppet,来自Puppet Labs,是一个配置管理工具,可以帮助系统管理员自动配置,配置和管理服务器基础设施。提前规划和使用Puppet等配置管理工具可以减少重复基本任务的时间,并帮助确保您的配置在整个基础设施中一致和准确。

Puppet 有两种类型, Puppet Enterprise 和开源 Puppet. 它在大多数 Linux 发行版、各种 UNIX 平台和 Windows 上运行。

在本教程中,我们将涵盖如何在 Agent/Master 设置中安装开源 Puppet. 此设置由一个中心的 Puppet Master 服务器组成,您所有的配置数据将由此管理和分发,您的所有剩余服务器将是 Puppet Agent 节点,这些节点可以由 Puppet 主服务器配置。

前提条件

要遵循本教程,您必须对您想要配置 Puppet 的所有服务器进行 root 访问. 您还将被要求创建一个新的 Ubuntu 14.04 VPS 以作为 Puppet 主服务器。

在我们开始安装 Puppet 之前,请确保您具备以下先决条件:

  • 私人网络DNS: 前向和反向DNS必须配置,每个服务器都必须有一个独特的主机名称. 这里有一个教程 配置自己的私人网络DNS服务器 如果您没有配置DNS,您必须使用您的主机文件来解决名称。 我们将假设您将使用您的私人网络在您的基础设施内进行通信。
  • 防火墙开放端口: 娃娃大师必须在端口8140上可访问。

基础设施的例子

我们将使用以下基础设施来展示如何设置Puppet:

主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机名: 主机

这些主机将被他们的私人网络接口所引用,这些接口被地图到DNS中的 ".nyc2.example.com子域。这是前提教程中描述的相同的基础设施: 如何在Ubuntu 14.04上配置BIND作为私人网络DNS服务器

一旦你有所有前提条件,让我们继续创建Puppet主服务器!

创建 Puppet Master 服务器

创建一个新的 Ubuntu 14.04 x64 VPS,使用娃娃作为其主机名称. 将其私人网络添加到您的DNS,并提供以下细节:

主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名 主机名

如果您刚刚设置了 DNS 并不知道如何将您的主机添加到 DNS,请参阅 DNS 教程的 维护 DNS 记录部分。基本上,您需要添加一个APTR记录,并允许新主机执行重复性查询。

使用娃娃作为娃娃大师的主机名略有简化了代理设置,因为这是代理在尝试连接到大师时使用的默认名称。

现在我们需要建立NTP。

安装 NTP

由于它作为代理节点的证书授权机构,所以人形主服务器必须保持准确的系统时间,以避免在发行代理证书时出现潜在问题 - 如果存在时间差异,证书可能会过期。

首先,使用ntpdate命令进行一次性时间同步:

1sudo ntpdate pool.ntp.org

您的系统时间将被更新,但您需要安装 NTP 命令器来自动更新时间,以最大限度地减少时间漂移。

1sudo apt-get update && sudo apt-get -y install ntp

常见的做法是更新 NTP 配置以使用地理上更接近您的 NTP 服务器的池区。在 Web 浏览器中,前往 NTP 池项目并搜索一个 pool zone 地理上接近您正在使用的数据中心。

打开ntp.conf来编辑:

1sudo vi /etc/ntp.conf

将 NTP Pool Project 页面的时间服务器添加到文件的顶部:

1server 0.us.pool.ntp.org
2server 1.us.pool.ntp.org
3server 2.us.pool.ntp.org
4server 3.us.pool.ntp.org

保存和退出:重新启动 NTP 以添加新的时间服务器。

1sudo service ntp restart

现在我们的服务器正在保持准确的时间,让我们安装Puppet主软件。

安装人偶大师

我们将使用名为 puppetmaster-passenger 的 debian 包,由 Puppet Labs 提供。 puppetmaster-passenger 包包括 Puppet master 以及生产准备的 Web 服务器 (Passenger with Apache),这与使用基本 puppetmaster 包相比,消除了几个配置步骤。

下载 Puppet Labs 包:

1cd ~; wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb

安装包:

1sudo dpkg -i puppetlabs-release-trusty.deb

更新 apt 的可用包列表:

1sudo apt-get update

安装puppetmaster-passenger包:

1sudo apt-get install puppetmaster-passenger

现在已经安装了 Puppet master、Passenger、Apache 和其他必要的软件包,因为我们正在使用 Passenger 与 Apache 一起使用,因此 Puppet master 过程由 Apache 控制,即在 Apache 运行时运行。

在继续之前,通过停止apache2服务来阻止Puppet master:

1sudo service apache2 stop

接下来,我们要锁定娃娃的版本。

锁定版本

从版本到版本的更改有时会导致您的 Puppet 环境停止正常工作. 因此,您将希望在整个基础设施中保持一致的 Puppet 版本。 如果您决定升级到更新的版本,请确保在任何代理节点之前升级您的 master,因为主机无法管理具有更高的版本号的代理。

让我们用以下命令来查看我们 Puppet 安装的版本:

1puppet help | tail -n 1

在写作时,上一个命令的输出是Puppet v3.6.2。我们可以使用 apt 的 PIN 功能将我们的 Puppet 安装锁定为3.6.*,这将防止 apt 升级 Puppet 到更高的主要版本。

1sudo vi /etc/apt/preferences.d/00-puppet.pref

将下列行添加到3.6.*中,以锁定娃娃娃娃常用娃娃主机乘客的包(以匹配您安装的版本而更改):

1# /etc/apt/preferences.d/00-puppet.pref
2Package: puppet puppet-common puppetmaster-passenger
3Pin: version 3.6*
4Pin-Priority: 501

保存和退出. 您的娃娃版本已锁定。

下一步是设置您的 Puppet 主人名字和证书。

设置名称和证书

Puppet 使用 SSL 证书来验证主和代理节点之间的通信。 Puppet 主作为证书授权机构(CA)运作,必须生成自己的证书,用于签署代理证书请求。

删除现有证书

删除在包安装过程中创建的任何现有 SSL 证书. Puppet 的 SSL 证书的默认位置是 /var/lib/puppet/ssl:

1sudo rm -rf /var/lib/puppet/ssl

配置证书

在创建人偶大师证书时,包括每个代理节点可以与大师联系的 DNS 名称,在我们的例子中,我们将分别使用人偶puppet.nyc2.example.com,缩写主机名称和FQDN。

编辑 master 的 puppet.conf 文件:

1sudo vi /etc/puppet/puppet.conf

它将看起来如下:

 1[main]
 2logdir=/var/log/puppet
 3vardir=/var/lib/puppet
 4ssldir=/var/lib/puppet/ssl
 5rundir=/var/run/puppet
 6factpath=$vardir/lib/facter
 7templatedir=$confdir/templates
 8
 9[master]
10# These are needed when the puppetmaster is run by passenger
11# and can safely be removed if webrick is used.
12ssl_client_header = SSL_CLIENT_S_DN
13ssl_client_verify_header = SSL_CLIENT_VERIFY

使用templatedir选项删除行,因为该选项被删除。

将下列两行添加到[主要]部分的末尾(用私人FQDN代替突出的文本):

1certname = puppet
2dns_alt_names = puppet,puppet.nyc2.example.com

重要的是将certname指定为puppet,因为Apache/Passenger配置预计证书将被命名为puppet。如果您决定要使用不同的certname设置,请确保编辑Apache配置文件(`/etc/apache2/sites-available/puppetmaster.conf)以更改SSL证书路径的名称。

保存和退出。

创建新证书

现在通过运行以下命令创建新的 CA 证书:

1sudo puppet master --verbose --no-daemonize

您将看到多个输出行,表示正在创建 SSL 密钥和证书。一旦您看到通知:启动 Puppet master 版本 3.6.2,证书的设置已经完成。

样品产量:

1Info: Creating a new SSL key for ca
2Info: Creating a new SSL certificate request for ca
3Info: 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
4Notice: Signed certificate request for ca
5...
6Notice: Signed certificate request for puppet
7Notice: Removing file Puppet::SSL::CertificateRequest puppet at '/var/lib/puppet/ssl/ca/requests/puppet.pem'
8Notice: Removing file Puppet::SSL::CertificateRequest puppet at '/var/lib/puppet/ssl/certificate_requests/puppet.pem'
9Notice: Starting Puppet master version 3.6.2

如果您想要查看刚刚创建的证书的 cert 信息,请键入以下内容:

1sudo puppet cert list -all

以前的命令实际上列出了所有签名的证书和未签名的证书请求,目前只会显示主证书,因为尚未添加其他证书:

1+ "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.conf,由三个部分组成: [主], [主][代理人]. 正如您可能猜到的,部分包含全球配置,部分是特定于娃娃的主人,而代理人用于配置娃娃代理人。

配置文件有许多选项,可能与您自己的设置相关. 文件的完整描述可在 Puppet Labs 找到: Main Config File (puppet.conf)

如果你想编辑它,请运行这个命令:

1sudo vi /etc/puppet/puppet.conf

让我们来看看主要的宣言文件。

主要宣言文件

Puppet 使用一个域特定的语言来描述系统配置,这些描述被保存到名为manifests的文件中,这些文件具有.pp 文件扩展。默认的主要manifest 文件位于 `/etc/puppet/manifests/site.pp。

1sudo touch /etc/puppet/manifests/site.pp

开始人偶大师

我们现在已经准备好启动 Puppet master. 通过运行apache2服务来启动它:

1sudo service apache2 start

您的 Puppet 主持人正在运行,但它尚未管理任何代理节点. 让我们学习如何安装和添加 Puppet 代理!

安裝娃娃代理

在大多数情况下,这包括你的基础设施中的每个服务器,正如介绍中提到的,Puppet Agent可以在所有主要的Linux发行版,一些UNIX平台和Windows上运行,因为安装在每个操作系统上略有不同,所以我们只会涵盖Ubuntu和Debian服务器上的安装。

在其他平台上安装Puppet的说明位于Puppet Labs Docs(https://docs.puppetlabs.com/guides/install_puppet/pre_install.html#next-install-puppet) - 请确保遵循您所选择的操作系统的在代理节点上安装Puppet部分。

** 注意:** 假设您的所有 Puppet 节点,包括代理节点,都配置为使用您的 DNS. 如果您正在创建一个全新的服务器,请确保在安装 Puppet 代理之前将其添加到您的 DNS(https://andsky.com/tech/tutorials/how-to-configure-bind-as-a-private-network-dns-server-on-ubuntu-14-04#MaintainingDNSRecords)。

Ubuntu / Debian 代理节点

**注:我们所有的示例代理节点, host1, host2, _ns1_和 ns2,都是Ubuntu 14.04 VPS。

在您的 Puppet 代理节点上,下载 Puppet Labs 包:

1cd ~; wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb

安装包:

1sudo dpkg -i puppetlabs-release-trusty.deb

更新 apt 的可用包列表:

1sudo apt-get update

安装 Puppet 代理包(‘puppet’):

1sudo apt-get install puppet

默认情况下,娃娃代理被禁用. 若要更改此情况,请更新默认文件:

1sudo vi /etc/default/puppet

然后将开始的值更改为:

1START=yes

保存和退出/etc/default/puppet

锁定版本

与 Puppet 主人一样,我们将使用 apt pin 功能来锁定 Puppet 代理的版本:

1sudo vi /etc/apt/preferences.d/00-puppet.pref

将下列行添加到3.6.*中,以锁定小娃娃小娃娃常用包(更改以匹配您安装的版本):

1# /etc/apt/preferences.d/00-puppet.pref
2Package: puppet puppet-common
3Pin: version 3.6*
4Pin-Priority: 501

保存和退出. 您的娃娃版本已锁定。

配置代理

在运行代理之前,我们必须做一些配置更改。

编辑代理的puppet.conf:

1sudo vi /etc/puppet/puppet.conf

它将完全像 Puppet 主机的初始配置文件。

再次,删除templatedir行,然后删除[主]部分和其下方的所有行。

假设娃娃主人可在娃娃上访问,代理人应该能够连接到主人。如果主人不在娃娃上使用,则需要添加娃娃主人的FQDN。

1[agent]
2server = puppet.nyc2.example.com

保存和退出。

娃娃代理已经准备好运行,请执行以下命令:

1sudo service puppet start

如果一切都正确配置,你不应该看到任何输出。第一次运行Puppet代理,它会生成SSL证书并向Puppet主人发送签名请求。

** 注意** :如果这是您的第一个娃娃代理,建议您在添加其他代理之前尝试在娃娃主机上签署证书。

向大师签字请求

第一次 Puppet 运行在一个代理节点上,它会向 Puppet 主人发送证书签名请求. 在主人能够通信和控制代理节点之前,它必须签署该特定的代理节点的证书。

目前申请证书列表

娃娃大师中,运行以下命令列出所有未签名的证书请求:

1sudo puppet cert list

如果您刚刚设置了第一个代理节点,您将看到一个请求,它将看起来像下面的东西,代理节点的FQDN作为主机名称:

1"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,您将使用以下命令:

1sudo puppet cert sign host1.nyc2.example.com

您将看到以下输出,表明证书请求已被签署:

1Notice: Signed certificate request for host1.nyc2.example.com
2Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc2.example.com at '/var/lib/puppet/ssl/ca/requests/host1.nyc2.example.com.pem'

Puppet 主人现在可以通信和控制签名的证书所属的节点。

如果您想要签署所有当前请求,请使用 - 所有选项,如下:

1sudo puppet cert sign --all

撤销证书

您可能想从 Puppet 删除主机,或者重建主机,然后将其重新添加到 Puppet. 在这种情况下,您将想要从 Puppet 主机中撤销主机的证书。

1sudo puppet cert clean hostname

指定的主机的相关证书将从 Puppet 中删除。

查看所有签名的申请

如果要查看所有请求,签名和未签名,请运行以下命令:

1sudo puppet cert list --all

您将看到所有请求的列表. 签名的请求先有+,未签名的请求没有+

1"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
2+ "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
3+ "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
4+ "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 的工具收集了关于每个节点的事实,事实上,默认情况下,它收集了对系统配置有用的信息(例如操作系统名称,主机名称,IP 地址,SSH 密钥等)。

例如,你可以创建一个Web服务器配置模板并自动填写特定虚拟主机的适当IP地址,或者你可以确定你的服务器的操作系统是Ubuntu,所以你应该运行apache2服务而不是httpd

若要查看在您的代理节点上自动收集的事实列表,请运行以下命令:

1facter

主要宣言是如何执行的

娃娃代理人会定期与娃娃主人进行检查(通常每30分钟一次)。在此期间,它会向主人发送关于自己的事实,并引出当前的目录 - 一个汇编的资源列表及其与代理人相关的期望状态,由主要表现确定。

在特定的代理节点上立即执行

还可以手动启动特定代理节点的检查,通过运行以下命令(在有关代理节点上):

1puppet agent --test

运行此操作将将主要表现应用于运行测试的代理,您可能会看到如下的输出:

1Info: Retrieving pluginfacts
2Info: Retrieving plugin
3Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
4Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
5Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
6Info: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb
7Info: Caching catalog for host1.nyc2.example.com
8Info: Applying configuration version '1407966707'

此命令有助于查看主宣言如何立即影响单个服务器。

一次性宣言

娃娃应用命令允许您按要求执行与主宣言无关的宣言,它只将宣言应用于您运行应用的节点。

1sudo puppet apply /etc/puppet/modules/test/init.pp

如果您想在一个代理节点上测试一个新的宣言,或者如果您只想一次运行一个宣言(例如,将一个代理节点初始化为所需状态),则此方法非常有用。

简单的宣言

正如你可能记得的那样,娃娃大师的主要表现文件位于 /etc/puppet/manifests/site.pp

master 上,现在编辑它:

1sudo vi /etc/puppet/manifests/site.pp

现在,添加以下行来描述一个文件资源:

1file {'/tmp/example-ip':                                            # resource type file and filename
2  ensure  => present,                                               # make sure it exists
3  mode    => 0644,                                                  # file permissions
4  content => "Here is my Public IP Address: ${ipaddress_eth0}.\n",  # note the ipaddress_eth0 fact
5}

现在保存和退出. 内线评论应该解释我们正在定义的资源. 在简单的英语中,这将使所有代理节点都具有在 /tmp/example-ip 的文件,具有 -rw-r--r-- 权限,以及包含节点的公共 IP 地址的文本。

您可以等到代理人自动检查主人,或者您可以运行玩偶代理 - 测试命令(从您的代理节点之一)。

1cat /tmp/example-ip

您应该看到输出显示如下(该节点的IP地址):

1Here is my Public IP Address: 128.131.192.11.

定义一个节点

如果要为特定节点定义资源,请在宣言中定义一个节点

在主机上,编辑site.pp:

1sudo vi /etc/puppet/manifests/site.pp

现在添加以下几行:

1node 'ns1', 'ns2' {    # applies to ns1 and ns2 nodes
2  file {'/tmp/dns':    # resource type file and filename
3    ensure => present, # make sure it exists
4    mode => 0644,
5    content => "Only DNS servers get this file.\n",
6  }
7}
8
9node default {}       # applies to nodes that aren't explicitly defined

保存和退出。

现在 Puppet 将确保在 ns1ns2 上存在一个 /tmp/dns' 文件. 如果您不想等待计划的 Puppet 代理拖动,您可能需要运行 puppet agent --test` 命令(从 ns1 或 ns2)。

请注意,如果您不定义资源,Puppet 将尽最大努力不要触摸它,因此,如果您从示例中删除这些资源,Puppet 将不会删除它创建的文件。

这些例子没有做任何有用的事情,但它们确实证明娃娃的工作是正确的。

使用一个模块

现在让我们使用一个模块. 模块有助于将任务组合在一起. Puppet 社区中有很多模块,你甚至可以写自己的。

在 Puppet 主机上,从 forgeapi 安装puppetlabs-apache模块:

1sudo puppet module install puppetlabs-apache

警告 :不要在现有 Apache 设置中使用此模块,它将清除任何未由 Puppet 管理的 Apache 配置。

现在编辑site.pp:

1sudo vi /etc/puppet/manifest/site.pp

现在添加以下行以在 host2 上安装 Apache:

1node 'host2' {
2  class { 'apache': }             # use apache module
3  apache::vhost { 'example.com':  # define vhost resource
4    port    => '80',
5    docroot => '/var/www/html'
6  }
7}

现在下次 Puppet 更新 host2 时,它将安装 Apache 包,并配置一个名为example.com的虚拟主机,在端口 80 上聆听,并具有文档根 /var/www/html

host2 上,运行以下命令:

1sudo puppet agent --test

您应该看到一大堆输出,表明正在安装Apache。完成后,转到 _host2_的公共IP地址。

!你已经使用了你的第一个娃娃模块!

结论

现在你有一个基本的代理 / 主人 Puppet 安装,你现在已经准备好了解如何使用 Puppet 来管理你的服务器基础设施. 查看以下教程: Getting Started With Puppet Code: Manifests and Modules

Published At
Categories with 技术
comments powered by Disqus