Hinemos+Ansibleで、Hinemosエージェントインストールを自動化する

Jです。おつかれさまです。

Hinemosには、一括制御機能で、管理対象機器にHinemosエージェントをインストールすることが可能ですが、
Hinemosエージェントのインストール自動化を、Hinemosのジョブ+Ansibleで実現する方法を考えてみました。

Ansibleとは

Ansibleは、2012年にリリースされた、OSS構成管理ツールです。

  • プロビジョニング対象にモジュールを置く必要が無い
  • 構成を記述する定義ファイル(Playbook)を、YAMLという可読性が高い形式で記述できる

といった特徴があります。

Ansibleの詳細はこちら
http://www.ansible.com/home

利用した環境

仮想マシン3台
- サーバA:CentOS 6.4 (Hinemosマネージャ、Hinemosエージェント、Ansibleインストール済み)
- サーバB:CentOS 6.4
- サーバC:CentOS 6.4

事前準備

サーバAに、Hinemosマネージャ、Hinemosエージェント、Ansibleをインストールした上で、サーバAから、サーバB、サーバCに対しパスワード無しで
SSHログインできる様、以下の設定しました。

  1. サーバA(rootユーザ)の認証用公開鍵を作成
  2. サーバB(rootユーザ)、サーバC(rootユーザ)のauthorized_keysファイルに、1で作成した鍵を配置

なお、Hinemosマネージャの/opt/hinemos/sbin/に配置されている
一括制御機能用のスクリプト(hinemos_setup_collectiverun.sh)を使うと、この設定が簡単にできます。

Ansibleのhostsファイルの作成

Ansibleのプロビジョニング対象となる(Hinemosエージェントのインストール対象となる)
サーバB、サーバCを定義した"hosts"ファイルを、/etc/ansible/hostsに作成しました。

hosts

[managednode]
サーバBのIPアドレス
サーバCのIPアドレス
プレイブックの作成

以下処理を実行するプレイブック(agentinst.yml)を、/rootディレクトリ配下に作成しました。

  1. Hinemosエージェントのインストールパッケージダウンロード
  2. Hinemosエージェントパッケージの解凍
  3. Hinemosエージェントが必用とするrpmパッケージのインストール
  4. エージェントインストーラの実行

agentinst.yml

 - hosts: managednode
  remote_user: root
  tasks:
   - name: test connection
     ping:
     remote_user: root

   - name: download agent from sourceforge
     get_url: url=http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fhinemos%2F60378%2Fhinemos_agent-4.1.1_rhel5-rhel6.tar.gz dest=/root/hinemos_agent-4.1.1_rhel5-rhel6.tar.gz

   - name: decompress file
     command: tar zxvf /root/hinemos_agent-4.1.1_rhel5-rhel6.tar.gz

   - name: install rpm packages
     yum: name={{item}} state=installed
     with_items:
       - java-1.7.0-openjdk
       - net-snmp
       - net-snmp-libs
       - coreutils
       - shadow-utils
       - gawk
       - grep
       - sed
       - krb5-workstation
       - passwd
       - openssh
       - openssh-clients
       - expect

   - name: change into script directory and run script
     command: chdir=/root/Hinemos_Agent-4.1.1_rhel5-rhel6 ./agent_installer_JP.sh -i -m '{{managerip}}' -s
スクリプトの作成

プレイブックをラップする簡単なスクリプト(agentinst.sh)を/rootディレクトリ配下に作成しました。
環境変数 "ANSIBLE_HOSTS"に、/etc/ansible/hostsを指定した上で、
プレイブック(agentinst.yml)を実行し、引数$1を{{managerip}}に渡すだけの簡単なものです。

agentinst.sh

#!/bin/bash
export ANSIBLE_HOSTS=/etc/ansible/hosts
/usr/bin/ansible-playbook /root/agentinst.yml --extra-vars "managerip=$1"
ジョブの登録

以下コマンドを、サーバ上で実行するHinemosのジョブを作成しました。
なお、xxx.xxx.xxx.xxxはHinemosマネージャサーバ(サーバA)のIPアドレスです。
実効コマンドは、rootユーザで実行されるように、Hinemosのジョブを設定します。

実効コマンド

/root/agentinst.sh xxx.xxx.xxx.xxx 
実行結果

実行結果は、以下の様な形で、Hinemosクライアントから確認できます。

まとめ

マネージャのIPアドレスをジョブ変数で指定したり、AnsibleのhostsファイルをHinemosのジョブ+リポジトリに登録された
情報を使って、動的に生成するなど、まだまだ改善できるところは多々あるかと思いますが、
1時間程度で取り組める範囲で、Hinemos+Ansibleで、Hinemosエージェントインストールを自動化する方法について考えてみました。