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/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分以内にスケジュールしたイベントが実行されるようになった。
サーバ側
- タイムアウト設定
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*
- サービスを再起動
/usr/sbin/spacewalk-service restart
- 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
クライアント側
- 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
- osadの再起動
/sbin/service osad restart
詳細については以下参照。 https://fedorahosted.org/spacewalk/wiki/JabberAndOSAD
Berkeley Database
Berkeley Databaseが何らかの理由でロックされると、ping応答はするが、スケジュールされたイベントに気付くことができなくなる。 そういった場合は一度jabberdを再起動することで /var/lib/jabberd/内の不要なファイルが削除される。