当手中有至关多的机器须要管理的时候,自动化处理冗余又无聊的任务对系统管理员来讲就很重要了。不少管理员习惯了本身写脚本模拟复杂软件之间的调度。不幸的是,脚本会过期,脚本的做者会离职,若是不花费巨大精力来维护这些脚本的话,它们迟早会一点儿用也没有。若是能有一个系统,任何人均可以使用、安装工具,不论其受雇于何人,那真是太期待了。目前已有几种系统能够解决这类需求,这篇教程将介绍其中之一——Puppet——的使用方法。node
Puppet 是一款为 IT 系统管理员和顾问们设计的自动化软件,你能够用它自动化地完成诸如安装应用程序和服务、补丁管理和部署等工做。全部资源的相关配置都以“manifests”的方式保存,单台机器或者多台机器均可以使用。若是你想了解更多内容,Puppet 实验室的网站上有关于 Puppet 及其工做原理的更详细的介绍。web
在这篇教程里,咱们将一块儿安装配置一个 Puppet 服务器,而后在咱们的客户端服务器(译注:这里的“客户端服务器”指须要部署业务逻辑的服务器)上完成一些基本配置。apache
因为 Puppet 不是 CentOS 或 RHEL 发行版的基本仓库,因此咱们得手动添加 Puppet 实验室提供的自定义仓库。在全部你想使用 Puppet 的地方执行如下命令安装这个仓库(版本不一样,对应的 RPM 文件名可能略有不一样)。vim
对于 CentOS/RHEL 6.5:centos
# rpm -ivh https://yum.puppetlabs.com/el/6.5/products/x86_64/puppetlabs-release-6-10.noarch.rpm
对于 CentOS/RHEL 7:api
# rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm
在你打算用做 master 的服务器上安装 "puppet-server" 包。服务器
# yum install puppet-server
安装完成后,设置 Puppet 服务器开机自动启动,而后启动它。网络
# chkconfig puppetmaster on# service puppetmaster start
如今服务器已经运行起来了,咱们试试看咱们的网络能不能访问到它。dom
对于使用 iptables 当作防火墙的 CentOS/RHEL 6,在 /etc/sysconfig/iptables 文件的 OUTPUT ACCEPT 小节里添加下面这一行。tcp
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -j ACCEPT
从新启动 iptables 服务让刚才的修改生效。
# service iptables restart
在安装了防火墙的 CentOS/RHEL 7 上,咱们这么作:
# firewall-cmd --permanent --zone=public --add-port=8140/tcp# firewall-cmd --reload
执行下面的命令,在客户端节点安装 Puppet 客户端。
# yum install puppet
安装完成后,确保 Puppet 会随开机自动启动。
# chkconfig puppet on
Puppet 客户端须要知道 Puppet master 服务器的地址。最佳方案是使用 DNS 服务器解析 Puppet master 服务器地址。若是你没有 DNS 服务器,在 /etc/hosts 里添加相似下面这几行也能够:
1.2.3.4 server.your.domain
2.3.4.5 client-node.your.domain
1.2.3.4 对应你的 Puppet master 服务器 IP 地址,“server.your.domain”是你的 master 服务器域名(默认一般是服务器的 hostname),“client-node.your.domain”是你的客户端节点。包括 Puppet master 和客户端,全部相关的服务器都要在 hosts 文件里配置。
完成这些设置以后,咱们要让 Puppet 客户端知道它的 master 是谁。默认状况下,Puppet 会查找名为“puppet”的服务器,但一般这并不符合你网络环境的真实状况,因此咱们要改为 Pupper master 服务器的完整域名。打开文件 /etc/sysconfig/puppet,把 PUPPET_SERVER 变量的值改为你在 /etc/hosts 文件里指定的 Puppet master 服务器的域名。
PUPPET_SERVER=server.your.domain
master 服务器名也要在 /etc/puppet/puppet.conf 文件的“[agent]”小节里事先定义好。
server=server.your.domain
如今能够启动 Puppet 客户端了:
# service puppet start
强制咱们的客户端在 Puppet master 服务器上登记:
# puppet agent --test
你会看到相似于下面的输出。别怕,这是正常现象,由于服务器尚未在 Puppet master 服务器上验证过。
Exiting; no certificate found and waitforcert is disabled
返回 Puppet master 服务器,检查证书验证请求:
# puppet cert list
你应该能看到一个列出了全部向 Puppet master 服务器发起证书签名请求的服务器。找到你客户端服务器的 hostname 而后使用下面的命令签名(client-node 是你客户端节点的域名):
# puppet cert sign client-node
到此为止 Puppet 客户端和服务器都正常工做了。恭喜你!可是,如今 Puppet master 没有任何要客户端作的事儿。好吧,咱们来建立一些基本的 manifest 文件而后让咱们的客户端节点安装一些基本工具。
回到你的 Puppet 服务器,确保目录 /etc/puppet/manifests 存在。
# mkdir -p /etc/puppet/manifests
建立 manifest 文件 /etc/puppet/manifests/site.pp,内容以下
node 'client-node' { include custom_utils} class custom_utils { package { ["nmap","telnet","vim-enhanced","traceroute"]: ensure => latest, allow_virtual => false, }}
而后从新启动 puppetmaster 服务。
# service puppetmaster restart
客户端默认每 30 分钟更新一次配置,若是你但愿你的修改能强制生效,就在客户端执行以下命令:
# puppet agent -t
若是你须要修改客户端的默认刷新时间,编辑客户端节点的 /etc/puppet/puppet.conf 文件中“[agent]”小节,增长下面这一行:
runinterval =
这个选项的值能够是秒(格式好比 30 或者 30s),分钟(30m),小时(6h),天(2d)。值得注意的是,0 意味着“当即执行”而不是“从不执行”。
你免不了会提交错误的配置,而后不得不经过调试判断问题出如今哪儿。通常来讲,你要么经过查看日志文件 /var/log/puppet 着手解决问题,要么手动执行查看输出:
# puppet agent -t
使用“-t”选项,你能够看到 Puppet 的详细输出。这条命令还有额外的选项能够帮你定位问题。首先要介绍的选项是:
# puppet agent -t --debug
debug 选项会显示 Puppet 本次运行时的差很少每个步骤,这在调试很是复杂的问题时颇有用。另外一个颇有用的选项是:
# puppet agent -t --noop
这个选项让 puppet 工做在 dry-run(译注:空转模式,不会对真实环境产生影响)模式下,不会应用任何修改。Puppet 只会把其工做内容输出到屏幕上,不会写到磁盘里去。
有时候你须要更复杂的 manifest 文件,在你着手编写它们以前,Forge 是一个集合了 Puppet 模块的社区,你有必要花点儿时间浏览一下 https://forge.puppetlabs.com。
如今,假设你已经找到了一个模块能解决你的问题。怎么把它安装到你的系统中去呢?很是简单,由于 Puppet 已经有了能够直接下载模块的用户界面,只须要执行下面的命令:
# puppet module install <module_name> --version 0.0.0
<module_name> 是你选择的模块的名字,版本号可选(若是没有指定版本号,默认使用最新的版本)。若是你不记得想安装的模块的名字了,试试下面的命令搜索模块:
# puppet module search <search_string>
你会获得一个包含 search_string 的列表。
# puppet module search apache
Notice: Searching https://forgeapi.puppetlabs.com ...NAME DESCRIPTION AUTHOR KEYWORDSexample42-apache Puppet module for apache @example42 example42, apachepuppetlabs-apache Puppet module for Apache @puppetlabs apache web httpd centos rhel ssl wsgi proxytheforeman-apache Apache HTTP server configuration @theforeman foreman apache httpd DEPRECATED
若是你想查看已经安装了哪些模块,键入:
# puppet module list
到目前为止,你应该有了功能完整的能够向一个或多个客户端服务器推送基本配置的 Puppet master 服务器。你能够本身随便加点儿配置适配你本身的网络环境。没必要为试用 Puppet 担忧,你会发现,它会拯救你的生活。