介绍
Puppet,来自Puppet Labs,是一种配置管理工具,可帮助系统管理员自动执行服务器基础架构的配置,配置和管理。 提前规划和使用Puppet等配置管理工具可以减少重复基本任务所花费的时间,并帮助确保您的配置在整个基础架构中一致和准确。 一旦使用Puppet和其他自动化工具管理服务器,您将有更多的空闲时间,可用于改进设置的其他方面。
Puppet有两个品种,Puppet Enterprise和开源Puppet。 它运行在大多数Linux发行版,各种UNIX平台和Windows上。
在本教程中,我们将介绍如何在代理/主安装在CentOS 7.安装开源Puppet 4在此设置中, Puppet主服务器,用于运行服务器Puppet软件可用于控制所有其他服务器,或Puppet代理节点。 注意,我们将使用Puppet服务器软件包,而不是Passenger或任何其他运行时环境。
先决条件
要学习本教程,您必须对所有要使用Puppet, 你也将需要创建一个新的CentOS 7服务器充当Puppet主服务器的服务器根目录或超级用户权限。 如果您没有现有的服务器基础架构,请按照先决条件DNS设置教程重新创建示例基础架构(如下所述)。
在开始安装Puppet之前,请确保您具有以下先决条件:
- 专用网络DNS:正向和反向DNS必须配置,并且每个服务器都必须有一个唯一的主机名。 这里是一个教程, 配置自己的私有网络的DNS服务器 。 如果您没有配置DNS有这样做,你必须使用你
hosts
文件进行名称解析。 我们将假设您将使用您的专用网络在您的基础设施内进行通信。 - 防火墙中打开端口:Puppet师必须在端口8140.到达如果你的防火墙是过于严格,看看这个FirewallD教程关于如何允许端口8140传入请求指示。
示例基础架构
我们将使用以下基础设施来演示如何设置Puppet:
主机名 | 角色 | 私有FQDN |
---|---|---|
host1 | 通用CentOS 7服务器 | host1.nyc3.example.com |
host2 | 通用CentOS 7服务器 | host2.nyc3.example.com |
ns1 | 主Nameservers | ns1.nyc3.example.com |
ns2 | 辅助Nameservers | ns2.nyc3.example.com |
puppet代理将安装在所有这些主机上。 这些主机将由其专用网络接口引用,这些网络接口映射到DNS中的“.nyc3.example.com”子域。 这是在必备教程中描述的相同的基础设施: 如何配置BIND作为在CentOS 7专用网络DNS服务器 。
一旦你有所有的先决条件,让我们继续创建Puppet主服务器!
创建Puppet主服务器
创建一个新的CentOS 7 X64服务器,使用“Puppet”作为自己的主机名。 硬件要求取决于要管理的代理节点数量; 两个CPU核心和1 GB的内存是管理节点屈指可数的最低要求,但你需要更多的资源,如果你的服务器基础设施是较大的。 Puppet服务器默认配置为使用2 GB的RAM。
主机名 | 角色 | 私有FQDN |
---|---|---|
Puppet | Puppet Master | puppet.nyc3.example.com |
如果你只是设置你的DNS和不确定如何,包括新主机,请参阅维护DNS记录的DNS教程的部分。 实质上,您需要添加“A”和“PTR”记录,并允许新主机执行递归查询。 此外,请确保配置搜索域,以便服务器可以使用短主机名来查找对方。
注:本教程假定您的Puppet Master的主机名是“Puppet”。 如果使用不同的名称,您将需要与本教程略有不同。 具体来说,您必须在Puppet代理节点的配置文件中指定Puppet主机的主机名,并且必须在签署任何代理证书之前重新生成Puppet主机的SSL证书。 否则,您将收到此错误: Error: Could not request certificate: The certificate retrieved from the master does not match the agent's private key.
。
配置此设置不包括在本教程中。
安装NTP
因为它充当代理节点的证书颁发机构,所以Puppet主服务器必须保持准确的系统时间,以避免在发出代理证书时出现潜在问题 - 如果存在时间差异,则证书可能会过期。 为此,我们将使用网络时间协议(NTP)。
首先,使用此命令查看可用的时区:
timedatectl list-timezones
这将为您提供可用于您的服务器的时区列表。 当您找到对于您的服务器正确的区域/时区设置时,使用此命令(替换您的首选区域和时区)设置:
sudo timedatectl set-timezone America/New_York
使用此命令通过yum安装NTP:
sudo yum -y install ntp
不要使用一次性时间同步ntpdate
命令:
sudo ntpdate pool.ntp.org
通常的做法是更新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 systemctl restart ntpd
最后,启用NTP守护程序:
sudo systemctl enable ntpd
现在我们的服务器保持准确的时间,让我们安装Puppet服务器软件。
安装Puppet服务器
Puppet服务器是在Puppet主服务器上运行的软件。 它是将配置推送到其他服务器的组件,这些服务器将运行Puppet代理软件。
使用此命令启用官方Puppet Labs集合存储库:
sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
安装puppetserver
包:
sudo yum -y install puppetserver
Puppet服务器现在安装在您的主服务器上,但它还没有运行。
配置内存分配(可选)
默认情况下,Puppet服务器配置为使用2 GB的RAM。 您应该根据主服务器具有的可用内存量以及将管理的代理节点数量自定义此设置。
首先,开放/etc/sysconfig/puppetserver
在你喜欢的文本编辑器。 我们将使用vi
:
sudo vi /etc/sysconfig/puppetserver
然后找到JAVA_ARGS
线,并使用-Xms
和-Xmx
参数设置内存分配。 例如,如果你想使用3 GB的内存,行应该看起来像这样:
JAVA_ARGS="-Xms3g -Xmx3g"
保存并完成后退出。
启动Puppet服务器
现在我们准备用这个命令启动Puppet服务器:
sudo systemctl start puppetserver
接下来,启用Puppet服务器,使其在主服务器启动时启动:
sudo systemctl enable puppetserver
Puppet服务器正在运行,但它尚未管理任何代理节点。 让我们学习如何安装和添加Puppet代理!
安装Puppet代理
Puppet代理软件必须安装在Puppet master将管理的任何服务器上。 在大多数情况下,这将包括基础架构中的每个服务器。 如引言中所述,Puppet代理可以在所有主要的Linux发行版,某些UNIX平台和Windows上运行。 因为安装在每个操作系统上稍有不同,我们将仅介绍CentOS 7服务器上的安装。 关于在Ubuntu 14.04服务器上安装代理Puppet的说明,可以发现在这里 。
在所有代理服务器上执行这些步骤。
使用此命令启用官方Puppet Labs集合存储库:
sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
安装puppet-agent
包装:
sudo yum -y install puppet-agent
现在已安装Puppet代理,请使用以下命令启动它:
sudo /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
第一次运行Puppet代理时,它会生成SSL证书并向Puppet主机发送签名请求。 在Puppet主站签署代理的证书之后,它将能够与代理节点通信和控制代理节点。
请记住对所有Puppet代理节点重复此部分。
注意:如果这是你的第一个Puppet剂,建议您尝试登录的Puppet Master,这是覆盖在下一步,将你的其他代理之前证书。 一旦你验证了一切正常,那么你可以回去,并添加剩下的代理节点放心。
在Puppet Master上签署证书
第一次Puppet在代理节点上运行时,它将向Puppet主机发送证书签名请求。 在Puppet服务器将能够与代理节点通信和控制代理节点之前,它必须签署该特定代理节点的证书。 我们将描述如何签署和检查签名请求。
列出当前证书请求
在Puppet主服务器上,运行以下命令以列出所有未签名的证书请求:
sudo /opt/puppetlabs/bin/puppet cert list
如果您刚刚设置了第一个代理节点,您将看到一个请求。 它看起来像下面,代理节点的主机名:
Output: "host1.nyc3.example.com" (SHA256) 15:90:C2:FB:ED:69:A4:F7:B1:87:0B:BF:F7:DD:B5:1C:33:F7:76:67:F3:F6:23:AE:07:4B:F6:E3:CC:04:11:4C
请注意,没有+
在它的前面。 这表示它尚未被签名。
签署A请求
签署证书请求,用puppet cert sign
命令,将要签署的证书的主机名。 例如,签署host1.nyc3.example.com
的证书,可以使用下面的命令:
sudo /opt/puppetlabs/bin/puppet cert sign host1.nyc3.example.com
您将看到以下输出,表明已签署证书请求:
Output:Notice: Signed certificate request for host1.nyc3.example.com
Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc3.example.com at '/etc/puppetlabs/puppet/ssl/ca/requests/host1.nyc3.example.com.pem'
Puppet主服务器现在可以通信和控制签名证书所属的节点。
如果你想签当前所有的请求,使用--all
选项,如下所示:
sudo /opt/puppetlabs/bin/puppet cert sign --all
撤销证书
您可能想从Puppet中删除主机,或重建主机,然后将其添加回Puppet。 在这种情况下,您将要从Puppet主控中撤销主机的证书。 要做到这一点,你可以用clean
动作:
sudo /opt/puppetlabs/bin/puppet cert clean hostname
指定的主机的关联证书将从Puppet中删除。
查看所有签名的请求
如果要查看所有请求,签名和未签名,请运行以下命令:
sudo /opt/puppetlabs/bin/puppet cert list --all
您将看到所有请求的列表。 签名请求前面有一个+
和未签名的请求没有+
。
Output:+ "puppet" (SHA256) 5A:71:E6:06:D8:0F:44:4D:70:F0:BE:51:72:15:97:68:D9:67:16:41:B0:38:9A:F2:B2:6C:BB:33:7E:0F:D4:53 (alt names: "DNS:puppet", "DNS:puppet.nyc3.example.com")
+ "host1.nyc3.example.com" (SHA256) F5:DC:68:24:63:E6:F1:9E:C5:FE:F5:1A:90:93:DF:19:F2:28:8B:D7:BD:D2:6A:83:07:BA:FE:24:11:24:54:6A
+ "host2.nyc3.example.com" (SHA256) CB:CB:CA:48:E0:DF:06:6A:7D:75:E6:CB:22:BE:35:5A:9A:B3:93:63:BF:F0:DB:F2:D8:E5:A6:27:10:71:78:DA
+ "ns2.nyc3.example.com" (SHA256) 58:47:79:8A:56:DD:06:39:52:1F:E3:A0:F0:16:ED:8D:40:17:40:76:C2:F0:4F:F3:0D:F9:B3:64:48:2E:F1:CF
恭喜! 您的基础设施现在已准备好由Puppet管理!
Puppet入门
现在您的基础架构已设置为使用Puppet进行管理,我们将向您介绍如何使用Puppet执行一些基本任务。
如何事实被聚集
Puppet收集有关它的每个节点的事实与facter称为工具。 Facter默认情况下收集对系统配置有用的信息(例如操作系统名称,主机名,IP地址,SSH密钥等)。 可以添加不是默认事实集的一部分的自定义事实。
收集的事实在许多情况下可能是有用的。 例如,您可以创建Web服务器配置模板并自动填充特定虚拟主机的相应IP地址。 或者你可以决定你的服务器的分布是“CentOS的”,所以你应该运行apache2
服务,而不是httpd
。 这些是基本的例子,但他们应该给你一个如何使用事实的想法。
要查看在代理节点上自动收集的事实列表,请运行以下命令:
/opt/puppetlabs/bin/facter
主清单文件
Puppet使用特定于域的语言来描述系统配置,这些描述保存到名为“manifests”的文件,其具有.pp文件扩展名。 默认的主清单文件位于您的Puppet主服务器上 /etc/puppetlabs/code/environments/production/manifests/site.pp
。 现在让我们创建一个占位符文件:
sudo touch /etc/puppetlabs/code/environments/production/manifests/site.pp
请注意,主清单现在是空的,因此Puppet不会在代理节点上执行任何配置。
如何执行主要清单
Puppet代理定期检查Puppet服务器(通常每30分钟)。 当它检入时,它将向主机发送关于自身的事实,并且拉出当前目录 - 由主清单确定的与代理相关的资源及其期望状态的编译列表。 代理节点然后将尝试进行适当的改变以实现其期望的状态。 只要Puppet主服务器正在运行并与代理节点通信,该周期将继续。
在特定代理节点上立即执行
还可以通过运行以下命令(在有问题的代理节点上)手动启动对特定代理节点的检查:
/opt/puppetlabs/bin/puppet agent --test
运行此命令会将主清单应用于运行测试的代理程序。 您可能会看到如下输出:
Output:Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
...
Info: Loading facts
Info: Caching catalog for host1
Info: Applying configuration version '1457389302'
Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: defined content as '{md5}dd769ec60ea7d4f7146036670c6ac99f'
Notice: Applied catalog in 0.04 seconds
此命令对于查看主清单如何立即影响单个服务器很有用。
一次性清单
该puppet apply
命令可以执行不相关的主清单清单上的需求。 它仅适用清单到您从应用节点。 这里是一个例子:
sudo /opt/puppetlabs/bin/puppet apply /path/to/your/manifest/init.pp
以这种方式运行清单很有用,如果你想在代理节点上测试一个新的清单,或者如果你只想运行清单一次(例如,将代理节点初始化到所需的状态)。
示例清单
你可能还记得,在Puppet Master主清单文件位于/etc/puppetlabs/code/environments/production/manifests/site.pp
。
在Puppet主服务器上,编辑它:
sudo vi /etc/puppetlabs/code/environments/production/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地址):
Output:Here is my Public IP Address: 128.131.192.11.
指定节点
如果要定义特定节点的资源,定义一个node
在清单中。
在主,编辑site.pp
:
sudo vi /etc/puppetlabs/code/environments/production/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 /opt/puppetlabs/bin/puppet module install puppetlabs-apache
警告 :不要对现有的Apache安装使用这个模块。 它将清除不由Puppet管理的任何Apache配置。
现在编辑site.pp
:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
现在,添加以下行host2上安装Apache:
node 'host2' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}
# node default {} # uncomment this line if it doesn't already exist in your manifest
保存并退出。 现在,下一次更新Puppethost2上,它会安装Apache包,并配置名为“example.com”的虚拟主机,监听端口80,并与文档根目录/var/www/html
。
在host2上,运行以下命令:
sudo /opt/puppetlabs/bin/puppet agent --test
您应该看到一堆输出,表明正在安装Apache。 一旦完成,在Web浏览器中打开host2的公共IP地址。 您应该看到一个由Apache提供的页面。
恭喜! 你已经使用了你的第一个Puppet模块!
结论
现在您已经安装了一个基本的代理/主Puppet,现在您已经准备好了解如何使用Puppet来管理您的服务器基础结构。 看看下面的教程: 入门Puppet代码:舱单及模块 。