Foreman 企业级配置管理解决方案

Foreman 企业级配置管理解决方案

Foreman 企业级配置管理解决方案

笔记本 puppet foreman


构建运维体系

本文是构建运维体系的其中一个关键环节.

什么是 foreman

Foreman 是一个集成的 数据中心生命周期管理工具 ,提供了服务开通,配置管理以及报告功能,和 Puppet Dahboard 一样,Foreman也是一个 Ruby on Rails 程序. Foreman 和 Dashboard 不同的地方是在于,Foreman 更多的关注服务开通和管理数据中心的能力,例如和引导工具,PXE启动服务器,DHCP服务器及服务 器开通工具进行集成.

Foreman 机器统一管理平台:

  • Foreman与puppet集成使用,作为puppet的前端使用
  • Foreman可以作为外部节点分类器
  • Foreman可以通过facter组件显示系统信息,并且可以收集puppet报告
  • Foreman可以管理大规模节点,实现配置版本的回溯

1.foreman的架构

  1. foreman本身只是一个框架,通过smart-proxy代理各种应用程序完成各项功能。
    此处输入图片的描述
  2. foreman通过代理DNS、DHCP、TFTP完成了kickstart、cobbler、jumpstart等各种自动化安装系统工具的图形统一管理窗口,实现的结果是只需要在foreman上定制各种模板(pxe、ks),不同的模板还可以嵌套各种片段(snippet)达到统一、简化的目的。完成之后,便可以添加节点,关联定义的各种模板生成各种的pxe和ks文件实现自动化安装。
  3. foreman通过代理puppet、puppet CA完成对puppet自动签名、puppet环境、class、变量、facter的管理。
  4. foreman通过ENC和静态组管理class和node之间的关联。
  5. foreman通过puppet plugin,可以在UI上完成对节点puppet命令的触发动作,触发的方法可以借助puppetkick(已经被遗弃)、mcollective(借助sudo)、puppetssh(借助sshkey)、salt、customrun等各种工具实现。
  6. foreman可以收集所有节点运行puppet���报告、执行情况。
  7. foreman还提供了各种搜索、报表等功能,能够更好的展现节点的运行状况。
  8. foreman除了管理裸机外还可以管理各种虚拟化软件,比如RHEV-M、EC2、VMWware和OpenStack等。
  9. foreman还可以和LDAP以及AD集成。
  10. foreman还提供了强大了用户、权限管理入口,可以建立多个用户、多个用户组、还可以对权限进行角色的定义等。不同的权限用户在UI上所看到的功能以及主机是不一样的。
  11. foreman还提供了所有在UI上操作的Audits(审计)功能,这样可以保障所有用户的操作都有据可查。

2.foreman发展线路图

foreman发展线路图

安装Foreman

本文所有操作基于centos 6.2环境

系统要求

1.支持平台

以下系统支持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)

2.puppet兼容性

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

3.Facter兼容性

  • Foreman 兼容 Facter 1.x 版本
  • Facter 2.x版本需要Foreman installer和Foreman 1.4.2以上版本才支持

3.防火墙配置

端口 协议 Required For
53 TCP,UDP DNS Server
67, 68 UDP DHCP Server
69 UDP * TFTP Server
80, 443 TCP
    服务 - 使用 Apache + PassengerHTTP & HTTPS Foreman web
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
    Puppet Master
8443 TCP Smart Proxy, open only to Foreman

Foreman Installer

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

1.实验安装

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

2.集成mcollective

mcollective是一个类似salt的基于消息队列的并行工作执行系统框架.它使用发布订阅中间件(Publish Subscribe Middleware)这样的现代化工具和通过目标数据(meta data)而不是主机名(hostnames)来实时发现网络资源这样的现代化理念。提供了一个可扩展的而且迅速的并行执行环境。服务器端是被管理端,客户端是分发远程命令的管理端
MCollective架构
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"进行测试#"

foreman 配置

foreman web界面

待补充

配置管理

1.环境

这里的环境对应Puppet environments, puppet的环境配置,主要的作用是用来做灰度发布.一般使用production和development区分生产环境和非生产环境.只有在非生产环境,经过充分测试的代码,才允许发布到生产环境中.foreman提供的环境管理功能如下:

  • 从现有的puppet环境中导入配置. 配置-环境-从gz-nb-cwh-poreman-192.168.137.2.yw.cwh.com导入.
  • 可以手动创建环境.配置-环境-新建puppet环境
  • 指定主机的应用环境
  • 与主机组绑定相应的环境

默认配置下,导入四中环境common,development,example_env,production.
环境只能绑定主机和组,主机的优先级高于组


2.puppet类

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']

3.配置组

配置组的作用是把几个类组合在一起. 以比较便捷的方式,让主机或主机组匹配多个类.
比如dns和ntp属于系统级别配置可以组合成centos_system 配置组,而mysql,php可以组合成centos_lnmp 配置组.

配置->配置组->新建配置组
name -> centos_system
添加 dnsclient,ntp


4.主机组

顾名思义,就是把有共同特征的主机组成一个组. 从puppet的角度上可以分为.测试组和线上生产环境组. 从项目差异化的角度看,可以按照项目的不同和地理位置的差异来区分.组是可以继承的,
组的规划相对复杂,需要考虑线上线下服务器的实际情况. 这里新建一个开发组,并关联centos_system配置组,用来测试puppet的ntp和dns模块.

配置-> 主机组->新建主机组
名称-> 开发组
puppet类->可用配置组->centos_system->add

主机组的关注点:

  • 网络->域名 配置正确的域名是实现域名自动解析的关键.
  • 操作系统 主机组规定系统架构,主要应用于自动重装系统方面.
  • 主机组->puppet CA,主puppet服务器 这里是实现跨网络,分布式架构的关键
  • puppet类 应用不同的puppet模块,实现配置的主要手段
  • 参数 实现机器配置差异化

5.主机

主机->所有主机
主机是管理的最小单元,所有的配置,优先级别最高的单元.
从规模化管理的角度,劲量避免编辑主机配置,造成的特例差异化.因为特例差异化,往往会提高维护成本.


6.变量

变量的优先级顺序,从低到高

  • 全局变量 配置->全局变量 对所有主机生效
  • 设置选项 管理->设置
  • 域名级别 架构->域名->参数
  • 操作系统级别 主机->操作系统->参数
  • 主机组级别 配置->主机组->参数
  • 主机级别 所有主机->编辑->参数

看到这里,完成了上述步骤,试试在foreman web 上勾选gz-nb-cwh-test.yw.cwh.com主机 点击运行puppet


puppet模块设计

首先,明确puppet的应用场景,一般分为一次性初始化配置和长久配置.

  • 一次性初始化配置 常用于软件环境的构建 比如 foreman-installer
  • 长久配置是实现系统环境和服务的统一.包含服务的自动恢复,减少人工处理

系统配置涉及众多方面的内容比如dns 日志切割 ssh配置等,是一项长期优化的过程.建议使用xmind思维导图,先规划好配置的具体项目,然后逐个跟进实现puppet模块.
Alt text

为了实现跨平台和更好的兼容性,一些系统常见的配置可以使用第三方模块,而不用自己编写
第三方模块的使用原则

  • 优先使用puppetlabs模块
  • 不使用复杂度过高的第三方模块(包含细化管理的类)
  • 不使用不兼容多个linux系统的第三方模块(实际情况需要兼容centos和suse)
  • 避免修改第三方模块,方便日后升级
  • 通过foreman的puppet类定义生产环境比较通用的默认参数

1.产品生命周期

你可能感兴趣的:(配置管理)