みなさんあのね

エクセルいじりがお仕事のインフラ系SEのメモ

spacewalkの仕組み

はじめに

spacewalkは構成管理サーバ的なもので、パッチ当てをスケジュールしたり設定ファイルの配信が可能です。クラサバ間の通信にはXMPPを使ってるようです。 (もちろんAnsibleとの連携(Dynamic Inventory)もバッチリですよ!)
んで、この記事は以下の内部的な仕組みを解説した公式サイトを適当に解釈した結果をまとめてます。

OsadHowTo – spacewalk
https://fedorahosted.org/spacewalk/wiki/OsadHowTo

Jabberについては以下のサイトが参考になりました。

XMPP(Jabberプロトコル)技術メモ — ありえるえりあ http://dev.ariel-networks.com/column/tech/xmpp/view

構成

osad(クライアント)

Python製のクライアントサイドサービ ス。osa-dispatchaerからping応答およびrhn_checkコマンドを実行する。

osa-dispatcher(サーバ)

Python製のサーバサイドサービス。クライアント上で動作しているosadに向けてpingやrhn_check実行を命令する。

jabberd(クライアント/サーバ)

osadやosa-dispatcherはそれぞれの環境で動作するjabberd(XMPP(エックスエムピーピー、eXtensible Messaging and Presence Protocol)の実装)を介して通信を行う。サーバ-クライアント間の認証する。使用ポートは5222。

動作概要

osa-dispatcherはクライアントに対し定期的にpingを実行し、応答に遅延がないかを確認している。(ping応答はosadが動作しているクライアントからjabberdを介して行われる) ping応答を受け取ったosa-dispatcherは応答を返してきたクライアントを”online"状態としてマークする。ある程度以内に応答がなかった場合は”offline"状態としてマークする。

<通信概要図>
サーバ(osa-dispatcher<->jabberd)<->クライアント(jabberd<->osad)

osa-dispatcherはデータベース上で管理されている クライアントへの命令がないかを定期的に確認する。もし命令がある場合はjabber経由でosadにrhn_checkコマンドを実行するよう呼びかける。そこから命令を受けたosadはrhn_checkコマンドを実行することで処理を引き継ぐ。

RHN Proxyは上位で動作するjabberサーバに命令をフォワードする。

ファイル

osad

ソースコード

/usr/share/rhn/osad/

設定ファイル

  • /etc/sysconfig/rhn/osad.conf
  • /etc/sysconfig/rhn/up2date

実行ファイル

/usr/sbin/osad

ログファイル

/var/log/osad ※osad.confでlogレベルを引き上げないと何も出力されないので注意

osa-dispatcher

ソースコード

/usr/share/rhn/osad/

設定ファイル

/etc/rhn/rhn.conf ※"OSA Configuration"セクション

# grep osa /etc/rhn/rhn.conf
osa-dispatcher.jabber_server = yourspacewalk.example.org
osa-dispatcher.osa_ssl_cert = /var/www/html/pub/RHN-ORG-TRUSTED-SSL-CERT
osa-dispatcher.jabber_username = rhn-dispatcher-sat
osa-dispatcher.jabber_password = rhn-dispatcher-a44631

osa-dispatcher.debugでロギングレベルを設定することが可能

実行ファイル

/usr/sbin/osa-dispatcher

ログファイル

/var/log/rhn/osa-dispatcher.log

jabberd

コンポーネント

jabberを実行すると以下の6つのプログラムが起動する

  • /usr/bin/jabberd

  • /usr/bin/c2s(/etc/jabberd/c2s.xml
    クライアントとサーバ間の通信を制御する

  • /usr/bin/s2s(/etc/jabberd/s2s.xml
    他のjabberサーバとの通信を制御する

  • /usr/bin/sm(/etc/jabberd/sm.xml
    jabberコンポーネントjabber router間のセッションを管理する

  • /usr/bin/router(/etc/jabberd/router.xml
    どのコンポーネントにメッセージを連携すべきかを管理する

  • /usr/bin/resolver(/etc/jabberd/resolver.xml
    ホスト名を解決する。s2s向け。

暗号化

c2sとsmを通過した際に通信が暗号化されるよう構成されている。証明書および鍵は以下のファイルに記載されている。
/etc/jabberd/server.pem

ログファイル

基本的jabberdコンポーネントは以下のファイルにロギングされる。
/var/log/messages

組み込みデータベース

jabberはBerkeley databaseを使用している。
/var/lib/jabberd/

トラブルシューティング

名前解決

クライアントのhostsファイルにサーバのFQDNを予め設定しておくこと(jabberの仕様上必要)

ntp設定

osadの認証は時間に依存している。クライアントとサーバ間の時間の差が120秒以内である必要でなければ認証に失敗する。これはセキュリティを考慮した結果の仕様である。

ネットワークの問題

大抵の場合はFWのタイムアウトによって発生する。

  • FW等でosad用の通信を許可されていない場合
  • コネクションが切断されたがクライアントが再接続処理を行わない場合
  • netstat -an | grep 5222の実行結果が"ESTABLISHED"であってもサーバに接続できていない場合

基本的にはkeepaliveのため2分間隔でホワイトスペースのみのデータを送信しているので この仕様をベースに各種設定を少し修正するとよい。以下の設定を行うことで5分以内にスケジュールしたイベントが実行されるようになった。

サーバ側

  1. タイムアウト設定
sed -i 's/<interval>.*/<interval>120<\/interval>/' /etc/jabberd/*.xml*
sed -i 's/<keepalive>.*/<keepalive>120<\/keepalive>/' /etc/jabberd/*.xml*
sed -i 's/<idle>.*/<idle>200<\/idle>/' /etc/jabberd/*.xml*
  1. サービスを再起動
/usr/sbin/spacewalk-service restart
  1. cronによるjabber DB関連の初期化設定
SAMPLE
# Restart jabber everyday @6am
00 06 * * * /sbin/service jabberd stop ; /sbin/service osa-dispatcher stop ; rm -Rf /var/lib/jabberd/db/* ; /sbin/service jabberd start ; /sbin/service osa-dispatcher start

手動実行する場合。

/sbin/service jabberd stop ; /sbin/service osa-dispatcher stop ; rm -Rf /var/lib/jabberd/db/* ; /sbin/service jabberd start ; /sbin/service osa-dispatcher start

クライアント側

  1. cronによるosad再起動&rhn_check実行設定 rhnsdをオフにする。
SAMPLE
# Check in with spacewalk and restart osad every ~4 hours
0 */3 * * * sleep `expr ${RANDOM:0:4} / 2` ; /sbin/service osad restart ; /usr/sbin/rhn_check ; /usr/sbin/rhn-profile-sync
  1. osadの再起動
/sbin/service osad restart

詳細については以下参照。 https://fedorahosted.org/spacewalk/wiki/JabberAndOSAD

Berkeley Database

Berkeley Databaseが何らかの理由でロックされると、ping応答はするが、スケジュールされたイベントに気付くことができなくなる。 そういった場合は一度jabberdを再起動することで /var/lib/jabberd/内の不要なファイルが削除される。