注:本教程中,它使用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
添加以下行锁定puppet
, puppet-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
添加以下行来锁定puppet
和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 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
会存在于NS1和NS2。 您可能要运行的puppet agent --test
(从NS1或NS2)的命令,如果你不想等待预定的Puppet代理拉。
注意,如果你没有定义一个资源,Puppet将尽最大努力不要Touch它。 所以如果你从清单中删除这些资源,Puppet不会删除它创建的文件。 如果你想拥有它删除文件,更改ensure
给absent
。
这些例子没有什么作用,但它们证明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代码:舱单及模块 。