<$>[注] 注: 本教程的更新的版本,它使用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 记录部分。基本上,您需要添加一个A
和PTR
记录,并允许新主机执行重复性查询。
使用娃娃
作为娃娃大师
的主机名略有简化了代理设置,因为这是代理在尝试连接到大师时使用的默认名称。
现在我们需要建立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 将确保在 ns1 和 ns2 上存在一个 /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。