本文是构建运维体系的其中一个关键环节.
Foreman 是一个集成的 数据中心生命周期管理工具 ,提供了服务开通,配置管理以及报告功能,和 Puppet Dahboard 一样,Foreman也是一个 Ruby on Rails 程序. Foreman 和 Dashboard 不同的地方是在于,Foreman 更多的关注服务开通和管理数据中心的能力,例如和引导工具,PXE启动服务器,DHCP服务器及服务 器开通工具进行集成.
Foreman 机器统一管理平台:
- Foreman与puppet集成使用,作为puppet的前端使用
- Foreman可以作为外部节点分类器
- Foreman可以通过facter组件显示系统信息,并且可以收集puppet报告
- Foreman可以管理大规模节点,实现配置版本的回溯
本文所有操作基于centos 6.2环境
以下系统支持installer.并经过官方测试
- Red Hat Enterprise Linux 6 or 7
- CentOS or Scientific Linux 6 or 7
- Fedora 19
- Debian 7 (Wheezy)
- Ubuntu 14.04 (Trusty)
- Ubuntu 12.04 (Precise)
Puppet version | Foreman installer | Smart proxy | Report/fact processors | External node classifier |
---|---|---|---|---|
0.25.x | Not supported | Untested | Untested | Supported * |
2.6.0 - 2.6.5 | Not supported | Untested | Untested | Supported * |
2.6.5+ | Not supported | Supported | Supported | Supported |
2.7.x | Supported | Supported | Supported | Supported |
3.0.x | Limited support | 1.1 or higher | Supported | Supported |
3.1.x - 3.4.x | 1.1 or higher | 1.1 or higher | Supported | Supported |
3.5.x | 1.4.3 or higher | 1.4.2 or higher | Supported | Supported |
3.6.0+ | 1.4.3 or higher | 1.5.1 or higher | Supported | Supported |
4.x | Not supported | Not supported | Untested | Untested |
- Foreman 兼容 Facter 1.x 版本
- Facter 2.x版本需要Foreman installer和Foreman 1.4.2以上版本才支持
端口 | 协议 | Required For |
---|---|---|
53 | TCP,UDP | DNS Server |
67, 68 | UDP | DHCP Server |
69 | UDP * | TFTP Server |
80, 443 | TCP |
|
3000 | TCP | HTTP access to Foreman web UI - using standalone WEBrick service |
3306 | TCP | Separate MySQL database |
5910 - 5930 | TCP | VNC控制器 |
5432 | TCP | PostgreSQL数据库 |
8140 | TCP |
|
8443 | TCP | Smart Proxy, open only to Foreman |
Foreman installer 是Foreman简化的安装程序,包含了一整套foreman的puppet模块,通过rpm包和添加必要的配置的来完成foreman的安装。包含必要组件:Foreman web UI, Smart Proxy, Passenger,和可选组件 TFTP, DNS and DHCP servers.
官方强烈建议使用installer安装.而不是只用安装包.这样能大量减少手工配置.
默认配置:
- Apache HTTP with SSL (使用puppet的证书)
- Foreman running under mod_passenge
- Smart Proxy configured for Puppet, TFTP and SSL
- Puppet master running under mod_passenger
- Puppet agent configured
- TFTP server (under xinetd on Red Hat platforms)
可选配置:
- ISC DHCP server
- BIND DNS server
all in one 模式安装, 指在让初学者了解更多foreman组件,达到快速应用.
安装foreman-installer,通过foreman-installer部署foreman支持两种方式:
foreman-installer -i
交互式安装foreman-installer
–help 说明-v展现详细的过程,–noop模拟不实际操作.参数安装
配置源及安装foreman-installer
rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm yum -y install epel-release http://yum.theforeman.org/releases/1.7/el6/x86_64/foreman-release.rpm yum -y install foreman-installer
配置主机名
sed -i 's/HOSTNAME=.*$/HOSTNAME=gz-nb-cwh-poreman-192.168.137.2.yw.cwh.com/' /etc/sysconfig/network
hostname -f#foreman ip 192.168.137.2
hostname gz-nb-cwh-poreman-192.168.137.2.yw.cwh.com
echo "192.168.137.2 gz-nb-cwh-poreman-192.168.137.2.yw.cwh.com full" >>/etc/hosts
禁用selinux
setenforce 0
sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config
安装foreman-proxy,puppet,foreman,dns,fstp
foreman-installer \
--verbose \ --foreman-admin-username=admin \ --foreman-admin-password="Yi7YCjy2xEsU9YVc" \ --enable-foreman \ --enable-foreman-cli \ --enable-foreman-plugin-bootdisk \ --enable-foreman-plugin-setup \ --enable-foreman-proxy \ --enable-puppet \ --foreman-db-adapter=mysql2 \ --foreman-db-type=mysql \ --foreman-environment=production \ --foreman-version=present \ --foreman-proxy-dns=true \ --foreman-proxy-dns-forwarders=8.8.8.8 \ --foreman-proxy-dns-forwarders=223.6.6.6 \ --foreman-configure-epel-repo=false \ --foreman-proxy-dns-zone=yw.cwh.com
测试puppet
puppet agent -vt
安装puppet客户端(puppet ip 192.168.137.3)
echo '192.168.137.2 gz-nb-cwh-poreman-192.168.137.2.yw.cwh.com' >> /etc/hosts
hostname gz-nb-cwh-test.yw.cwh.com
sed -i 's/HOSTNAME=.*$/HOSTNAME=gz-nb-cwh-test.yw.cwh.com/' /etc/sysconfig/network
rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
yum -y install puppet
puppet agent -vt
/etc/puppet/puppet.conf
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
ssldir = $vardir/ssl
[agent]
classfile = $vardir/classes.txt
olocalconfig = $vardir/localconfig
server = gz-nb-cwh-poreman-192.168.137.2.yw.cwh.com
certname = gz-nb-cwh-test.yw.cwh.com
report = true
pluginsync = true
masterport = 8140
environment = production
listen = false
splay = false
splaylimit = 1800
runinterval = 1800
noop = false
configtimeout = 120
usecacheonfailure = true
测试puppet
puppet agent -vt
mcollective是一个类似salt的基于消息队列的并行工作执行系统框架.它使用发布订阅中间件(Publish Subscribe Middleware)这样的现代化工具和通过目标数据(meta data)而不是主机名(hostnames)来实时发现网络资源这样的现代化理念。提供了一个可扩展的而且迅速的并行执行环境。服务器端是被管理端,客户端是分发远程命令的管理端
puppet与MCollective结合,首先MCollective可以用来调度puppet,解决puppet定时执行的问题,其次MCollective可以使用puppet的facts作为过滤器. 最后MCollective能够很好应对多数据中心的生产环境.
安装 rabbitmq-server
yum install rabbitmq-server -y
mkdir -p /var/run/rabbitmq
chmod 775 /var/run/rabbitmq/ -R
/etc/init.d/rabbitmq-server start
加载插件并设置监听61613端口
ln -s /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmq-env /usr/sbin/rabbitmq-env
ln -s /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmq-plugins /usr/sbin/rabbitmq-plugins
rabbitmq-plugins enable rabbitmq_stomp
rabbitmq-plugins enable rabbitmq_management
echo '[{rabbitmq_stomp, [{tcp_listeners, [{"0.0.0.0",61613}]}]}].' > /etc/rabbitmq/rabbitmq.config
/etc/init.d/rabbitmq-server restart
netstat -ntlp|grep beam
删除默认账号创建账号密码
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl delete_user guest
rabbitmqctl add_user cwh 123456
rabbitmqctl add_user admin 123456
rabbitmqctl add_user web_admin 123456
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" cwh ".*" ".*" ".*"
rabbitmqctl set_permissions -p "/" web_admin ".*" ".*" ".*"
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl list_users
rabbitmqctl list_permissions -p "/"
登陆http://192.168.137.2:15672/#/exchanges
添加mcollective_broadcast = topic,mcollective_directed = direct
mcollective安装客户端(ip:192.168.137.2)
yum install mcollective-* -y
/etc/mcollective/client.cfg
main_collective = mcollective
collectives = mcollective
libdir = /usr/libexec/mcollective
logger_type = console
#loglevel = debug
loglevel = warn
# Plugins
securityprovider = psk
plugin.psk = a36cd839414370e10fd281b8a38a4f41
direct_addressing = 1
plugin.rabbitmq.initial_reconnect_delay = 0.01
plugin.rabbitmq.max_reconnect_delay = 30.0
plugin.rabbitmq.use_exponential_back_off = true
plugin.rabbitmq.back_off_multiplier = 2
plugin.rabbitmq.max_reconnect_attempts = 0
plugin.rabbitmq.randomize = false
connector = rabbitmq
plugin.rabbitmq.vhost = /
plugin.rabbitmq.pool.size = 1
plugin.rabbitmq.pool.1.host = 192.168.137.2
plugin.rabbitmq.pool.1.port = 61613
plugin.rabbitmq.pool.1.user = cwh
plugin.rabbitmq.pool.1.password = 123456
plugin.rabbitmq.pool.1.ssl = false
# Facts
factsource = yaml
plugin.yaml = /etc/mcollective/facts.yaml
mcollective安装服务器端(ip:192.168.137.3)
yum install mcollective mcollective-* -y
/etc/mcollective/server.cfg
main_collective = mcollective
collectives = mcollective
libdir = /usr/libexec/mcollective
logfile = /var/log/puppet/mcollective.log
loglevel = debug
daemonize = 1
# --rabbitmq Plugins--
securityprovider = psk
plugin.psk = a36cd839414370e10fd281b8a38a4f41
direct_addressing = 1
connector = rabbitmq
plugin.rabbitmq.initial_reconnect_delay = 0.01
plugin.rabbitmq.max_reconnect_delay = 30.0
plugin.rabbitmq.use_exponential_back_off = true
plugin.rabbitmq.back_off_multiplier = 2
plugin.rabbitmq.max_reconnect_attempts = 0
plugin.rabbitmq.randomize = false
plugin.rabbitmq.timeout = -1
plugin.rabbitmq.pool.size = 1
plugin.rabbitmq.vhost = /
plugin.rabbitmq.pool.1.host = 192.168.137.2
plugin.rabbitmq.pool.1.port = 61613
plugin.rabbitmq.pool.1.user = cwh
plugin.rabbitmq.pool.1.password = 123456
plugin.rabbitmq.pool.1.ssl = false
# --Puppet provider specific options--
plugin.service.provider = puppet
plugin.service.puppet.hasstatus = true
plugin.service.puppet.hasrestart = true
plugin.puppet.command = puppet agent
plugin.puppet.splay = true
plugin.puppet.splaylimit = 30
plugin.puppet.config = /etc/puppet/puppet.conf
# --Facts--
#factsource = yaml
factsource = facter
plugin.yaml = /etc/mcollective/facts.yaml
启动服务端
/etc/init.d/mcollective start
chkconfig mcollective on
在客户端测试mco命令
mco ping -v
mco puppet -v runonce
配置foreman和foreman-proxy
管理"->"设置"->"puppet"-> puppetrun:true
vim /etc/foreman-proxy/settings.d/puppet.yml
:puppet_provider: customrun
:customrun_cmd: /usr/bin/mco
:customrun_args: puppet runonce -I
/etc/init.d/foreman-proxy restart
#最后在foreman页面上点击"运行puppet"进行测试#"
待补充
这里的环境对应Puppet environments, puppet的环境配置,主要的作用是用来做灰度发布.一般使用production和development区分生产环境和非生产环境.只有在非生产环境,经过充分测试的代码,才允许发布到生产环境中.foreman提供的环境管理功能如下:
- 从现有的puppet环境中导入配置.
配置
-环境
-从gz-nb-cwh-poreman-192.168.137.2.yw.cwh.com导入
.- 可以手动创建环境.
配置
-环境
-新建puppet环境
- 指定主机的应用环境
- 与主机组绑定相应的环境
默认配置下,导入四中环境common
,development
,example_env
,production
.
环境只能绑定主机和组,主机的优先级高于组
foreman的puppet类, 相当于puppet的模块. 模块一般指实现单一功能配置. 比如配置mysql,dns,ntp. foreman对puppet模块有较高的要求,为了现可复用性. init.pp必须包含足够需要的变量定义.通过变量覆盖,实现配置的差异化.在传统的puppet部署中,要把一个模块应用到一个客户端,需要实例化这个类.然而在foreman中,只要把类绑定组或主机.就相当于实例化.
把master上/etc/puppet/modules/导入到foreman
配置
->puppet类
-> 从gz-nb-cwh-poreman-192.168.137.2.yw.cwh.com导入
单个模块里面,一般包含很多子类. 如果从页面导入, 会把子类一起导入.在foreman上,子类是可以不导入的, 为了轻便管理类.可以通过配置,过滤掉子类.
/usr/share/foreman/config/ignored_environments.yml
:filters:
- !ruby/regexp '/params$/' - !ruby/regexp '/base$/' - !ruby/regexp '/install$/' - !ruby/regexp '/service$/' - !ruby/regexp '/config$/'
puppet有大量 写好的而且很优秀的第三方模块.可以访问https://forge.puppetlabs.com 查看需要的模块.同时建议初学者阅读这些模块代码.
这里安装dns和ntp模块,然后导入到foreman中.导入的时候可以选择导入的环境.这一步是实现灰度发布的关键.
puppet module install ghoneycutt-dnsclient
puppet module install puppetlabs-ntp
puppet模块的规范,详细查看深入puppet
,这里不再深入
/etc/puppet/modules/ntp/
├── file
├── lib
│ └── puppet
│ └── parser
│ └── functions
│ └── ntp_dirname.rb
├── manifests
│ ├── init.pp
├── templates
│ └── ntp.conf.erb
发现dns和ntp的默认服务器ip地址 并不是我们需要的. 同时dns,ntp服务器的配置,也可能由于机房不同发生变化,很明显的一个例子就是腾讯的服务器,配置的是内网的dns服务器.这里需要用到foreman一个关键的功能代理参数
配置
->puppet类
->dnsclient
->智能代理参数
nameserver
-> 勾选覆盖,同时修改默认值,然后提交
["121.10.118.123","114.114.114.114","223.5.5.5","223.6.6.6","112.124.47.27","202.96.128.143","202.96.128.166","202.96.128.86"]
同理,修改ntp类的servers
默认值为
['time.nist.gov', '0.asia.pool.ntp.org','1.asia.pool.ntp.org','2.asia.pool.ntp.org','3.asia.pool.ntp.org','time-a.nist.gov', 'time.windows.com','ntp.fudan.edu.cn','61.129.42.44', '43.119.133.233']
配置组的作用是把几个类组合在一起. 以比较便捷的方式,让主机或主机组匹配多个类.
比如dns和ntp属于系统级别配置可以组合成centos_system 配置组,而mysql,php可以组合成centos_lnmp 配置组.
配置
->配置组
->新建配置组
name
-> centos_system
添加 dnsclient
,ntp
顾名思义,就是把有共同特征的主机组成一个组. 从puppet的角度上可以分为.测试组和线上生产环境组. 从项目差异化的角度看,可以按照项目的不同和地理位置的差异来区分.组是可以继承的,
组的规划相对复杂,需要考虑线上线下服务器的实际情况. 这里新建一个开发组
,并关联centos_system
配置组,用来测试puppet的ntp和dns模块.
配置
-> 主机组
->新建主机组
名称
-> 开发组
puppet类
->可用配置组
->centos_system
->add
主机组
的关注点:
网络
->域名
配置正确的域名是实现域名自动解析的关键.操作系统
主机组规定系统架构,主要应用于自动重装系统方面.主机组
->puppet CA
,主puppet服务器
这里是实现跨网络,分布式架构的关键puppet类
应用不同的puppet模块,实现配置的主要手段参数
实现机器配置差异化
主机
->所有主机
主机
是管理的最小单元,所有的配置,优先级别最高的单元.
从规模化管理的角度,劲量避免编辑主机配置,造成的特例差异化.因为特例差异化,往往会提高维护成本.
变量的优先级顺序,从低到高
- 全局变量
配置
->全局变量
对所有主机生效- 设置选项
管理
->设置
- 域名级别
架构
->域名
->参数
- 操作系统级别
主机
->操作系统
->参数
- 主机组级别
配置
->主机组
->参数
- 主机级别
所有主机
->编辑
->参数
看到这里,完成了上述步骤,试试在foreman web 上勾选gz-nb-cwh-test.yw.cwh.com
主机 点击运行puppet
首先,明确puppet的应用场景,一般分为一次性初始化配置和长久配置.
- 一次性初始化配置 常用于软件环境的构建 比如 foreman-installer
- 长久配置是实现系统环境和服务的统一.包含服务的自动恢复,减少人工处理
系统配置涉及众多方面的内容比如dns 日志切割 ssh配置等,是一项长期优化的过程.建议使用xmind思维导图,先规划好配置的具体项目,然后逐个跟进实现puppet模块.
为了实现跨平台和更好的兼容性,一些系统常见的配置可以使用第三方模块,而不用自己编写
第三方模块的使用原则
- 优先使用puppetlabs模块
- 不使用复杂度过高的第三方模块(包含细化管理的类)
- 不使用不兼容多个linux系统的第三方模块(实际情况需要兼容centos和suse)
- 避免修改第三方模块,方便日后升级
- 通过foreman的puppet类定义生产环境比较通用的默认参数