如何安装Puppet来管理服务器基础架构

Puppet,Puppet从实验室,是一个配置管理工具可以帮助系统管理员自动化配置,配置和服务器基础架构的管理。提前规划并使用配置管理工具,如Puppet可以减少重复花费的时间基本...

注:本教程中,它使用Puppet服务器,而不是Puppet与Passenger的新版本,可以在这里找到: 如何在主代理安装在Ubuntu 14.04安装Puppet 4

介绍

Puppet,来自Puppet Labs,是一种配置管理工具,可帮助系统管理员自动执行服务器基础架构的配置,配置和管理。 提前规划和使用Puppet等配置管理工具可以减少重复基本任务所花费的时间,并帮助确保您的配置在整个基础架构中一致和准确。 一旦使用Puppet和其他自动化工具管理服务器,您将节省时间,从而改善整体设置的其他方面。

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

在本教程中,我们将介绍如何在Agent / Master安装程序中安装开放源代码Puppet。 该装置由一个中央Puppet主服务器,所有的配置数据进行管理,并从分布的,和所有其余的服务器将Puppet代理节点,它可以通过Puppet主服务器进行配置的。

先决条件

要遵循本教程,您必须对要配置Puppet的所有服务器具有root访问权限。 您还需要创建一个新的Ubuntu 14.04 VPS作为Puppet主服务器。 如果您没有现有基础架构,可以按照先决条件DNS设置教程重新创建示例基础架构(如下所述)。

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

  • 专用网络DNS:正向和反向DNS必须配置,并且每个服务器都必须有一个唯一的主机名。 这里是一个教程, 配置自己的私有网络的DNS服务器 如果您没有配置DNS有这样做,你必须使用你hosts文件进行名称解析。 我们将假设您将使用您的专用网络在您的基础设施内进行通信。
  • 防火墙中打开端口:Puppet师必须在端口8140.到达如果你的防火墙是过于严格,看看这个UFW教程关于如何允许端口8140传入请求指示。

示例基础架构

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

主机名 角色 私有FQDN
host1 通用Ubuntu 14.04 VPS host1.nyc2.example.com
host2 通用Ubuntu 14.04 VPS host2.nyc2.example.com
ns1 主Nameservers ns1.nyc2.example.com
ns2 辅助Nameservers ns2.nyc2.example.com

puppet代理将安装在所有这些主机上。 这些主机将由其专用网络接口引用,这些网络接口映射到DNS中的“.nyc2.example.com”子域。 这是在必备教程中描述的相同的基础设施: 如何在Ubuntu 14.04配置BIND作为一个专用网络DNS服务器

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

创建Puppet主服务器

创建一个新的Ubuntu 14.04 64位VPS,用“Puppet”作为自己的主机名。 将其专用网络添加到您的DNS,具有以下详细信息:

主机名 角色 私有FQDN
Puppet Puppet Master puppet.nyc2.example.com

如果你只是设置你的DNS和不确定如何将主机添加到DNS,请参阅维护DNS记录的DNS教程的部分。 实质上,您需要添加“A”和“PTR”记录,并允许新主机执行递归查询。 此外,请确保配置搜索域,以便服务器可以使用短主机名来查找对方。

使用“puppet”作为Puppet主机的主机名简化了代理程序设置,因为它是代理程序在尝试连接到主机时将使用的默认名称。

现在我们需要设置NTP。

安装NTP

因为它作为代理节点的证书颁发机构,所以puppet主服务器必须保持准确的系统时间,以避免在发出代理证书时出现潜在问题 - 如果存在时间差异,证书可能会过期。 为此,我们将使用网络时间协议(NTP)。

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

sudo ntpdate pool.ntp.org

您的系统时间将更新,但您需要安装NTP守护程序以自动更新时间,以最小化时间漂移。 使用以下apt命令安装它:

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

通常的做法是更新NTP配置以使用地理上更接近您的NTP服务器的“池区”。 在Web浏览器中,转到NTP池项目 ,并期待与您地理较近您正在使用数据中心内的泳池区 我们将与美国池(去http://www.pool.ntp.org/zone/us在我们的例子),因为服务器设在纽约的数据中心。

开放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主软件。

安装Puppet Master

有多种方法来安装开源Puppet。 我们将使用Debian软件包叫做戏梦人生Passenger ,这是由Puppet实验室提供。 戏梦人生Passenger包包括Puppet Master再加上生产就绪的Web服务器(客运与Apache),从而消除了与使用基本的戏梦人生包几个配置步骤。

下载Puppet Labs软件包:

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和其他必需的软件包。 因为我们使用带有Apache的Passenger,Puppet主进程由Apache控制,即它在Apache运行时运行。

在继续之前,通过停止停止Puppet Masterapache2服务:

sudo service apache2 stop

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

锁定版本

偶尔可能会导致Puppet环境停止正常工作。 因此,您将希望在整个基础架构中保持一致的Puppet版本。 如果您决定升级到新的版本,请确保您的任何代理节点之前升级你的主人 ,作为主无法管理具有更高版本号代理商。

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

puppet help | tail -n 1

在写作的时候,从以前的命令的输出是Puppet v3.6.2 我们可以使用apt的引脚功能来锁定我们的Puppet安装到3.6.* ,这将阻止从容易日伪升级到一个更高的主要版本。 创建在apt preferences目录中调用的新文件:

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

添加以下行锁定puppetpuppet-common ,而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主名称和证书。

设置名称和证书

Puppet使用SSL证书来验证主节点和代理节点之间的通信。 Puppet master充当证书颁发机构(CA),并且必须生成用于签署代理证书请求的自己的证书。 我们将立即设置硕士证书。

删除现有证书

删除在软件包安装期间创建的任何现有SSL证书。 Puppet的SSL证书的默认位置是/var/lib/puppet/ssl

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

配置证书

当创建主机的证书时,请包括代理节点可以联系主机的每个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返回到shell。

样品输出:

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主服务几乎准备好开始。 让我们先看看主配置。

配置Puppet Master

主要的Puppet配置文件, puppet.conf ,由三部分组成: [main][master][agent] 正如你可能已经猜到的,“main”部分包含全局配置,“master”部分特定于puppet master,“agent”用于配置puppet代理。 除了我们之前做的更改,默认值将适用于基本设置。

配置文件有许多可能与您自己的设置相关的选项。 该文件的完整描述可在Puppet实验室: 主配置文件(puppet.conf) 。

如果要编辑它,请运行以下命令:

sudo vi /etc/puppet/puppet.conf

让我们来看看主清单文件。

主清单文件

Puppet使用特定域的语言来描述的系统配置,并且这些描述被保存的文件名为“清单”,其中有一个.pp文件扩展名。 默认的主清单文件位于/etc/puppet/manifests/site.pp 稍后我们将介绍一些基本清单,但我们现在将创建一个占位符文件:

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

启动Puppet Master

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

sudo service apache2 start

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

安装Puppet代理

Puppet代理必须安装在Puppet master将管理的任何服务器上。 在大多数情况下,这包括基础架构中的每个服务器。 如引言中所述,Puppet代理可以在所有主要的Linux发行版,某些UNIX平台和Windows上运行。 因为安装在每个操作系统上稍有不同,我们将只讨论Ubuntu和Debian服务器上的安装。

说明安装在位于其他平台PuppetPuppet实验室文档 --be一定要按照“关于代理节点上安装Puppet”一节你选择的操作系统。

注意:假定所有的Puppet节点,包括代理节点,被配置为使用您的DNS。 如果要创建一个全新的服务器,请务必将其添加到您的DNS安装Puppet代理之前。

Ubuntu / Debian代理节点

:所有我们的例子中代理节点, 主机1, 主机2,NS1,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

默认情况下禁用Puppet代理。 要更改此设置,请更新其默认文件:

sudo vi /etc/default/puppet

和变化值START为“yes”:

START=yes

保存并退出/etc/default/puppet

锁定版本

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

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

添加以下行来锁定puppetpuppet-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 master在“puppet”可达,代理应该能够连接到master。 如果主机在“puppet”不可用,您将需要添加Puppet主机的FQDN。 我们建议无论如何配置(用您自己的FQDN替换):

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

保存并退出。

Puppet代理程序已准备好运行。 通过运行以下命令执行此操作:

sudo service puppet start

如果一切配置正确,您不应该看到任何输出。 第一次运行Puppet代理时,它会生成SSL证书并向Puppet主机发送签名请求。 在Puppet主站签署代理的证书之后,它将能够与代理节点通信。

注意 :如果这是你的第一个Puppet代理,建议您尝试添加你的其他代理之前签署的Puppet师的证书。 一旦你验证了一切正常,那么你可以回去,并添加剩下的代理节点放心。

主人签名请求

第一次Puppet在代理节点上运行时,它将向Puppet主机发送证书签名请求。 在主机将能够通信和控制代理节点之前,它必须签署该特定代理节点的证书。 我们将描述如何签署和检查签名请求。

列出当前证书请求

在Puppet主服务器上,运行以下命令以列出所有未签名的证书请求:

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

请注意,没有+在它的前面。 这表示它尚未被签名。

签署A请求

签署证书请求,用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主服务器现在可以通信和控制签名证书所属的节点。

如果你想签当前所有的请求,使用-all选项,如下所示:

sudo puppet cert sign --all

撤销证书

您可能想从Puppet中删除主机,或重建主机,然后将其添加回Puppet。 在这种情况下,您将要从Puppet主控中撤销主机的证书。 要做到这一点,你将要使用的clean动作:

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进行管理,我们将向您介绍如何执行几个基本任务以帮助您开始使用。

如何事实被聚集

Puppet收集有关它的每个节点的事实与facter称为工具。 Facter默认情况下收集对系统配置有用的信息(例如操作系统名称,主机名,IP地址,SSH密钥等)。 如果您需要其他事实来执行配置,则可以添加自定义事实。

收集的事实在许多情况下可能是有用的。 例如,您可以创建Web服务器配置模板并自动填充特定虚拟主机的相应IP地址。 或者,你可以决定你的服务器的操作系统是“Ubuntu的”,所以你应该运行apache2服务,而不是httpd 这些是基本的例子,但他们应该给你一个如何使用事实的想法。

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

facter

如何执行主要清单

Puppet代理定期与Puppet主人签入(通常每30分钟一次)。 在此期间,它将向主机发送关于自身的事实,并且拉出当前目录 - 由主清单确定的与代理相关的资源及其期望状态的编译列表。 代理节点然后将尝试进行适当的改变以实现其期望的状态。 只要Puppet主服务器正在运行并与代理节点通信,该周期将继续。

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

也可以通过运行以下命令(在有问题的代理节点上)手动启动对特定代理节点的检查:

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'

此命令对于查看主清单如何立即影响单个服务器很有用。

一次性清单

puppet apply命令可以执行不相关的主清单清单上的需求。 它仅将清单应用于您运行apply from的节点。 这里是一个例子:

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

以这种方式运行清单很有用,如果你想在代理节点上测试一个新的清单,或者如果你只想运行清单一次(例如,将代理节点初始化到所需的状态)。

简单清单

你可能还记得,在Puppet Master主清单文件位于/etc/puppet/manifests/site.pp

,现在编辑:

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
}

现在保存并退出。 内联注释应该解释我们定义的资源。 简单的说,这将使确保所有代理节点将在文件/tmp/example-ip ,具有-rw-r--r--权限和文本包含节点的公共IP地址。

你可以等待,直到代理与主自动检查中,也可以运行puppet agent --test (从代理节点之一)命令。 然后运行以下命令打印文件:

cat /tmp/example-ip

您应该看到类似下面的输出(使用该节点的IP地址):

Here is my Public IP Address: 128.131.192.11.

指定节点

如果要定义特定节点的资源,定义一个node在清单中。

在主,编辑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会存在于NS1NS2。 您可能要运行的puppet agent --test (从NS1或NS2)的命令,如果你不想等待预定的Puppet代理拉。

注意,如果你没有定义一个资源,Puppet将尽最大努力不要Touch它。 所以如果你从清单中删除这些资源,Puppet不会删除它创建的文件。 如果你想拥有它删除文件,更改ensureabsent

这些例子没有什么作用,但它们证明Puppet正常工作。

使用模块

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

在Puppet Master,安装puppetlabs-apache从forgeapi模块:

sudo puppet module install puppetlabs-apache

警告 :不要对现有的Apache安装使用这个模块。 它将清除不由Puppet管理的任何Apache配置。

现在编辑site.pp

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

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

node 'host2' {
  class { 'apache': }             # use apache module
  apache::vhost { 'example.com':  # define vhost resource
    port    => '80',
    docroot => '/var/www/html'
  }
}

保存并退出。 现在,下一次更新Puppethost2上,它会安装Apache包,并配置名为“example.com”的虚拟主机,监听端口80,并与文档根目录/var/www/html

host2上,运行以下命令:

sudo puppet agent --test

您应该看到一堆输出,表明正在安装Apache。 一旦完成,进入主机2的公网IP地址。 您应该看到默认的Apache欢迎页面。

恭喜! 你已经使用了你的第一个Puppet模块!

结论

现在您已经安装了一个基本的代理/主Puppet,现在您已经准备好了解如何使用Puppet来管理您的服务器基础结构。 看看下面的教程: 入门Puppet代码:舱单及模块