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. 部署中间件
-
注:中间件Puppetlabs官方建议使用ActiveMQ,但有别的软件如RabbitMQ也是可以的。我建议如果不是特别必须,最好用ActiveMQ。
安装: 查看我前面的文章安装Puppetlabs的YUM源,然后yum install activemq就安装完成了。
配置文件: 下载ActiveMQ的activemq.xml的 配置样本 ,放到/etc/activemq目录中。
mcollective用户: 打开activemq.xml,找到plugins节,并插入以下内容,修改密码项并记住你设置的密码。
-
<plugins>
-
<simpleAuthenticationPlugin>
-
<users>
-
<authenticationUser username="mcollective" password="liucy.org" groups="mcollective,everyone"/>
-
<authenticationUser username="admin" password="liucy.org" groups="mcollective,admins,everyone"/>
-
</users>
-
</simpleAuthenticationPlugin>
-
<!-- ... authorization goes below... -->
-
</plugins>
生成Keystores: 登录activemq主机,假定主机名为activemq.liucy.org并已经做过Puppet证书的验证,在/var/lib/puppet/ssl/certs目录中有activemq.liucy.org.pem。
-
mkdir ~/mq_credentials
-
cd ~/mq_credentials
-
sudo keytool -import -alias "liucy.org" -file /var/lib/puppet/ssl/certs/ca.pem -keystore truststore.jks
-
sudo cat /var/lib/puppet/ssl/private_keys/activemq.liucy.org.pem /var/lib/puppet/ssl/certs/activemq.liucy.org.pem > temp.pem
-
sudo openssl pkcs12 -export -in temp.pem -out activemq.p12 -name activemq.liucy.org
-
sudo keytool -importkeystore -destkeystore keystore.jks -srckeystore activemq.p12 -srcstoretype PKCS12 -alias activemq.liucy.org
-
# 上面的命令过程中需要输入几次密码,可以直接设置一个非常复杂的并记住
-
# 命令完成后会在当前目录生成keystroe.jks和truststore.jks,把它们拷入/etc/activemq目录。
配置SSL: 在activemq.xml中找到刚才的plugin节,在其下面插入如下内容
-
<sslContext>
-
<sslContext keyStore="keystore.jks" keyStorePassword="#上面生成keystroes时的密码#" trustStore="truststore.jks" trustStorePassword="#上面生成keystores时的密码#" />
-
</sslContext>
找到transportConnectors节修改成如下形式。
-
<transportConnectors>
-
<transportConnector name="stomp" uri="stomp+ssl://0.0.0.0:61614?needClientAuth=true"/>
-
</transportConnectors>
-
注:在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是每台机器都要安装,你要是每台都手动操作的话,累死你。
在模块里这样写就行了:
-
file{"/etc/mcollective/facts.yaml":
-
owner => root,
-
group => root,
-
mode => 400,
-
loglevel => debug, # reduce noise in Puppet reports
-
content => inline_template("<%= scope.to_hash.reject { |k,v| k.to_s =~ /(uptime_seconds|timestamp|free)/ }.to_yaml %>"), # exclude rapidly changing facts
-
}
配置文件:这是配置mc server的最后一步了,生成/etc/mcollective/server.cfg文件。
这个文件稍微有点麻烦。原因是因为当你使用MCollective的功能越多时,这个文件的配置项就越多,而且有可能会一部分机器有这个配置,另一部分有那个配置。
不过好处是,当你用到那个地步时,你使用Puppet的能力也一定会随之增长。所以,我现在就只写个简单的配置,让我们的环境能跑起来。
然后,同样,这样配置文件是使用Puppet来完成的,MCollective官方文档里提供了它的模板(PS:这篇文章绝大部分–95%–的思路、文字都来源于官方文档,估计我只是翻译了一下),我把它贴在下面。然后提供一些翻译,告诉各位,这个配置文件都有那几部分内容,配置时又需要小心什么。
-
<% ssldir = '/var/lib/puppet/ssl' %> ##这里新建了ssldir变量,用于标识ssl文件目录
-
# /etc/mcollective/server.cfg
-
-
# ActiveMQ connector settings:
-
connector = activemq ## connector plugin,连接插件,这里先用的是activemq插件
-
direct_addressing = 1 ## 是否支持直连模式,也就是直接指定一台机器执行命令,而不是广播
-
plugin.activemq.pool.size = 1 ## activemq连接池,可以配置多个activemq
-
plugin.activemq.pool.1.host = <%= @activemq_server %> ##activemq服务器地址,如果你是用Puppet来配置,就在调用类的时候把activemq_server变量赋值,如果是直接使用就把这里换成你实际的服务器地址,比如plugin.activemq.pool.1.host = activemq.liucy.org
-
plugin.activemq.pool.1.port = 61614 ## 连接activemq的端口,这个我们在配置它的时候是指定的了。不记得的话可以翻上面的配置。
-
plugin.activemq.pool.1.user = mcollective ## 连接activemq的用户,这个也是我们在上面配置的
-
plugin.activemq.pool.1.password = <%= @activemq_mcollective_password %> ## 密码,不用我说了吧
-
plugin.activemq.pool.1.ssl = 1 ## 连接activemq是否使用ssl
-
plugin.activemq.pool.1.ssl.ca = <%= ssldir %>/certs/ca.pem ## CA的地址
-
plugin.activemq.pool.1.ssl.cert = <%= ssldir %>/certs/<%= scope.lookupvar('::clientcert') %>.pem ## 我们在传输层凭证准备的时候的Server证书,也就是puppet agent的证书,/var/lib/puppet/ssl/certs/主机名.liucy.org.pem
-
plugin.activemq.pool.1.ssl.key = <%= ssldir %>/private_keys/<%= scope.lookupvar('::clientcert') %>.pem ## /var/lib/puppet/ssl/private_keys/主机名.liucy.org.pem
-
plugin.activemq.pool.1.ssl.fallback = 0
-
-
# SSL security plugin settings:
-
securityprovider = ssl ## 应用层验证方式,ssl
-
plugin.ssl_client_cert_dir = /etc/mcollective/clients ## 存放客户端证书的目录,我们在上面已经创建了,但是还没有存证书进去,等下面配置完客户端后就会有了。
-
plugin.ssl_server_private = /etc/mcollective/server_private.pem ## 凭证准备时,生成的共享Server key,我们在上面的操作中也将它们保存在了/etc/mcollective目录
-
plugin.ssl_server_public = /etc/mcollective/server_public.pem
-
-
# Facts, identity, and classes:
-
identity = <%= scope.lookupvar('::fqdn') %> ## 主机标识,FQDN
-
factsource = yaml ## 我们上面写的facts文件,源格式是yaml,下面是指定的文件路径
-
plugin.yaml = /etc/mcollective/facts.yaml
-
classesfile = /var/lib/puppet/state/classes.txt ## Puppet类文件,此文件记录上次获取的Catalog中都有那些类
-
-
# No additional subcollectives:
-
collectives = mcollective ## subcollectives,分组成功
-
main_collective = mcollective ## 主组
-
-
# Registration:
-
# We don't configure a listener, and only send these messages to keep the
-
# Stomp connection alive. This will use the default "agentlist" registration
-
# plugin.
-
registerinterval = 600 ## 应该是类似于心跳机制吧,定时发送信息到ActiveMQ以确保主机存活
-
-
# Auditing (optional):
-
# If you turn this on, you must arrange to rotate the log file it creates.
-
rpcaudit = 1 ## 审计功能配置
-
rpcauditprovider = logfile
-
plugin.rpcaudit.logfile = /var/log/mcollective-audit.log
-
-
# Authorization:
-
# If you turn this on now, you won't be able to issue most MCollective
-
# commands, although `mco ping` will work. You should deploy the
-
# ActionPolicy plugin before uncommenting this; see "Deploy Plugins" below.
-
-
# rpcauthorization = 1 ## 更细粒度的权限设置插件,我们这里暂时没有启用
-
# rpcauthprovider = action_policy
-
# plugin.actionpolicy.allow_unconfigured = 1
-
-
# Logging:
-
logger_type = file ## 日志相关配置
-
loglevel = info
-
logfile = /var/log/mcollective.log
-
keeplogs = 5
-
max_log_size = 2097152
-
logfacility = user
-
-
# Platform defaults:
-
# These settings differ based on platform; the default config file created by
-
# the package should include correct values. If you are managing settings as
-
# resources, you can ignore them, but with a template you'll have to account
-
# for the differences.
-
<% if scope.lookupvar('::osfamily') == 'RedHat' -%> ## 不同Linux发行版中保存MCollective插件的路径是不同的,所以这里写了一个判断。如果你确定你只使用CentOS或是Ubuntu,可以直接写对应的路径就好。
-
libdir = /usr/libexec/mcollective
-
daemonize = 1
-
<% elsif scope.lookupvar('::osfamily') == 'Debian' -%>
-
libdir = /usr/share/mcollective/plugins
-
daemonize = 1
-
<% else -%>
-
# INSERT PLATFORM-APPROPRIATE VALUES FOR LIBDIR AND DAEMONIZE
-
<% end %>
4. 安装配置MCollective Client
安装:
yum install mcollective-client
生成凭证:
官网上关于这部分的配置写的非常悬乎,弄了一堆的命令。主要是因为,他们想的是做为client,目标是人,也就是管理员。而这个管理员是复数,一个大公司中有多个管理员,那么就要给每人一个管理机的普通用户,他们登录上来之后执行mco命令去控制自己有权限的服务器。所以才在用户的家目录下创建了.mcollective.d目录,每个用户都有自己的证书和配置。
而,在我周边的运维同鞋圈子中,一个人搞定一个公司网络的情况居多,也就是说,不需要这么复杂的配置,我就是root用户登录puppet master然后执行mco命令就好了。所以下面的内容就是为了这个需求准备的。
官方的文档里,这部分执行了下面的命令:
-
mkdir -p ~/.mcollective.d/credentials
-
puppet certificate generate <NAME> --ssldir ~/.mcollective.d/credentials --ca-location remote --ca_server <CA PUPPET MASTER
-
puppet certificate find <NAME> --ssldir ~/.mcollective.d/credentials --ca-location remote --ca_server <CA PUPPET MASTER>
-
puppet certificate find mcollective-servers --ssldir ~/.mcollective.d/credentials --ca-location remote --ca_server <CA PUPPET MASTER>
-
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。模板如下,同时,也和上面一样,里面会讲一下各项配置的用途。
-
<% ssldir = '/var/lib/puppet/ssl' %> ## ssldir变量
-
connector = activemq ## connector plugin: activemq,下面的服务器,密码之类的不再复述
-
direct_addressing = 1
-
plugin.activemq.pool.size = 1
-
plugin.activemq.pool.1.host = <%= activemq_server %>
-
plugin.activemq.pool.1.port = 61614
-
plugin.activemq.pool.1.user = mcollective
-
plugin.activemq.pool.1.password = <%= mcollective_password %>
-
plugin.activemq.pool.1.ssl = 1
-
plugin.activemq.pool.1.ssl.ca = <%= ssldir %>/certs/ca.pem ## ca.pem,因为自己就是CA,所以可以直接使用
-
plugin.activemq.pool.1.ssl.cert = <%= ssldir %>/certs/puppet.liucy.org.pem ## 使用本机puppet master的证书和key
-
plugin.activemq.pool.1.ssl.key = <%= ssldir %>/private_keys/puppet.liucy.org.pem
-
plugin.activemq.pool.1.ssl.fallback = 0
-
-
securityprovider = ssl
-
plugin.ssl_server_public = <%= ssldir %>/certs/mcollective-servers.pem ## 共享server key,生成就是在本机,所以可以直接使用
-
plugin.ssl_client_private = <%= ssldir %>/private_keys/puppet.liucy.org.pem ## client key/certs直接使用本机Puppet Master的
-
plugin.ssl_client_public = <%= ssldir %>/certs/puppet.liucy.org.pem
-
-
default_discovery_method = mc
-
direct_addressing_threshold = 10
-
ttl = 60
-
color = 1
-
rpclimitmethod = first
-
-
collectives = mcollective
-
main_collective = mcollective
-
-
libdir = /usr/libexec/mcollective
-
helptemplatedir = /etc/mcollective
-
-
# Facts
-
factsource = yaml
-
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 淘宝:
阅读(2398) | 评论(0) | 转发(0) |