Mcollective (draft)

Mcollective는 무엇인가?

https://puppetlabs.com/mcollective

The Marionette Collective AKA MCollective is a framework to build server orchestration or parallel job execution systems. Primarily we’ll use it as a means of programmatic execution of Systems Administration actions on clusters of servers. In this regard we operate in the same space as tools like Func, Fabric or Capistrano. We’ve attempted to think out of the box a bit designing this system by not relying on central inventories and tools like SSH, we’re not simply a fancy SSH “for loop.”

MCollective use modern tools like Publish Subscribe Middleware and modern philosophies like real time discovery of network resources using meta data and not hostnames. Delivering a very scalable and very fast parallel execution environment. To get an immediate feel for what I am on about you can look at some of the videos on the Screencasts page and then keep reading below for further info and links. We’ve also created an Amazon EC2 based demo where you can launch as many instances as you want to see how it behaves first hand.


서 버 orchestration (command & control) 또는 병렬 job 실행 시스템임. Func, Fabric 또는 Capistrano 와 비슷한 프로그램으로 Publish Subscribe 미들웨어 기술을 이용하여 확장성 및 성능을 높이고 있습니다.

vagrant demo

vagrant 로 Mcollective 데모를 할 수 있다.

https://docs.puppetlabs.com/mcollective/deploy/demo.html

이 사이트에 가면 https://github.com/ripienaar/mcollective-vagrant 로 링크가 되어 있다.

사전에 virtualbox, vagrant 설치를 하고 난 후 vagrant 에서 mcollective 이미지를 다운받아 실행하면 된다.

OS는 CentOS 6.3 x86_64 이며 ruby는 1.8.7 이 설치가 되어 있다.

middleware 는 redis 를 이용하고 있다.


아래는 vagrant 로 설치를 했을 때 기본 사용가능한 mcollective client 예제이다.

mco 의 경우 mcollective 클라이언트에만 설치를 하면 되지만 지금의 demo에서는 middleware 를 포함 모든 노드에 설치를 하고 있다.

실제 구현을 할 때는 mcollective 클라이언트는 꼭 필요한 곳에만 설치를 해야 한다. 안 그러면 mcollective 클라이언트가 설치된 곳에서 각종 작업을 할 수 있는 위험이 있다.

$ vagrant ssh middleware
[vagrant@middleware ~]$ mco ping
middleware.example.net                   time=8.88 ms
node1.example.net                        time=18.17 ms
node2.example.net                        time=18.58 ms
node4.example.net                        time=19.04 ms
node3.example.net                        time=19.17 ms
node0.example.net                        time=44.93 ms
---- ping statistics ----
6 replies max: 44.93 min: 8.88 avg: 21.46 
$ mco inventory middleware.example.net
$ mco service status nrpe
$ mco service restart nrpe
$ mco package status mcollective
$ mco service status mcollective
$ mco nrpe check_load
$ mco process list ruby
$ mco urltest http://www.devco.net/


Learning Mcollective 책의 내용을 이용하여 제작한 Puppet module

https://github.com/jorhett/puppet-mcollective 모듈을 fork 하여 https://github.com/taejoonmoon/puppet-mcollective 에 모듈을 만들었음.

vagrant 에서 테스팅을 할 경우는 아래와 같이 하면 https://github.com/taejoonmoon/puppet-mcollective 모듈을 이용하여 설치를 함. 기본은 activemq로 되어 있음

$ git clone https://github.com/taejoonmoon/mcollective-test
$ cd vagrant/
$ vagrant up
$ vagrant ssh node0.example.net
$ mco ping

ActiveMQ 이용하여 mcollective 설정하기

  • https://github.com/taejoonmoon/puppet-mcollective 모듈을 이용할 경우 작업해야 할 부분임. activemq 기준임
  • SSL middleware security (Learning Mcollective 127 page)
    • 노드에서 브로커에 접속할 수 있는지, 암호화된 통신을 하는지를 제어함.

    • 현재는 Anonymous TLS 가 아닌 CA-Verified TLS 설정을 하여 암호화된 user/password + Cerfiticate 체크를 함께 하도록 구성을 하였음.

    • CA는 따로 구성하지 않고 Puppet CA를 이용함.

    • CA-Verified TLS Clients 세팅하기 P140

    • Create a Puppet keypair on the client node : mcollective client 를 설치한 해당 user로 명령어 실행함. 아래에서는 mcollective client 에서 Puppet CA를 이용하여 vagrant user 의 인증서를 요청함

      $ puppet agent --certname vagrant --server node0.example.net --test
    • Puppet CA 에서 해당 user 에 대해서 sign을 함. (Puppet CA 서버에서 인증을 해야 함)

      # puppet cert sign vagrant (puppet CA 서버)
    • Puppet CA 서버에서 /var/lib/puppet/ssl/ca/signed/vagrant.pem 파일을 mcollect client 를 설치한 서버의 /home/vagrant/.puppet/ssl/certs 로 자동 복사를 함. PuppetCA서버에서 해당 파일을 수동으로 복사할 필요는 없음

      $ cd /home/vagrant/.puppet/ssl
      [vagrant@node0 ~]$ tree .puppet/ssl/
      .
      ├── certs
      │   ├── ca.pem
      │   └── vagrant.pem
      ├── private_keys
      │   └── vagrant.pem
      └── public_keys
          └── vagrant.pem
  • mcollective security ((Learning Mcollective 153 page)
    • Pre-Shared key authentication 은 사용하지 않고 SSL Authentication을 사용함. data 와 SSL-signed hash 가 TLS를 통해 암호화되어 통신을 하도록 구성을 함.

    • 아래에서는 SSL Authentication 설정하는 방법입니다.

    • p154 openssl로 private.pem, public.pem 만들어서 아래 puppet module 에 두면 mcollective 서버의 /etc/mcollective/ssl/server/ 에 복사를 함. 초기에 한번만 하면 됨.

      # openssl genrsa -out private.pem 2048
      # openssl rsa -in private.pem -out public.pem -outform PEM -pubout
      copy private.pem, public.pem to /etc/puppet/modules/mcollective/files/ssl/server/
      
      
    • Client 설정을 위해서는 client key 에 대한 디렉토리 설정을 client user 의 .mcollective.d 에 함. mcollective/manifests/userconfig.pp 를 통해서 자동으로 설정을 하며 수동으로 하지 않아도 됩니다.

      [vagrant@node0 ~]$ tree .mcollective.d/
      .
      ├── certs
      │   └── ca.pem -> /home/vagrant/.puppet/ssl/certs/ca.pem
      ├── private_keys
      │   └── vagrant.pem -> /home/vagrant/.puppet/ssl/private_keys/vagrant.pem
      └── public_keys
          └── vagrant.pem -> /home/vagrant/.puppet/ssl/public_keys/vagrant.pem
    • client user 의 public_key 는 mcollective 서버의 /etc/mcollective/ssl/clients에 배포가 되어야 하며 puppet 모듈의 /etc/puppet/modules/mcollective/files/ssl/clients/ 디렉토리에 복사를 하면 배포를 할 수 있음.

      $ sudo cp ~vagrant/.puppet/ssl/public_keys/vagrant.pem /etc/puppet/modules/mcollective/files/ssl/clients/
    • modules/profiles/manifests/mcollective_client.pp 에 해당 user 를 추가해 주면 해당 user 의 home directory 에 .mcollective 파일이 생깁니다. 이제 해당 user 로 mco ping 등 명령어를 테스팅 해 보면 됩니다.

      $ less /etc/puppet/modules/profiles/manifests/mcollective_client.pp 
        mcollective::userconfig { 'vagrant':
          logger_type => 'syslog',
          #logger_type => 'file',
          #log_level => 'debug',
        }     
    • 이렇게 구성을 한 경우 다음과 같이 설정이 됩니다.
      • 모든 server는 동일한 public, private key를 가짐

      • 모든 server는 모든 client 의 public key를 가짐

      • 모든 client 는 서버의 공유 public ey를 가짐.

RabbitMQ 이용하여 mcollective 구성하기

  • RabbitMQ 설치 : http://www.rabbitmq.com/install-rpm.html / Mcollective (draft) 정보를 이용하여 설치함. erlang 설치, RabbitMQ 설치
    • STOMP connector 와 management plugins 를 활성화하고 rabbitmq를 시작함. 새로 설치한 RabbitMQ 브로커ㅠ에서 CLI 툴을 다운로드 받아 설치함. rabbitmqadmin 에 대한 bash completion 기능을 활성화하고 있음.

      rabbitmq-plugins enable rabbitmq_stomp
      rabbitmq-plugins enable rabbitmq_management
      /etc/init.d/rabbitmq-server start
      /etc/init.d/rabbitmq-server status
      curl -sS http://localhost:15672/cli/rabbitmqadmin -o rabbitmqadmin 
      chmod 755 rabbitmqadmin 
      mv rabbitmqadmin /usr/local/sbin/
      rabbitmqadmin --bash-completion | tee /etc/bash_completion.d/rabbitmqadmin
    • Puppet module 에서 RabbitMQ 설정하기

      • /etc/puppet/hieradata/common.yaml 에서 rabbitmq에 대한 설정을 함. 
        # rabbitmq
        mcollective::connector         : 'rabbitmq'
        mcollective::connector_ssl     : false
        mcollective::connector_ssl_type: 'anonymous'
        mcollective::security_provider : 'psk'
        
        /etc/puppet/manifests/site.pp 에서 middleware 설정할 노드에 profiles::activemq 대신 profiles::rabbitmq를 이용하도록 설정함.
        node 'node0.example.net' inherits default {
          #include profiles::activemq
          include profiles::rabbitmq
          include profiles::mcollective_client
        }
    • Mcollective를 위한 큐, 토픽 설정하기
      • password은 Mcollectve 에서 사용하기로 한 비밀번호와 동일하게 맞추어야 함.

        rabbitmqadmin declare vhost name=/mcollective
        rabbitmqadmin declare user name=client tags=administrator password=Client Password
        rabbitmqadmin declare permission vhost=/mcollective user=client configure='.*' write='.*' read='.*'
        rabbitmqadmin declare user name=server tags= password=Server Password
        rabbitmqadmin declare permission vhost=/mcollective user=server configure='.*' write='.*' read='.*'
        rabbitmqadmin declare exchange --user=client --password=Client Password --vhost=/mcollective name=mcollective_broadcast type=topic
        rabbitmqadmin declare exchange --user=client --password=Client Password --vhost=/mcollective name=mcollective_directed type=direct

CLI 및 Plugin

mcollective plugins : http://projects.puppetlabs.com/projects/mcollective-plugins/wiki  / https://github.com/search?utf8=%E2%9C%93&q=mcollective

CLI 예제

mco cli 예제 : http://docs.puppetlabs.com/mcollective/reference/basic/basic_cli_usage.html

$ mco facts fqdn
$ mco inventory middleware.example.net

$ mco package status puppet

$ mco service status httpd

$ mco find --with-agent puppet
$ mco puppet status
$ mco puppet count
$ mco puppet runonce
$ mco puppet runonce --noop
$ mco puppet runonce --environment development
$ mco find -S "resource().total_time>50"
$ mco puppet runall 10
  
$ mco rpc filemgr status file=/etc/puppet/puppet.conf

$ mco nrpe check_load

별도 설치 필요
$ mco process list ruby 
$ mco urltest http://www.devco.net/

Shell agent

Agent , Client 플러그인 설치 관련해서는 아래 url 을 참고한다.

http://projects.puppetlabs.com/projects/mcollective-plugins/wiki/InstalingPlugins

아래 shell agent 는 "Learning Mcollective"  의 p48 을 참고하여 작업을 했다.


각 node 에서는 mcollective server 가 떠 있어야 한다.

mco 명령을 실행하는 것은 mcollective client 이다.

그러므로 별도의 Agent 와 Client 플러그인을 설치할 수 있는데 각 node 에는 agent 를, mcollective client(mco를 실행하는 컴퓨터) 에는 client 프로그램을 설치하면 된다.

mcollective 를 통하여 shell 명령어를 실행할 수도 있다.

https://github.com/puppetlabs/mcollective-shell-agent : Ruby 1.9 을 필요로 하기 때문에  vagrant demo 에서는 실행이 안된다.

"Learning Mcollective" 책의 p54를 보면 https://github.com/cegeka/mcollective-shell-agent 를 소개하고 있다.

github 에서 소스를 가져와서 rpm 패키지를 만들어서 설치할 수가 있다.

middleware 에서 작업한다고 가정을 하겠다.

[vagrant@middleware ~]$ sudo yum install rpm-build git
[vagrant@middleware ~]$ git clone https://github.com/cegeka/mcollective-shell-agent
[vagrant@middleware ~]$ cd mcollective-shell-agent/
[vagrant@middleware mcollective-shell-agent]$ mco plugin package .
Building packages for mcollective-shell-command plugin.
Completed building all packages for mcollective-shell-command plugin.
[vagrant@middleware mcollective-shell-agent]$ ls *.rpm
mcollective-shell-command-1.0-1.el6.src.rpm           mcollective-shell-command-client-1.0-1.el6.noarch.rpm
mcollective-shell-command-agent-1.0-1.el6.noarch.rpm  mcollective-shell-command-common-1.0-1.el6.noarch.rpm
[vagrant@middleware mcollective-shell-agent]$ rpm -qpl mcollective-shell-command-common-1.0-1.el6.noarch.rpm 
/usr/libexec/mcollective/mcollective/agent/shell.ddl
[vagrant@middleware mcollective-shell-agent]$ rpm -qpl mcollective-shell-command-client-1.0-1.el6.noarch.rpm 
/usr/libexec/mcollective/mcollective/application/shell.rb
[vagrant@middleware mcollective-shell-agent]$ rpm -qpl mcollective-shell-command-agent-1.0-1.el6.noarch.rpm 
/usr/libexec/mcollective/mcollective/agent/shell.rb

Mcollective 플러그인은 libdir/mcollective 디렉토리 밑에 설치가 된다. agent plugin 은 agent 디렉토리 밑에, client 프로그램은 application 디렉토리에 밑에 설치가 된다.

위 에서 생성한 rpm 중 mcollective-shell-command-common 은 middleware, node 에 모두 설치하고 mcollective-shell-command-agent 는 node 에 설치, mcollective-shell-command-client 는 middleware 에 설치를 하면 된다. 아래의 예에서는 shell agent 를 middleware 와 node0에만 설치를 한 경우이다.

[vagrant@middleware ~]$ mco shell hostname
Do you really want to send this command unfiltered? (y/n): y
Discovering hosts using the redis method .... 2
====================================================================================
Host: middleware.example.net
Exitcode: 0
====================================================================================
Output:
middleware.example.net
====================================================================================
====================================================================================
Host: node0.example.net
Exitcode: 0
====================================================================================
Output:
node0.example.net
====================================================================================

Puppetlabs 참고자료

https://puppetlabs.com/mcollective

Mcollective 배포

ActiveMQ


참고자료

  • Learning Mcollective 서적 : mcollective 설치, 사용법, middleware 설정하기, 커스텀 플러그인 만들기 등의 내용이 들어가 있음. 대규모 글로벌한 환경에서 middleware 를 어떻게 설정하는지에 대해서도 담고 있음. 그런데 미들웨어에 대한 설명은 ActiveMQ로 되어 있으며 RabbitMQ는 간단한 설정 하는 방법만 있음.
  • mcollective 사이트