Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186500
  • 博文数量: 33
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 182
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-17 17:57
个人简介

IT运维工程师

文章分类

全部博文(33)

文章存档

2015年(20)

2014年(13)

我的朋友

分类: LINUX

2015-02-12 14:21:58

MY 淘宝:
转自:

在MCollective环境中,有3个角色,分别是:
Servers:服务器端,可以通过MCollective控制的机器,一般来说是我们的测试或是线上环境跑的服务器。
Client: 客户端,用来发送命令到需要的服务器中执行。实际上可以认为它是控制端,我们可以安装在Puppet Master中,或是自己电脑上用来控制你的服务器干活儿。
Middleware:中间件,MCollective的clients和servers并不直接通信,而是通过这个中间件来路由消息的。推荐完成中间件功能的软件是ActiveMQ,当然如果你有能力,也可以换别的MQ软件。
用过Puppet的人们都会知道,Puppet的Master与Agent之间的通信都经过了SSL加密,每个客户端都有各自的证书。MCollective也类似,不过不同的是,在MCollective环境中有两个层面的加密和验证的事情:
1. 传输层
MCollective servers/client与ActiveMQ之间的通信加密。防止服务器通讯过程中被监听,而通过CA验证后,也可以防止中间人攻击发生。
我们这次安装过程中,ActiveMQ会使用Puppet现有的CA拷贝来验证证书的有效性,而servers/clients会使用Puppet环境中已经使用现有CA颁发的证书来通讯。server/clients与ActiveMQ的通讯由Connector Plugin完成。
2. 应用层
通过security plugin完成,每个client用户拥有唯一的key,所有服务器共享同一个key。每个服务器节点保存所有授权过的client public key。
一个服务器在接受到请求时,如果请求的key不在自己保存的授权过的列表中的时候,它会拒绝掉这个请求。
如果后面你使用ActionPolicy Plugin,它可以提供更细粒度的客户端控制。
所以这个的功能是用于控制那个客户端可以管理那些服务器。

介绍大概就是这个样子。下面说安装过程。
1. 凭证准备
传输层(ActiveMQ):
密码: 用于连接ActiveMQ的用户名和密码。我们(我和puppetlabs写文档的人)建议用户名用 mcollective ,并创建一个健壮的密码。(在这个文档里我用 liucy.org )
CA: 使用Puppet现有的CA,因为大家都在用Puppet对吧,而且CA会在Puppet初始验证的时候下发到每个服务器上。所以直接拿来用就好了。($certdir/ca.pem — /var/lib/puppet/ssl/certs/ca.pem)
ActiveMQ证书: 如果你的ActiveMQ服务器已经在Puppet管理之下,可以用已有的证书。或者是可以直接在Puppet Master生成一个新的证书(sudo puppet cert generate activemq.liucy.org),证书位置为$certdir/.pem,$privatekeydir/.pem(/var/lib/puppet/ssl/{certs,private_keys)/.epm)。
Server证书: 使用现有Puppet Agent中的证书。位于$certdir/.pem和$privatekeydir/.pem(/var/lib/puppet/ssl/{certs,private_keys)/.pem)。
应用层:
共享的服务器KEY: 登录 Puppet Master使用sudo puppet cert generate mcollective-servers生成新的key。
客户端证书: MCollective Client是可以有多个的,且可以在同一台服务器中不同用户做为不同的client。
2. 部署中间件
  1. 注:中间件Puppetlabs官方建议使用ActiveMQ,但有别的软件如RabbitMQ也是可以的。我建议如果不是特别必须,最好用ActiveMQ。
安装: 查看我前面的文章安装Puppetlabs的YUM源,然后yum install activemq就安装完成了。
配置文件: 下载ActiveMQ的activemq.xml的 配置样本 ,放到/etc/activemq目录中。
mcollective用户: 打开activemq.xml,找到plugins节,并插入以下内容,修改密码项并记住你设置的密码。
  1. <plugins>
  2.       <simpleAuthenticationPlugin>
  3.         <users>
  4.           <authenticationUser username="mcollective" password="liucy.org" groups="mcollective,everyone"/>
  5.           <authenticationUser username="admin" password="liucy.org" groups="mcollective,admins,everyone"/>
  6.         </users>
  7.       </simpleAuthenticationPlugin>
  8.       <!-- ... authorization goes below... -->
  9. </plugins>
生成Keystores: 登录activemq主机,假定主机名为activemq.liucy.org并已经做过Puppet证书的验证,在/var/lib/puppet/ssl/certs目录中有activemq.liucy.org.pem。
  1. mkdir ~/mq_credentials
  2. cd ~/mq_credentials
  3. sudo keytool -import -alias "liucy.org" -file /var/lib/puppet/ssl/certs/ca.pem -keystore truststore.jks
  4. sudo cat /var/lib/puppet/ssl/private_keys/activemq.liucy.org.pem /var/lib/puppet/ssl/certs/activemq.liucy.org.pem > temp.pem
  5. sudo openssl pkcs12 -export -in temp.pem -out activemq.p12 -name activemq.liucy.org
  6. sudo keytool -importkeystore -destkeystore keystore.jks -srckeystore activemq.p12 -srcstoretype PKCS12 -alias activemq.liucy.org
  7. # 上面的命令过程中需要输入几次密码,可以直接设置一个非常复杂的并记住
  8. # 命令完成后会在当前目录生成keystroe.jks和truststore.jks,把它们拷入/etc/activemq目录。
配置SSL: 在activemq.xml中找到刚才的plugin节,在其下面插入如下内容
  1. <sslContext>
  2.           <sslContext keyStore="keystore.jks" keyStorePassword="#上面生成keystroes时的密码#" trustStore="truststore.jks" trustStorePassword="#上面生成keystores时的密码#" />
  3. </sslContext>
找到transportConnectors节修改成如下形式。
  1. <transportConnectors>
  2.             <transportConnector name="stomp" uri="stomp+ssl://0.0.0.0:61614?needClientAuth=true"/>
  3. </transportConnectors>
  1. 注:在ActiveMQ 5.5版本的activemq.xml中,<broker>元素的第一层子元素的书写位置必须是按字母表来排序的,也就是说sslContext元素要写在plugins后面,transportConnectors元素要写在systemusage后面。这是一个奇怪的设计,在5.6以后的版本中取消了。但是Pupppetlabs当前的YUM源中给的是5.5,所以大家要小心。
启动activemq
service activemq start
确认ActiveMQ服务器允许61614端口入站请求
3. 安装配置MCollective Server
其实写到这里的时候,我有点发愁,因为这完全不符合“简单安装”这个名字吗,上面已经写了这么多,结果才装完MQ。。。。。
实际上,我在装完MC环境之后,写了一个Puppet的模块,来搞定ActiveMQ和MCollective Server,Cleint的部分比较麻烦,但也由Puppet管理了不少。所以,我想,先列出来所有的步骤吧,让人们先了解都有那些步骤,然后我后面会把写的模块也共享出来供各位借鉴。
然后我们继续。。
安装: 在有puppetlabs源的前提下执行yum install mcollective
凭证: 在凭证准备的过程中,我们在Puppet Master使用sudo puppet cert generate mcollective-servers生成了共享证书,而证书会保存成/var/lib/puppet/ssl/{private_keys,public_keys}/mcollective-server.pem。我们将它们分别保存成server_private.pem和server_public.pem再拷贝到每个客户端的/etc/mcollective目录。实际上,这个操作我们可以在Puppet模块中使用file资源完成。  然后是客户端证书,创建/etc/mcollective/clients,用来保存我们在下一步配置客户端时生成的证书。同样,这个目录我们也可以使用Puppet的file资源来同步,而且这样做的好处是,当我们创建了新的客户端证书时,可以方便的把它们同步到服务器中。
Fact文件: MCollective命令在执行时会根据服务器中的facts判断是否接受执行某个任务,而读取facts的实现方式是读取/etc/mcollectie/facts.yaml,而不是每次执行facter命令。所以我们需要手动生成这个文件。 
当然,这部分同样是使用Puppet完成的,因为mc server是每台机器都要安装,你要是每台都手动操作的话,累死你。 
在模块里这样写就行了:
  1. file{"/etc/mcollective/facts.yaml":
  2.       owner => root,
  3.       group => root,
  4.       mode => 400,
  5.       loglevel => debug, # reduce noise in Puppet reports
  6.       content => inline_template("<%= scope.to_hash.reject { |k,v| k.to_s =~ /(uptime_seconds|timestamp|free)/ }.to_yaml %>"), # exclude rapidly changing facts
  7.     }
配置文件:这是配置mc server的最后一步了,生成/etc/mcollective/server.cfg文件。 
这个文件稍微有点麻烦。原因是因为当你使用MCollective的功能越多时,这个文件的配置项就越多,而且有可能会一部分机器有这个配置,另一部分有那个配置。 
不过好处是,当你用到那个地步时,你使用Puppet的能力也一定会随之增长。所以,我现在就只写个简单的配置,让我们的环境能跑起来。 
然后,同样,这样配置文件是使用Puppet来完成的,MCollective官方文档里提供了它的模板(PS:这篇文章绝大部分–95%–的思路、文字都来源于官方文档,估计我只是翻译了一下),我把它贴在下面。然后提供一些翻译,告诉各位,这个配置文件都有那几部分内容,配置时又需要小心什么。

  1. <% ssldir = '/var/lib/puppet/ssl' %> ##这里新建了ssldir变量,用于标识ssl文件目录
  2. # /etc/mcollective/server.cfg

  3. # ActiveMQ connector settings:
  4. connector = activemq ## connector plugin,连接插件,这里先用的是activemq插件
  5. direct_addressing = 1 ## 是否支持直连模式,也就是直接指定一台机器执行命令,而不是广播
  6. plugin.activemq.pool.size = 1 ## activemq连接池,可以配置多个activemq
  7. plugin.activemq.pool.1.host = <%= @activemq_server %> ##activemq服务器地址,如果你是用Puppet来配置,就在调用类的时候把activemq_server变量赋值,如果是直接使用就把这里换成你实际的服务器地址,比如plugin.activemq.pool.1.host = activemq.liucy.org
  8. plugin.activemq.pool.1.port = 61614 ## 连接activemq的端口,这个我们在配置它的时候是指定的了。不记得的话可以翻上面的配置。
  9. plugin.activemq.pool.1.user = mcollective ## 连接activemq的用户,这个也是我们在上面配置的
  10. plugin.activemq.pool.1.password = <%= @activemq_mcollective_password %> ## 密码,不用我说了吧
  11. plugin.activemq.pool.1.ssl = 1 ## 连接activemq是否使用ssl
  12. plugin.activemq.pool.1.ssl.ca = <%= ssldir %>/certs/ca.pem ## CA的地址
  13. plugin.activemq.pool.1.ssl.cert = <%= ssldir %>/certs/<%= scope.lookupvar('::clientcert') %>.pem ## 我们在传输层凭证准备的时候的Server证书,也就是puppet agent的证书,/var/lib/puppet/ssl/certs/主机名.liucy.org.pem
  14. plugin.activemq.pool.1.ssl.key = <%= ssldir %>/private_keys/<%= scope.lookupvar('::clientcert') %>.pem ## /var/lib/puppet/ssl/private_keys/主机名.liucy.org.pem
  15. plugin.activemq.pool.1.ssl.fallback = 0

  16. # SSL security plugin settings:
  17. securityprovider = ssl ## 应用层验证方式,ssl
  18. plugin.ssl_client_cert_dir = /etc/mcollective/clients ## 存放客户端证书的目录,我们在上面已经创建了,但是还没有存证书进去,等下面配置完客户端后就会有了。
  19. plugin.ssl_server_private = /etc/mcollective/server_private.pem ## 凭证准备时,生成的共享Server key,我们在上面的操作中也将它们保存在了/etc/mcollective目录
  20. plugin.ssl_server_public = /etc/mcollective/server_public.pem

  21. # Facts, identity, and classes:
  22. identity = <%= scope.lookupvar('::fqdn') %> ## 主机标识,FQDN
  23. factsource = yaml ## 我们上面写的facts文件,源格式是yaml,下面是指定的文件路径
  24. plugin.yaml = /etc/mcollective/facts.yaml
  25. classesfile = /var/lib/puppet/state/classes.txt ## Puppet类文件,此文件记录上次获取的Catalog中都有那些类

  26. # No additional subcollectives:
  27. collectives = mcollective ## subcollectives,分组成功
  28. main_collective = mcollective ## 主组

  29. # Registration:
  30. # We don't configure a listener, and only send these messages to keep the
  31. # Stomp connection alive. This will use the default "agentlist" registration
  32. # plugin.
  33. registerinterval = 600 ## 应该是类似于心跳机制吧,定时发送信息到ActiveMQ以确保主机存活

  34. # Auditing (optional):
  35. # If you turn this on, you must arrange to rotate the log file it creates.
  36. rpcaudit = 1 ## 审计功能配置
  37. rpcauditprovider = logfile
  38. plugin.rpcaudit.logfile = /var/log/mcollective-audit.log

  39. # Authorization:
  40. # If you turn this on now, you won't be able to issue most MCollective
  41. # commands, although `mco ping` will work. You should deploy the
  42. # ActionPolicy plugin before uncommenting this; see "Deploy Plugins" below.

  43. # rpcauthorization = 1 ## 更细粒度的权限设置插件,我们这里暂时没有启用
  44. # rpcauthprovider = action_policy
  45. # plugin.actionpolicy.allow_unconfigured = 1

  46. # Logging:
  47. logger_type = file ## 日志相关配置
  48. loglevel = info
  49. logfile = /var/log/mcollective.log
  50. keeplogs = 5
  51. max_log_size = 2097152
  52. logfacility = user

  53. # Platform defaults:
  54. # These settings differ based on platform; the default config file created by
  55. # the package should include correct values. If you are managing settings as
  56. # resources, you can ignore them, but with a template you'll have to account
  57. # for the differences.
  58. <% if scope.lookupvar('::osfamily') == 'RedHat' -%> ## 不同Linux发行版中保存MCollective插件的路径是不同的,所以这里写了一个判断。如果你确定你只使用CentOS或是Ubuntu,可以直接写对应的路径就好。
  59. libdir = /usr/libexec/mcollective
  60. daemonize = 1
  61. <% elsif scope.lookupvar('::osfamily') == 'Debian' -%>
  62. libdir = /usr/share/mcollective/plugins
  63. daemonize = 1
  64. <% else -%>
  65. # INSERT PLATFORM-APPROPRIATE VALUES FOR LIBDIR AND DAEMONIZE
  66. <% end %>
4. 安装配置MCollective Client
安装
yum install mcollective-client
生成凭证
官网上关于这部分的配置写的非常悬乎,弄了一堆的命令。主要是因为,他们想的是做为client,目标是人,也就是管理员。而这个管理员是复数,一个大公司中有多个管理员,那么就要给每人一个管理机的普通用户,他们登录上来之后执行mco命令去控制自己有权限的服务器。所以才在用户的家目录下创建了.mcollective.d目录,每个用户都有自己的证书和配置。 
而,在我周边的运维同鞋圈子中,一个人搞定一个公司网络的情况居多,也就是说,不需要这么复杂的配置,我就是root用户登录puppet master然后执行mco命令就好了。所以下面的内容就是为了这个需求准备的。 
官方的文档里,这部分执行了下面的命令:
  1. mkdir -p ~/.mcollective.d/credentials
  2. puppet certificate generate <NAME> --ssldir ~/.mcollective.d/credentials --ca-location remote --ca_server <CA PUPPET MASTER
  3. puppet certificate find <NAME> --ssldir ~/.mcollective.d/credentials --ca-location remote --ca_server <CA PUPPET MASTER>
  4. puppet certificate find mcollective-servers --ssldir ~/.mcollective.d/credentials --ca-location remote --ca_server <CA PUPPET MASTER>
  5. puppet certificate find ca --ssldir ~/.mcollective.d/credentials --ca-location remote --ca_server <CA PUPPET MASTER>
这几个命令的目的是通过Puppet Master的CA为mc client的用户生成一份新的证书,验证完成后把certs/.pem和private_keys/.pem放到.mcollective.d/credential目录下,然后再把ca.pem,mcollective-server.pem文件也拉进来。 
而在我们的需求中,我不需要生成新的证书,因为我是Puppet Master,我也不需要下载ca.pem和mcollective-server.pem,因为我在前面的操作中也生成了。所以这部分是不需要操作的。直接进入下面的配置文件步骤。
配置文件: 因为我们就只有一个mc client,也是用的root用户,所以要修改的就是/etc/mcollective/client.cfg。模板如下,同时,也和上面一样,里面会讲一下各项配置的用途。
  1. <% ssldir = '/var/lib/puppet/ssl' %> ## ssldir变量
  2. connector = activemq ## connector plugin: activemq,下面的服务器,密码之类的不再复述
  3. direct_addressing = 1
  4. plugin.activemq.pool.size = 1
  5. plugin.activemq.pool.1.host = <%= activemq_server %>
  6. plugin.activemq.pool.1.port = 61614
  7. plugin.activemq.pool.1.user = mcollective
  8. plugin.activemq.pool.1.password = <%= mcollective_password %>
  9. plugin.activemq.pool.1.ssl = 1
  10. plugin.activemq.pool.1.ssl.ca = <%= ssldir %>/certs/ca.pem ## ca.pem,因为自己就是CA,所以可以直接使用
  11. plugin.activemq.pool.1.ssl.cert = <%= ssldir %>/certs/puppet.liucy.org.pem ## 使用本机puppet master的证书和key
  12. plugin.activemq.pool.1.ssl.key = <%= ssldir %>/private_keys/puppet.liucy.org.pem
  13. plugin.activemq.pool.1.ssl.fallback = 0

  14. securityprovider = ssl
  15. plugin.ssl_server_public = <%= ssldir %>/certs/mcollective-servers.pem ## 共享server key,生成就是在本机,所以可以直接使用
  16. plugin.ssl_client_private = <%= ssldir %>/private_keys/puppet.liucy.org.pem ## client key/certs直接使用本机Puppet Master的
  17. plugin.ssl_client_public = <%= ssldir %>/certs/puppet.liucy.org.pem

  18. default_discovery_method = mc
  19. direct_addressing_threshold = 10
  20. ttl = 60
  21. color = 1
  22. rpclimitmethod = first

  23. collectives = mcollective
  24. main_collective = mcollective

  25. libdir = /usr/libexec/mcollective
  26. helptemplatedir = /etc/mcollective

  27. # Facts
  28. factsource = yaml
  29. plugin.yaml = /etc/mcollective/facts.yaml
这样最简单的MCollective Client的配置就完成了。当然,还有一个动作是上面配置Server的时候没做的,就是把/var/lib/puppet/ssl/certs/puppet.liucy.org.pem拷贝进每台MC Server的/etc/mcollective/clients目录。然后重启mcollective server就一切都完成了。尝试使用mco ping命令来测试吧。

5. 部署插件
to be continued..

MY 淘宝:
阅读(2358) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~