Puppet統合Foreman(5):統合Mcollective


一、機能説明
  • Marionette Collective(MCollective)は、Puppetと密接な関係にあるサービス実行フレームワークです.
  • MC依存Ruby 1.9.3または1.8.7は、Stompプロトコルを介して通信するため、rubygem 1.2.2+
  • に依存する.
  • puppetクライアントにMcollectiveサービス端末
  • をインストールする.
  • puppetサービス側にMcollectiveクライアント
  • をインストールする.
  • puppetサービス側またはMQミドルウェア
  • を個別に取り付ける.
    公式文書を参照:https://docs.puppetlabs.com/mcollective/deploy/standard.html
    二、ActiveMQを取り付ける
    1.説明
    RabbitMQは、高度なメッセージキュープロトコル(AMQP)を実現するメッセージキューサービスである.RabbitMQはOTP(Open Telecom Platform,電気通信プラットフォームの開発)に基づいて構築され,Erlang言語とランタイム環境を用いて実現される.
    ActiveMQはApache出品で、最も流行しており、能力の強いオープンソースメッセージバスです.ActiveMQはJMS 1を完全にサポートするものである.1とJ 2 EE 1.4規範のJMS Provider実現
    個別にインストールする場合はホスト名、HOSTS、puppet認証を設定する必要があります.ここではpuppetサービス側にインストールします.
    2.インストール
    [root@puppet ~]# yum install -y tanukiwrapper activemq-info-provider
    [root@puppet ~]# yum install -y activemq

    ダウンロードが遅くて、何回失敗して、多く試みます
    3.構成
    構成を変更する前にバックアップし、サービスを開始してプロセスが実行されているかどうかを確認します.
    [root@puppet ~]# cp /etc/activemq/activemq.xml /etc/activemq/activemq.xml.bak
    [root@puppet ~]# vi /etc/activemq/activemq.xml
        
    #<>          ,   <persistenceAdapter>   
    <plugins>
         <simpleAuthenticationPlugin>
            <users>
                <authenticationUser username="admin" password="admin@123" groups="mcollective,admins,everyone"/>
                #  "mcollective"   mc     
                <authenticationUser username="mcollective" password="mcopwd123" groups="mcollective,everyone"/>       
            </users>
        </simpleAuthenticationPlugin>
        <authorizationPlugin>
            <map>
                <authorizationMap>
                    <authorizationEntries>
                        <authorizationEntry queue=">" write="admins" read="admins" admin="admins" />
                        <authorizationEntry topic=">" write="admins" read="admins" admin="admins" />
                        <authorizationEntry topic="mcollective.>" write="mcollective" read="mcollective" admin="mcollective" />
                        <authorizationEntry queue="mcollective.>" write="mcollective" read="mcollective" admin="mcollective" />
                        <authorizationEntry topic="ActiveMQ.Advisory.>" read="everyone" write="everyone" admin="everyone"/>
                     </authorizationEntries>
                 </authorizationMap>
             </map>
         </authorizationPlugin>
    </plugins>
    #        ,        (                     )
    <transportConnectors>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613"/>
    </transportConnectors>

         Reloading httpd: not reloading due to configuration syntax error
    自動的に生成されるhttpd構成はhttpd起動エラーを引き起こし、proxy構成が間違っているため、この構成を使わずにアクセスできます.
    [root@puppet ~]# mv /etc/httpd/conf.d/activemq-httpd.conf /etc/httpd/conf.d/activemq-httpd.conf.bak

    4.起動
    [root@puppet ~]# service activemq restart
    [root@puppet ~]# chkconfig activemq on
    [root@puppet ~]# netstat -tnlp |grep java
    tcp        0      0 :::61613                    :::*                        LISTEN      5644/java           
    tcp        0      0 :::47248                    :::*                        LISTEN      5644/java           
    tcp        0      0 :::8161                     :::*                        LISTEN      5644/java 
    [root@puppet ~]# tailf /var/log/activemq/activemq.log
    [root@puppet ~]# iptables -I INPUT -p tcp --dport 8161 -j ACCEPT
    [root@puppet ~]# iptables -I INPUT -p tcp --dport 61613 -j ACCEPT
    [root@puppet ~]# service iptables save

    5.アクセス
        http://IP:8161/admin/
    三、MCクライアントのインストール
    1.インストール
    puppetmasterサーバにインストールし、rootアカウントを使用してMC関連コマンドを実行し、puppetmasterの証明書を採用する
    MCクライアントはプロセスを開始する必要はありません
    [root@puppet ~]# yum -y install mcollective-*

    2.構成
    構成を変更する前に、構成ファイルをバックアップします.
    [root@puppet ~]# mv /etc/mcollective/client.cfg /etc/mcollective/client.cfg.bak

    ここではkeystoryを生成するため、ssl接続activemqは使用されません.jks証明書が失敗しました.解決します.
    [root@puppet ~]# vi /etc/mcollective/client.cfg
    main_collective = mcollective
    collectives = mcollective
    libdir = /usr/libexec/mcollective
    logfile = /var/log/mcollective.log
    loglevel = info
    daemonize = 1
    #Active MQ connector settings:
    connector = activemq
    direct_addressing = 1
    plugin.activemq.pool.size = 1
    #activemq     、  、    
    plugin.activemq.pool.1.host = puppetmaster.ewin.com
    plugin.activemq.pool.1.port = 61613
    plugin.activemq.pool.1.user = mcollective
    plugin.activemq.pool.1.password = mcopwd123
    #  ssl  activemq,  MC    puppet  
    #plugin.activemq.pool.1.ssl = 1
    #plugin.activemq.pool.1.ssl.ca = /var/lib/puppet/ssl/certs/ca.pem
    #plugin.activemq.pool.1.ssl.cert = /var/lib/puppet/ssl/certs/puppetmaster.ewin.com.pem
    #plugin.activemq.pool.1.ssl.key = /var/lib/puppet/ssl/private_keys/puppetmaster.ewin.com.pem
    #plugin.activemq.pool.1.ssl.fallback = 0
    #SSL seurity plugin settings        PSK:
    securityprovider = ssl
    plugin.ssl_server_public = /var/lib/puppet/ssl/certs/mcollective-servers.pem
    plugin.ssl_client_public = /var/lib/puppet/ssl/certs/puppetmaster.ewin.com.pem
    plugin.ssl_client_private = /var/lib/puppet/ssl/private_keys/puppetmaster.ewin.com.pem
    # Facts
    factsource = yaml
    plugin.yaml = /etc/mcollective/facts.yaml

        mcollective-servers.pem証明書は次のステップで生成されます.
    ファイル内のpuppetサーバホスト名を自分のものに変更します.
    :%s/puppetmaster.ewin.com/puppet.yourdomain.cn/g

    四、MCサービスをインストールする
    説明:puppetがある以上、MCサービス側を1台ずつインストールする必要はありません.ここにmcollectiveモジュールを書いてpuppet agentにプッシュします.
    I、Linuxシステム
    1、ディレクトリの作成
    puppet masterサーバでmcollectiveモジュールを作成するために必要なディレクトリ
    [root@puppet ~]# mkdir -p /etc/puppet/modules/mcollective/{manifests,templates,files}
    [root@puppet ~]# mkdir -p /etc/puppet/modules/mcollective/files/pem/clients

    2、クラスの作成
         
    [root@puppet ~]# vi /etc/puppet/modules/mcollective/manifests/init.pp
    class mcollective{
        #/etc/activemq/activemq.xml    mcollective     ,      erb   
        $activemq_server = "puppetmaster.ewin.com"
        $mcollective_password = "mcopwd123"
        
        package { ['mcollective','mcollective-puppet-agent','mcollective-service-agent']:
            ensure => installed,
        }
        service { 'mcollective':
            ensure  => running,
            enable  => true,
            require => Package['mcollective'],
        }
        #  SVN   ,    .svn  
        file { '/etc/mcollective':
            ensure  => directory,
            source  => 'puppet:///modules/mcollective/pem',
            ignore  => '.svn',
            owner   => root,
            group   => root,
            mode    => '0640',
            recurse => remote,
            notify  => Service['mcollective'],
        }
        file { '/etc/mcollective/server.cfg':
            ensure  => file,
            owner   => root,
            group   => root,
            mode    => 400,
            content => template("mcollective/server.cfg.erb"),
            notify  => Service['mcollective'],
        }
    }

    3、プロファイルテンプレートの作成
    [root@puppet ~]# vi /etc/puppet/modules/mcollective/templates/server.cfg.erb
    main_collective = mcollective
    collectives = mcollective
    libdir = /usr/libexec/mcollective
    logfile = /var/log/mcollective.log
    loglevel = info
    daemonize = 1
    connector = activemq
    direct_addressing = 1
    plugin.activemq.pool.size = 1
    plugin.activemq.pool.1.host = <%= @activemq_server %>
    plugin.activemq.pool.1.port = 61613
    plugin.activemq.pool.1.user = mcollective
    plugin.activemq.pool.1.password = <%= @mcollective_password %>
    securityprovider = ssl
    plugin.ssl_client_cert_dir = /etc/mcollective/clients
    plugin.ssl_server_private = /etc/mcollective/server_private.pem
    plugin.ssl_server_public = /etc/mcollective/server_public.pem
    #plugin.puppet.resource_allow_managed_resources = true
    #plugin.puppet.resource_type_whitelist = exec,file
    factsource = yaml
    plugin.yaml = /etc/mcollective/facts.yaml
    registerinterval = 600

    4、証明書の生成
    共有証明書が生成され、ノードに同期されます.
    [root@puppet ~]# puppet cert generate mcollective-servers
    Notice: mcollective-servers has a waiting certificate request
    Notice: Signed certificate request for mcollective-servers
    Notice: Removing file Puppet::SSL::CertificateRequest mcollective-servers at '/var/lib/puppet/ssl/ca/requests/mcollective-servers.pem'
    Notice: Removing file Puppet::SSL::CertificateRequest mcollective-servers at '/var/lib/puppet/ssl/certificate_requests/mcollective-servers.pem'
    [root@puppet ~]# cp /var/lib/puppet/ssl/private_keys/mcollective-servers.pem  /etc/puppet/modules/mcollective/files/pem/server_private.pem
    [root@puppet ~]# cp /var/lib/puppet/ssl/public_keys/mcollective-servers.pem  /etc/puppet/modules/mcollective/files/pem/server_public.pem
    [root@puppet ~]# chmod 644 /etc/puppet/modules/mcollective/files/pem/server_*

    MCクライアント証明書をノードに同期する
    [root@puppet ~]# cp /var/lib/puppet/ssl/certs/puppetmaster.ewin.com.pem  /etc/puppet/modules/mcollective/files/pem/clients/
    [root@puppet ~]# chmod 644 /etc/puppet/modules/mcollective/files/pem/clients/*

    5、ノード更新
    (1)、foremanがインストールされていない
    [root@puppet ~]# vi /etc/puppet/manifests/puppetagent.pp
    node "puppetagent.ewin.com" {
        include mcollective
    }
    [root@puppet ~]# vi /etc/puppet/manifests/site.pp
    import "puppetagent.pp"
    [root@puppet ~]# vi /etc/puppet/puppet.conf
    [agent]
    report = true
    server = puppetmaster.ewin.com

    ノード上のPuppet agentプロセスを閉じる必要があります.agentがマスターをアクティブに同期しない場合、masterでcrontabを設定して定期的にmco puppet runonceを実行する必要があります.
    [root@puppet ~]# service puppet stop
    [root@puppet ~]# chkconfig puppet off
    [root@puppet ~]# puppet agent -t

    (2)、foremanがインストールされている
    foremanが事前に配備されている場合は、foremanページ->構成->Puppetクラス-Puppetクラス-Puppet-Proxyからインポート->結合環境の選択->ホストでpuppetagentを編集->クラスラベルにmcollectiveモジュールを追加->ノードでpuppet agent-tを実行する
    Puppet整合Foreman(五):整合Mcollective_第1张图片
    Puppet整合Foreman(五):整合Mcollective_第2张图片
    Puppet整合Foreman(五):整合Mcollective_第3张图片
           
    [root@puppet ~]# service puppet stop
    [root@puppet ~]# chkconfig puppet off
    [root@puppet ~]# puppet agent -t

    II、Windowsシステム
    1、ソフトウェアの説明
    (1)、      ruby
    Windowsにはrubyをインストールしてmcollectiveを実行する必要があります
            http://rubyinstaller.org/
    rubyinstaller-1.9.3-p 551をダウンロードします.exe
    (2)、     mcollective
    mcollective自体には対応するwindowsサービス側インストールパッケージはありません
            http://repo.mornati.net/mcollective/
    ダウンロード2.3.2下のmcollective_2_3_2_Setup.exe
    batスクリプトインストールgemパッケージとインストールサービスを実行するにはrubyをインストールします.
    (3)、puppetプラグイン
            https://github.com/puppetlabs/mcollective-puppet-agent/releases
    1.7.1リリースでpuppet agentを正常にロードできない場合、プラグイン1.6.1は問題ありません.
            https://codeload.github.com/puppetlabs/mcollective-puppet-agent/zip/1.6.1/mcollective-puppet-agent-1.6.1.zip
    解凍後、中のファイルをc:mcollectivepluginsmcollectiveにコピーして貼り付け、置換時に置換に同意するよう求めます
    (4)、sslキー
    鍵ファイルはクライアントの次のパスにアップロードされます.
            c:\mcollective\etc\ssl\clients\puppetmaster.ewin.com.pem
            c:\mcollective\etc\ssl\server_private.pem
            c:\mcollective\etc\ssl\server_public.pem
    2、win-mcollectiveモジュール
    (1)、モジュールディレクトリ構造
    puppetのmoduleの下でwin-mcollectiveモジュールディレクトリを作成します.
         Puppet整合Foreman(五):整合Mcollective_第4张图片
    filesディレクトリの下に2つのプログラムが上図に表示されていません.
        mcollective_2_3_2_Setup.exe
        rubyinstaller-1.9.3-p551.exe
    (2)、      files
    ruby、mcollectiveプログラム、および解凍後のmcollective-puppet-agentプラグインをダウンロードします.
    puppetサービス側証明書ファイルをfilesの下の対応する場所に保存します.
    (3)、    manifests
            init.pp
    class win-mcollective{
         $activemq_server = "puppetmaster.ewin.com"
         $mcollective_password = "mcopwd123"
         $mcollective_path 	  = "C:\Program Files\mcollective"
         include win-mcollective::install,win-mcollective::config,win-mcollective::service 
    }

            install.pp
    class win-mcollective::install {
        if $operatingsystem == "windows" {
            $filepath   = "C:/Users/Administrator/Downloads"
            $installdir   = "C:/Program Files"
            Exec{ path => ["${installdir}/Ruby193/bin","C:/Windows/system32","${installdir}/Puppet Labs/Puppet/bin" ] }
            
            #  ruby
            file { 'ruby':
                path    => "${filepath}/rubyinstaller-1.9.3-p551.exe",
                ensure  => file,
                owner   => 'Administrator',
                mode    => '0755',
                group   => 'Administrators',
                source  => 'puppet:///modules/win-mcollective/rubyinstaller-1.9.3-p551.exe',
            }
            exec { 'ruby':
                command => 'cmd.exe /c Start "puppet-install" /w "C:/Users/Administrator/Downloads/rubyinstaller-1.9.3-p551.exe" /SILENT /DIR="C:/Program Files/Ruby193"',
                provider => 'windows',
                creates     => "${installdir}/Ruby193/bin/ruby.exe",
                require=> File['ruby'],
            }
        
            #  mcollective
            file { 'mcollective':
                path    => "${filepath}/mcollective_2_3_2_Setup.exe",
                ensure  => file,
                owner   => 'Administrator',
                mode    => '0755',
                group   => 'Administrators',
                source  => 'puppet:///modules/win-mcollective/mcollective_2_3_2_Setup.exe',
            }
            exec { 'mcollective':
                command  => 'cmd.exe /c Start "puppet-install" /w "C:/Users/Administrator/Downloads/mcollective_2_3_2_Setup.exe" /SILENT /DIR="C:/Program Files/mcollective"',
                provider => 'windows',
                creates  => "${installdir}/mcollective/bin/mco.bat",
                require  => File['mcollective'],
            }
            
            #   gem 
            exec { 'install_gems':
                command  => 'cmd.exe /c gem install -l -f "C:/Program Files/mcollective/gems/*.gem"',
                provider => 'windows',
                unless   => 'cmd.exe /c gem list --local | findstr win32-dir',
                require  => [Exec['ruby'],Exec['mcollective']],
            }
            #     
            exec { 'install_service':
                command  => 'cmd.exe /c C:/Progra~1/mcollective/bin/register_service.bat',
                provider => 'windows',
                unless   => 'cmd.exe /c net start | find "The Marionette Collective"',
                require  => Exec['install_gems'],
            }
            #puppet   aq      
            file { "${installdir}/mcollective/plugins/mcollective":
                ensure  => directory,
                ignore  => '.svn',
                source_permissions => ignore,
                source  => 'puppet:///modules/win-mcollective/mcollective-puppet-agent-1.6.1',
                recurse => true,
                require => Exec['mcollective'],
            }
            file { "${installdir}/mcollective/etc/ssl":
            ensure  => directory,
            ignore  => '.svn',
            source_permissions => ignore,
                    source  => 'puppet:///modules/win-mcollective/pem',
                    recurse => true,
            require => Exec['mcollective'],
            }
        }
    }

            config.pp   
    class win-mcollective::config {
        file { 'C:\\Progra~1\\mcollective\\etc\\server.cfg':
             ensure  => present,
             content => template("win-mcollective/server.cfg.erb"),
             notify  => Class['win-mcollective::service'],
             require => Class['win-mcollective::install'],
        }
    }

            service.pp
    class win-mcollective::service {
        service { 'mcollectived':
         ensure  => running,
         enable  => true,
         require => Class['win-mcollective::config'],
        }
    }

    (3)、    templates
            server.cfg.erb
    main_collective = mcollective
    collectives = mcollective
    libdir = <%= @mcollective_path %>\plugins;C:\Program Files\Puppet Labs\Puppet\puppet\lib;C:\Program Files\Puppet Labs\Puppet\facter\lib
    logfile = <%= @mcollective_path %>\mcollective.log
    loglevel = info
    daemonize = 1
    securityprovider = ssl
    plugin.ssl_client_cert_dir = <%= @mcollective_path %>\etc\ssl\clients
    plugin.ssl_server_private = <%= @mcollective_path %>\etc\ssl\server_private.pem
    plugin.ssl_server_public = <%= @mcollective_path %>\etc\ssl\server_public.pem
    connector = activemq
    plugin.activemq.pool.size = 1
    plugin.activemq.pool.1.host = <%= @activemq_server %>
    plugin.activemq.pool.1.port = 61613
    plugin.activemq.pool.1.user = mcollective
    plugin.activemq.pool.1.password = <%= @mcollective_password %>
    plugin.puppet.command = "C:\Program Files\Puppet Labs\Puppet\bin\puppet.bat" agent
    plugin.puppet.config = C:\ProgramData\PuppetLabs\puppet\etc\puppet.conf
    factsource = yaml
    plugin.yaml = <%= @mcollective_path %>\etc\facts.yaml

    小結:以上が完了するとMCOコマンドを使用できます.詳しくは次の文章を参照してください.
    五、Foremanの統合
    1、説明
    要件:Mcollective+ActiveMQの導入が完了し、mco puppet-v runonceコマンドが正常に実行されました.
    実装:foreman上でmcollectiveによってpuppet agentコマンドをトリガーする
    2、設定
    foremanページでpuppetrunをtrueに設定
    Puppet整合Foreman(五):整合Mcollective_第5张图片
    3、配置
    [root@puppet ~]# vi /etc/foreman-proxy/settings.d/puppet.yml
    :enabled: true
    :puppet_conf: /etc/puppet/puppet.conf
    :puppet_provider: mcollective
    [root@puppet ~]# chmod u+w /etc/sudoers.d/foreman-proxy
    [root@puppet ~]# vi /etc/sudoers.d/foreman-proxy
    foreman-proxy ALL = NOPASSWD : /usr/bin/puppet cert *, /usr/bin/mco puppet runonce *
    Defaults:foreman-proxy !requiretty

    サービスの再起動
    [root@puppet ~]# /etc/init.d/foreman-proxy restart

    4、計画
    前述したagentのpuppetサービスを閉じるには、計画を使用してmcoコマンドを実行し、同期を実行する必要があります.
    [root@puppet ~]# crontab -e
    SHELL=/bin/bash */1 * * * * /usr/bin/mco puppet runonce *

    テストの下で毎分コマンドを実行します.通常は30分ごとに*/30に変更
    [root@puppet ~]# service crond reload

    計画ログの表示
    [root@puppet ~]# tailf -n 3  /var/log/cron
    Apr 25 16:22:01 puppetmaster CROND[11613]: (root) CMD (/usr/bin/mco puppet runonce *)
    Apr 25 16:23:01 puppetmaster CROND[11713]: (root) CMD (/usr/bin/mco puppet runonce *)
    Apr 25 16:24:01 puppetmaster CROND[11823]: (root) CMD (/usr/bin/mco puppet runonce *)

    foremanレポートの表示
         Puppet整合Foreman(五):整合Mcollective_第6张图片
    5、テスト
    foremanページ-ホスト-実行の選択-puppetの実行:(ホストを選択しない場合、「実行の選択」ドロップダウン・メニューは表示されません)
    Puppet整合Foreman(五):整合Mcollective_第7张图片ログの表示
    [root@puppet ~]# tailf  /var/log/foreman-proxy/proxy.log
    10.188.1.53 - - [23/Apr/2015 16:19:19] "POST /run HTTP/1.1" 200 - 0.5008

    Debugモードをオンにし、より詳細な情報を表示し、エラーが発生した場合に使用します.
    [root@puppet ~]# vi /etc/foreman-proxy/settings.yml
    :log_level: DEBUG

     
    六、出会った間違い
    1、activemqが起動できない
        activemq not runnin
    [root@puppet ~]#

    Javaツールtanukiwrapperがインストールされていません
    2、ノード接続activemq失敗
    [root@puppetagent ~]# tailf /var/log/mcollective.log 
    I, [2015-04-23T14:21:44.337723 #11451]  INFO -- : activemq.rb:129:in `on_connectfail' TCP Connection to stomp://[email protected]:61613 failed on attempt 9

    puppetモジュールmcollectiveのクラス定義のactivemq_server値が書き間違えました
    3、mcoコマンドの実行に失敗した
         Puppet整合Foreman(五):整合Mcollective_第8张图片
       /etc/activemq/activemq.xmlおよび/etc/mcollective/client.cfgのユーザーパスワードは一致する必要があります
    4、PUPPETの実行に失敗したエラー
    (1)、ログの表示
    [root@puppet ~]# t

    これは、puppetmasterにpuppetモジュールを適用する、puppet.conf構成が消去されました
    WARN -- : Non-null exit code when executing '/usr/bin/sudo/usr/bin/mcopuppetrunonce-It-search01-55.ewin.com'

          http://www.pythian.com/blog/some-observations-of-puppetrun-with-foreman/
    (2)、puppetmasterの点検
    mcollective mcollective-commonがインストールされているかどうか
    foreman-proxyが正常に起動しているかどうか
    Activemqが正常に接続されているかどうか
    mco pingがクライアントを検出したかどうか
          mco puppet runonce -I agent.ewin.comが正常に実行されたかどうか
          mco inventory puppetagent.ewin.comがpuppetプラグインを正常にインストールしたかどうか
    (3)、puppetagentのチェック
    mcollective-puppet mcollective-clientインストールするかどうか
         /var/log/mcollective.logログにエラーメッセージがあるかどうかを確認する
    システム時間が正常かどうか