柴少的官方网站 技术在学习中进步,水平在分享中升华

puppet系列(六)Puppet整合Foreman架构

一、Foreman概述:

1.1 foreman介绍:

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

1.2 Foreman的架构图:

foreman本身只是一个框架,通过smart-proxy代理各种应用程序完成各项功能。

图片.png


1.3 功能说明

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

二、Foreman环境部署

2.1 foreman安装

第一步:安装前的准备(我这里是Centos6系统的操作系统)

# rpm -Uvh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
# cat /etc/yum.repos.d/foreman.repo   #现在要手工配置了,因为如果用它指定的话,会指定到laster源,然而从1.13开始里面已经没有e16了。(或者#rpm  -Uvh http://yum.theforeman.org/releases/1.12/el6/x86_64/foreman-release-1.12.2-1.el6.noarch.rpm,foreman官方站:http://theforeman.org)
[foreman]
name=foreman
baseurl=http://yum.theforeman.org/releases/1.12/el6/x86_64/
gpgcheck=0
enabled=1

[foreman-source]
name=foreman-source
baseurl=http://yum.theforeman.org/releases/1.12/el6/x86_64/
gpgcheck=0
enabled=0

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm  #安装epel源是为了下载一个关联软件包,rubygem-ansi,或者提前# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/rubygem-ansi-1.4.3-2.el6.noarch.rpm 不然执行yum时会报错。

下面是报错的例子:

# yum -y install foreman-installer  #没有rubygem-ansi会报下面的错误(Centos7的链接为:http://dl.fedoraproject.org/pub/epel/7/ppc64le/r/rubygem-ansi-1.4.3-2.el7.noarch.rpm,或者rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm).

--> 完成依赖关系计算
错误:Package: rubygem-kafo-0.9.2-1.el6.noarch (foreman)
          Requires: rubygem(ansi)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

第二步:yum安装操作

# yum -y install foreman-installer

图片.png

博文来自:www.51niux.com

第三步: 安装foreman

# cat /etc/hosts    #hosts文件里面添加一条,这一条跟puppet.conf里面的certname保持一致,主机名也要设置成这个名称。
192.168.1.102 foreman1.puppet

注:# hostname -f 执行此命令,主机名不能是localhost,不然会有个相关的提示,提示hostname不规范之类的。

下面是报错信息:

# foreman-installer --foreman-db-adapter mysql2 --foreman-db-type mysql --no-enable-puppet --no-enable-foreman-proxy --foreman-configure-epel-repo=false
Output of 'hostname -f' does not seems to be valid FQDN

Make sure above command gives fully qualified domain name. At least one
dot must be present. If needed, change the hostname permanently via the
'hostname' or 'hostnamectl set-hostname' command
and editing the appropriate configuration file.
(e.g. on Red Hat systems /etc/sysconfig/network,
on Debian based systems /etc/hostname).

If 'hostname -f' still returns an unexpected result, check /etc/hosts and put
the hostname entry in the correct order, for example:
 
  1.2.3.4 full.hostname.com full

The fully qualified hostname must be the first entry on the line
Your system does not meet configuration criteria

# puppet agent -t  #然后执行保证与服务器端是畅通的,然后本地也有此名称的证书文件。

# foreman-installer --foreman-db-adapter mysql2 --foreman-db-type mysql --no-enable-puppet --no-enable-foreman-proxy --foreman-configure-epel-repo=false
图片.png

#注意看上图,第一次产生的admin的密码是随机的,图片.png,等会web登录的时候就用这个账号和密码。

#一定要像上图一样提示成功啊,有个Success!。通过foreman-installer调用puppet对foreman进行配置,注意:自动配置完成后会给出foreman的日志路径和Web页面地址已经登录时的用户名及随机密码。

注:#yum install foreman-installer foreman  mod_passenger mod_ssl ruby193-rubygem-passenger-native mysql mysql-server foreman-mysql2   openssl #执行这个基本是各种依赖包冲突的。有上面那一步,这一步是不需要的,foreman-installer会将相关的依赖包下载并安装的,所以第一次安装的时候时间会有些长。

注:如果是Centos7的环境,然后在没有配置第三方epel源的时候,需要:

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/ppc64le/r/rubygem-rack-1.6.4-2.el7.noarch.rpm    #因为foreman-installer安装rubygem-passenger-4.0.18-9.11.el7.x86_64的时候依赖这个软件包。

博文来自:www.51niux.com

第四步:登录验证

打开浏览器,输入URL:https://foreman的IP

图片.png

图片.png

 注:如果没有注意,或者foreman密码忘记了要怎么办呢?

# foreman-rake permissions:reset PASSWORD=51niux@51niux   #主要格式是foreman-rake permissions:reset PASSWORD=‘生成密码的字符串’,我这里就是初始密码为,用51niux@51niux生成一个字符串密码。

Reset to user: admin, password: hesp4ipq6atxMBnD                      # 这里就是用户名为admin,密码hesp4ipq6atxMBnD,foreman的admin用户的密码更改完毕。

三、foreman-proxy的搭建

一般foreman是不与puppet的master端安装在一起的,这里我们在puppet的master端上面部署foreman-proxy,让客户端的执行结果上报到foreman。

puppet mastet端上面的操作

第一步:yum安装相关的软件包组。

#  yum install foreman-installer foreman-proxy tftp-server syslinux  
如果报错:

错误:Package: foreman-proxy-1.6.3-1.el6.noarch (foreman)
          Requires: rubygem(sinatra)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
解决办法:

# rpm -Uvh http://yum.theforeman.org/releases/1.13/el7/x86_64/rubygem-sinatra-1.3.5-1.el7.noarch.rpm --force  --nodeps   #foreman-proxy依赖这个软件包组,但是这个依赖关系很难解决我就强制安装了。

第二步:foreman安装proxy

# foreman-installer --no-enable-foreman --no-enable-foreman-cli --no-enable-foreman-plugin-bootdisk --no-enable-foreman-plugin-setup --no-enable-puppet --enable-foreman-proxy  --foreman-proxy-puppetrun-provider=mcollective  --foreman-proxy-puppetca=true   --foreman-proxy-dhcp=false  --foreman-proxy-tftp=false  --foreman-proxy-dns=false --foreman-proxy-register-in-foreman=false  --foreman-configure-epel-repo=false --foreman-configure-scl-repo=false   

图片.png

#上图的效果表示,安装成功。

#  netstat  -lntup|grep 8443   #观察发现8443端口启动了,但是监听的是127.0.0.1,默认是这样。
tcp        0      127.0.0.1:8443                0.0.0.0:*                   LISTEN      11777/ruby  

第三步:修改服务端puppet.conf的文件

# cat /etc/puppet/puppet.conf    #修改上传报告形式,为foreman

[master]
reports = foreman

第四步:设置ENC的操作,不过我们这里只是用foreman做报告收集工作,这步可以不操作

# cp /usr/share/foreman-installer/modules/foreman/files/foreman-report_v2.rb  /etc/puppet/node.rb   #这步操作是错误的,这个文件是不能用的,在(四、foreman-proxy的进一步完善。)会说明。

#注:上面这个文件的下载方式链接是:https://raw.githubusercontent.com/theforeman/puppet-foreman/master/files/external_node_v2.rb

}L7}@0~L$VJDK5]2XPY([SG.png

# chown puppet. /etc/puppet/node.rb
# chmod 550 /etc/puppet/node.rb

第五步:设置report

#  cp /usr/share/foreman-installer/modules/foreman/files/foreman-report_v2.rb  /usr/lib/ruby/site_ruby/1.8/puppet/reports/foreman.rb

第六步:设置连接foreman的信息

# cat /etc/puppet/foreman.yaml
:url: "https://foreman1.puppet"  #主要是这里,你要看你的puppet master的服务器端所存的foreman的证书的名称,如果是 IP这里就是IP,如果是主机名或者域名,这里就是主机名或者域名。还有就是由此证书 

:ssl_ca: "/var/lib/puppet/ssl/certs/ca.pem"         #剩下的这些证书都是puppet master端自己的证书了。
:ssl_cert: "/var/lib/puppet/ssl/certs/master.puppet.pem"
:ssl_key: "/var/lib/puppet/ssl/private_keys/master.puppet.pem"
:user: ""
:password: ""
:puppetdir: "/var/lib/puppet"
:puppetuser: "puppet"
:facts: true
:timeout: 10
:threads: null

注:不然的话,你的日志上传的时候会报错(192.168.1.102是我设置的foreman服务器的IP,报错的原因就是我上面url写的是IP,而服务器端存的证书名称是主机名,所以找不到证书没有上传权限):

May  2 18:36:16 master puppet-master[10866]: Report processor failed: Could not send report to Foreman at https://192.168.1.102/api/reports: hostname was not match with the server certificate

第七步:修改proxy的监听IP

# vi /etc/foreman-proxy/settings.yml
:trusted_hosts: 

    - foreman1.puppet   #修改为foreman的主机名,或者注释掉,如果注释掉就是默认允许所有的SSL连接。

# vim /usr/share/foreman-proxy/lib/smart_proxy.rb  #有两个  :Port => SETTINGS.http_port,都分别在其上方添加:Host => SETTINGS.bind_host,

:Host => SETTINGS.bind_host,
:Port => SETTINGS.http_port,

第八步:重启服务

# /etc/init.d/httpd restart    #因为我们还是puppet+apache的那种形式
# /etc/init.d/foreman-proxy restart   #重启foreman代理

# netstat  -lntup|grep 8443    #监听IP发送了变化,如果不执行第七步。你foreman再远程主机,无法添加代理了。
tcp        0      0 0.0.0.0:8443                0.0.0.0:*                   LISTEN      13260/ruby  

第九步:foreman服务器端的web操作,foreman添加代理

架构=》智能代理服务器=》新代理

图片.png

图片.png

第十步:客户端的操作:

客户端执行#puppet agent -t

最后再foreman上面查看结果:

主机=>所有主机

图片.png

#然后再监控那里也会有一些详细的统计,点击主机名称也会看到更详细的统计。

四、foreman-proxy的进一步完善。

4.1 foreman的主机显示操作系统等信息:

从上面哪个截图来看,效果还不够,只显示了主机名,和最后报告时间,但是操作系统啊型号什么的并没有显示啊,这显然是不对,foreman可以自动将这些报告汇总生成的。

第一步:更改foreman-proxy,也就是puppet master的配置文件

# vim /etc/puppet/puppet.conf  #在reports下面添加了两行来添加ENC的配置

reports = store,foreman
external_nodes = /etc/puppet/node.rb
node_terminus  = exec


# /etc/init.d/httpd restart  #重启puppet master服务,我这是已经做了优化之后的。

博文来自:www.51niux.com

第二步:puppet 客户端执行。

# puppet agent -t   #直接就报错了,报错原因就是因为,/etc/puppet/node.rb文件不能用。

Warning: Unable to fetch my node definition, but the agent run will continue:
Warning: Error 400 on SERVER: Failed to find agent3.puppet via exec: Execution of '/etc/puppet/node.rb agent3.puppet' returned 1:
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed when searching for node agent3.puppet: Failed to find agent3.puppet via exec: Execution of '/etc/puppet/node.rb agent3.puppet' returned 1:
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run

第三步:puppet 服务端的操作。

# wget https://raw.githubusercontent.com/theforeman/puppet-foreman/master/files/external_node_v2.rb
# cp external_node_v2.rb /etc/puppet/node.rb

# chmod 500 /etc/puppet/node.rb
# /etc/init.d/httpd restart

第四步: puppet客户端再次操作测试:

# puppet agent -t

第五步: foreman再次查看

(我再之前测试的主机全删除掉,然后用agent3.puppet客户端重新执行了一下,现在结果操作系统什么的都显示了。)

图片.png

第六步:主机下面的一些信息查看。

(做了这些其实很有用的,我们可以很直观的查看我们现在管理的机器的型号,操作系统等)

如:我们可以很轻松获得我们有哪些物理机什么型号的,操作系统有哪些等等,如下图的硬件型号汇总:

图片.png


当然报告功能只是foreman里面的一个很小的部分,它还可以控制puppet服务端,可以和mco来结合使用,可以做好多事情,有兴趣可以上官网研究,这里我就是用它来做个报告系统。

五、puppet的多环境部署

        随着管理机器的增加,一个配置推送错误会导致严重的后果。所以日常的操作一定要非常谨慎。通过多环节部署来实现“灰度发布”的功能。

       “灰度发布”是一种能平滑过渡的一种发布方式,简单来说,就是有一个test环境,什么操作执行都让test环境里面的机器先执行,没问题执行也达到了我们的效果,再在生产环境执行。

        puppet提供一种功能environments,通过puppet.conf配置它准许将master的代码配置目录进行分离,agent访问master通过参数来区分访问不同的目录,puppet将这种方式管理称为环境,如将代码目录分为测试环境、开发环境、线上环境等。通过调整agent的参数访问不同的master环境,从而达到灰度发布的目录。

5.1 puppet master端的操作:

第一步:首次需要手工创建puppet的环境目录:

# mkdir -p /etc/puppet/environments/{production,development,test}
# mkdir -p /etc/puppet/environments/production/{manifests,modules}
# mkdir -p /etc/puppet/environments/development/{manifests,modules}
# mkdir -p /etc/puppet/environments/test/{manifests,modules}

第二步:puppet.conf文件的配置(需要重启master服务):

#cat /etc/puppet/puppet.conf   #如将puppet.conf配置文件内容分为3个环境,每个环境都有自己的manifest和modulepath,这里可以用":"来分隔跟多的基础模块路径。
[master]

environments   = development,production,test  #添加三个环境的标签名称
environment_timeout = 2

[development]
    modulepath     = /etc/puppet/environments/development/modules
    manifest = /etc/puppet/environments/development/manifests/site.pp
[production]
    modulepath     = /etc/puppet/environments/production/modules
    manifest = /etc/puppet/environments/production/manifests/site.pp

[test]

    modulepath     = /etc/puppet/environments/test/modules
    manifest = /etc/puppet/environments/test/manifests/site.pp

第三步:客户端可以手工指定不同的环境命令执行测试:

#puppet --server master.puppet --environment=development  --test

#puppet --server master.puppet --environment=production --test

#puppet --server master.puppet --environment=test --test

当然,客户端也可以在puppet.conf文件里面指定,默认就是production,不过如果你想搞个机器来做test环境的话,可以修改下配置文件:

#cat /etc/puppet/puppet.conf   #加上下面一句,来指定此节点所在的环境。

environment = test

既然说到了多环境,肯定就涉及到了版本控制,就是用SVN或者Git,线下分支编写测试没问题了,合并到主线,然后再设置到钩子函数,可以实现自动更新线上的配置,不过版本控制我现环境没有做,这里提一嘴。

六、puppet的配置文件更新

这里说的puppet的配置文件更新,其实也是可有可无的一件事情,因为puppet所有客户端的配置文件基本是同一的,除了certname这里是不同的,我们可以有多种手段让puppet客户端的配置文件在初始化之处就部署完毕。

我这里说一种,要是初始化的时候,就puppet.conf做了个简单设置保证能跟puppet master端连同,但是想让puppet客户端的配置文件,丰富一点的话,下面就是个小例子:

#cat /etc/puppet/environments/production/modules/puppet/templates/puppet.conf.erb  #首先有个模板文件

[main]
    logdir = /var/log/puppet
    rundir = /var/run/puppet
    ssldir = $vardir/ssl
[agent]
    classfile = $vardir/classes.txt
    localconfig = $vardir/localconfig
    certname   = <%= scope.lookupvar('puppet::params::certname') %>
    server     = <%= scope.lookupvar('puppet::params::puppetserver') %>
    pluginsync = false
    report    = true
    runinterval   = 9999m
    configtimeout = 120
    environment = production

然后剩下是manifests下面的配置文件:

# cat /etc/puppet/environments/production/modules/puppet/manifests/init.pp
class puppet {
        include  puppet::config
}

# cat /etc/puppet/environments/production/modules/puppet/manifests/config.pp
class puppet::config{
  include puppet::params
  file { '/etc/puppet/puppet.conf':  
    ensure  => present,  
    content => template('puppet/puppet.conf.erb'), 
  }
}

#cat /etc/puppet/environments/production/modules/puppet/manifests/params.pp
class puppet::params {
  $puppetserver = 'master.puppet'
  $certname = "${::fqdn}"
}

然后node节点那里一加载puppet模块,再有新的主机就可以通过#puppet agent -t 来更新配置文件了

作者:忙碌的柴少 分类:puppet系列 浏览:8608 评论:0
留言列表
发表评论
来宾的头像