GUIな構成管理ツールRundeckをLDAPとZabbixと連携させる


この記事は【その1】ドリコム Advent Calendar 2015の15日目になります。

自己紹介

ID: hiracy とか y05_netと呼ばれたり自称してます。

インフラエンジニアやってます。

Rundeckとは?

ChefやAnsibleのような、サーバの構成を管理するツールです。
公式ページ:rundeck.org

構成管理ツールの特徴として以下の点が挙げられます

  • 管理しているサーバにシェルスクリプト・コマンド実行するというシンプルなものなので利用者はChefやAnsibleのようなDSLを勉強する必要なし
  • 非商用にも関わらず必要な機能が揃っているGUI、APIサーバ
  • スケジュール実行、GITで管理できる充実したタスク機能
  • 誰が何を実行したかの履歴が追える

本記事は認証管理にLDAPを採用し、且つZabbixの管理ノード情報と同期する実用的なRundeckサーバを構築する手順について書いてみました。

※尚、ページ頭の画像はRundeckページエラー時に表示される謎生物(たぶん犬)です

前提条件

  • Rundeckのバージョンは現時点で最新のv2.6.1です
  • CentOS6.7での手順なので別OSの場合はファイルパス、コマンドに差分が生じます
  • コマンドはrootユーザ又は特に追記してませんがsudoを付けて実行するものとします
  • []で囲まれた部分は自分の環境に適したものに置換して下さい
  • LDAPでユーザパスワード認証を利用できる環境
  • Mysql系(MariaDB,Percona)のインストール・起動(自分はMysql5.5使用)
  • Zabbixでノードを管理しており、Zabbix-APIが利用できる環境
  • ruby1.9.3以降が利用できる環境
  • 管理しているノードには秘密鍵でsshログインできるものとする

インストール

公式ページ通りの方法で問題ありません。以下はCentOS6.7の場合です。

yum install java-1.7.0-openjdk.x86_64
rpm -Uvh http://repo.rundeck.org/latest.rpm
yum install rundeck

データベース設定

RundeckはデフォルトではH2 DatabaseというファイルベースのDBを使いますが、パフォーマンスや冗長化、バックアップ等運用が捗るRDBのほうが良いでしょう。
RDBを利用する場合はRundeckの使用するデータベースとユーザの作成が必要となります。

mysql設定

mysql -uroot -p
create database rundeckdb default character set utf8;
grant all on *.* to 'rundeck'@'localhost' identified by 'rundeck';
grant all on *.* to 'rundeck'@'127.0.0.1' identified by 'rundeck';
flush privileges;

rundeck-config

/etc/rundeck/rundeck-config.properties
  :
grails.serverURL=http://localhost:4440
dataSource.dbCreate = update
- dataSource.url = jdbc:h2:file:/var/lib/rundeck/data/rundeckdb;MVCC=true;TRACE_LEVEL_FILE=4
+ dataSource.url = jdbc:mysql://localhost/rundeckdb?autoReconnect=true
+ dataSource.username = rundeck
+ dataSource.password = rundeck
  :

ログイン認証設定

こちらも公式ページ通りの設定で問題ありません。
尚、LDAP認証でなくファイルベースの認証はこちらを参照して下さい。

touch /etc/rundeck/jaas-ldap.conf
chmod 644 /etc/rundeck/jaas-ldap.conf
chown runback:runback /etc/rundeck/jaas-ldap.conf
/etc/rundeck/jaas-ldap.conf
ldap {
      com.dtolabs.rundeck.jetty.jaas.JettyCachingLdapLoginModule required
      debug="true"
      contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
      providerUrl="ldap://[LDAPサーバのアドレス]:[LDAPサーバのポート番号]"
      authenticationMethod="simple"
      forceBindingLogin="true"
      userBaseDn="[ユーザベースDN]"
      userRdnAttribute="uid"
      userIdAttribute="uid"
      userPasswordAttribute="userPassword"
      userObjectClass="person"
      roleBaseDn="[グループベースDN]"
      roleNameAttribute="cn"
      roleUsernameMemberAttribute="memberUid"
      roleMemberAttribute="memberUid"
      roleObjectClass="posixGroup"
      cacheDurationMillis="300000"
      reportStatistics="true";
};
  :
- export RDECK_JVM="-Djava.security.auth.login.config=/etc/rundeck/jaas-loginmodule.conf \
-        -Dloginmodule.name=RDpropertyfilelogin \
-        -Drdeck.config=/etc/rundeck \
-        -Drdeck.base=/var/lib/rundeck \
-        -Drundeck.server.configDir=/etc/rundeck \
-        -Dserver.datastore.path=/var/lib/rundeck/data \
-        -Drundeck.server.serverDir=/var/lib/rundeck \
-        -Drdeck.projects=/var/rundeck/projects \
-        -Drdeck.runlogs=/var/lib/rundeck/logs \
-        -Drundeck.config.location=/etc/rundeck/rundeck-config.properties \
-        -Djava.io.tmpdir=$RUNDECK_TEMPDIR"
+ export RDECK_JVM="-Djava.security.auth.login.config=/etc/rundeck/jaas-ldap.conf \
+         -Dloginmodule.name=ldap \
+         -Drdeck.config=/etc/rundeck \
+         -Drdeck.base=/var/lib/rundeck \
+         -Drundeck.server.configDir=/etc/rundeck \
+         -Dserver.datastore.path=/var/lib/rundeck/data \
+         -Drundeck.server.serverDir=/var/lib/rundeck \
+         -Drdeck.projects=/var/rundeck/projects \
+         -Drdeck.runlogs=/var/lib/rundeck/logs \
+         -Drundeck.config.location=/etc/rundeck/rundeck-config.properties \
+         -Djava.io.tmpdir=$RUNDECK_TEMPDIR"
  :

ACL設定

ホワイトリスト方式でのACLになるので、Rundeckにログインできるユーザグループを登録します。

/var/lib/rundeck/exp/webapp/WEB-INF/web.xml
        <security-role>
-                <role-name>user</role-name>
+                <role-name>[Rundeckログインユーザグループ]</role-name>
        </security-role>
/etc/rundeck/admin.aclpolicy
  :
context:
  project: '.*' # all projects
  :
-  group: admin
+  group: [Rundeckログインユーザグループ]
  :
description: Admin, all access.
context:
  application: 'rundeck'
  :
-  group: admin
+  group: [Rundeckログインユーザグループ]
  :

Rundeckサーバの起動と確認

service rundeckd start

http://[RundeckサーバのIPアドレス]:4440でアクセスします
※起動しない場合は/var/log/rundeck/service.log のエラーを見て下さい

プロジェクト初期化

Zabbixとの連携の前にプロジェクトの初期化が必要となります。

  • Rundeckにログインしてプロジェクトを作成します。

  • プロジェクト名を入力しResource Model Sourceを編集します

  • リソースファイルのフォーマットをresouceyaml、ファイルパスの拡張子をxmlからymlに変更します

  • 他の項目は後から変更できるので一旦最下部のCreateにてプロジェクトを作成します

Zabbix連携

zabbix連携にはzabbixapiのgemと下記のrubyスクリプトを使用します。

Gist:rundeck_zbx_node_update.rb

gem install zabbixapi
wget https://gist.githubusercontent.com/hiracy/81083f0e0b95fa23443b/raw/edb9f2d400a15349abc3bce85be78dfeda9a4c70/gistfile1.txt -O /usr/local/bin/rundeck_zbx_node_update.rb
chmod u+x /usr/local/bin/rundeck_zbx_node_update.rb

Zabbixに接続するための情報とRundeckのプロジェクト固有の情報を定義するファイルを作成します

mkdir -m 700 -p ~/.rundeck
touch ~/.rundeck/rundeck_zbx.yml
~/.rundeck/rundeck_zbx.yml
zabbix_url: [ZABBIX-APIエンドポイント]
zabbix_user: [ZABBIX-APIユーザ]
zabbix_password: [ZABBIX-APIユーザパスワード]
rundeck_ssh_port: [Rundeckサーバから各管理サーバにログインするためのsshポート]
rundeck_resource_path: /var/rundeck/projects/[上記作ったプロジェクト名]/etc/resources.yml

crontabにてこのスクリプトを定期的に実行するようにします

/etc/cron.d/rundeck
*/10 * * * * root PATH=$PATH:/usr/local/bin:/usr/bin;rundeck_zbx_node_update.rb /root/.rundeck/rundeck_zbx.yml

ユーザ秘密鍵とパスフレーズの登録

Rundeckから各サーバにsshで実行する際の秘密鍵を登録します。

  • ログイン後全体設定画面に遷移します

  • Key Storageを選択します

  • ユーザ毎のKey Storageのパス(keys/users/[ユーザ])を指定して「Add or Upload a Key」を選択します

  • Key Type: Private keyを選択し、秘密鍵をペースト又はファイルアップロードします。Nameには「default.pem」を入力し、Saveを選択します

  • 再度「Add or Upload a Key」を選択してから、今度はKey Type: Passwordを選択し、Enter testに秘密鍵のパスワード、Nameに「default.password」を入力し、Saveを選択します (※秘密鍵にパスフレーズが設定されている場合のみ)

実行の確認

  • Noedesタブから遷移しNodes:にZabbixに登録されているノード名を正規表現を入力しSearchを選択します

  • 検索結果が見つかったらActionsから「Run a command on * Node...」を選択します

  • Commandにて"hostname"のような対象に影響を与えないコマンドを入力し(※検索結果の全てのサーバにコマンドが実行されます)「Run on * Node」を選択します

最後に

最近RundeckにインスパイアされすぎてRund(o)ckというシンプルな構成管理ツールを作ってみたので興味の有る方は使って苦情言ったりプルリク投げて頂けると作者が泣いて喜ぶかと思われます。

明日は