やりたいこと
簡単に言うと、管理しているホストの/etc/
とか/usr/local/etc/
の下にある設定ファイルを全部ぶっこ抜きたい!
そのような用途にはetckeeperなどもありますが………………
そのためにパッケージ入れるのぉ?
とか
/usr/local/etc/
は?
に対応するため、本稿ではCEoRで実装されているgetconf
を利用します。
CEoRとは
CEoRは、ssh/scp などを利用し、望んだコマンドを対象ノードで実行させるための shell script です。(なお、激しくマイナーですwww)
作成の動機として以下のように書かれています。
Chef/Ansible/Fablicは、設定の自動化ツールとして広く知られている。
これらのツールは明示的にもしくは暗黙に、対象ノードがLinuxであることを仮定している。ツール単体はそうでなかったとしても、利用可能なライブラリーやモジュール、レシピがLinuxを仮定している。加えて、実行環境にrubyやPythonなど、システムの配布時点で存在を仮定できないツールの利用を要求する。
私の場合、FreeBSD/NetBSD, CentOS/Ubuntu等の様々なOSを管理しており、しばしば、対象ノードにPythonやRubyを導入できないことがある。このような状況において、上記制限は非常に厳しい。
そのため、POSIX shellやその他POSIXに定義されているコマンドで実行できるCEoRを実装した。
ここからもわかるように以下のような特徴を持っています
- リモート側に何かをインストール必要がない
- どうしても必要な一部コマンド以外はPOSIXに定義されているコマンドを利用
これによって、OSやディストリビューションに依存せずに構成管理を行うことが可能になり、以下のような弊害から逃れることができます。
- リモート側に
Python
が必須(Ansible) - コントロール側での動作が
bash
に依存(Fabric) - モジュール(or レシピ)が
bash
に依存(Ansible、Fabric)
また、同じLinux系でも標準shellの違い(bash:CentOS、dash:Ubunts)によりエラーを起こすモジュールもあります。
*BSDなどではそもそもbash
もpython
もインストールされていません。
前書きが長くなりましたが、そういう状況を緩和してくれそうなCEoR
を使用しています。
インストール
まずはCEoR
をGitHubから取得します。
$ git clone https://github.com/sheo0147/CEoR.git Path/To/CEoR
取得したCEoR
のディレクトリに移動して、インストールスクリプトを動作させます。
cd Path/To/CEoR
$ sudo sh bin/instceor.sh
$ sh bin/mkceordir.sh
- 以下のディレクトリが作成されていることをチェックしてください。
-
/usr/local/CEoR
:CEoRの本体が格納されています -
~/.CEoR
:ユーザ設定を格納します
-
サンプルレシピの実行
動作確認用のサンプルを実行してみます
$ /bin/sh /usr/local/CEoR/bin/ceor.sh -u UserName -h TargetHost concept.rcp
リモートホスト上でls -l
が実行されます。
リモートホストの環境設定(/etc、/usr/local/etc)を収集するための準備
さて、ここからが本番です。
まず、プロジェクトフォルダを作成します。
$ mkdir work
CEoRディレクトリの作成
$ cd work
$ sh /usr/local/CEoR/bin/mkceorprjdir.sh
カレントに./.CEoR
ディレクトリが作成されます。
サンプルスクリプトのコピー
github
から持ってきた本体のSampleScript
にある、getconf.sh
をコピーします。
$ cp Path/To/CEoR/SampleScript/getconfs.sh ./
このスクリプトでは、idempotence
というユーザが存在していることを仮定しています。
そこで、ここではユーザは~/.ssh/config
で指定することとしてユーザ指定を削除します。
/bin/sh /usr/local/CEoR/bin/ceor.sh -h $i -u idempotence getconf.rcp
↓
/bin/sh /usr/local/CEoR/bin/ceor.sh -h $i getconf.rcp
対象ホストに必ず存在するユーザがいる場合にはそちらに変更してもOKです。
取得した設定ファイルを保存するディレクトリを作成します。
$ mkdir NodeConfs
取得対象のホストのリストを作成します。
$ cat nodelist.sh
PROXY="PX01"
WEB="WEB01 WEB02"
ALL_TARGET="${PROXY} ${WEB}"
リモートホストの環境設定(/etc、/usr/local/etc)をぶっこ抜く
では、ぶっこ抜きましょう。www
$ sh ./getconfs.sh
::::: PX01 :::::
Exit request sent.
::::: WEB01 :::::
Exit request sent.
::::: WEB02 :::::
Exit request sent.
取得したものは、./NodeConfsに格納されます。
./NodeConfs
|
+ bakconfs/
| |
| + PX01-YYYYMMDDhhmmss.tgz
| + PX01-YYYYMMDDhhmmss/
| | |
| | + etc/
| | |
| | + web01のetc配下の設定ファイル
| |
| + PX01-YYYYMMDDhhmmss-info/
| .........
|
|
+ confs/
| + PX01@ --> 最新の設定ファイルDirへのlink
| + WEB01@ --> 最新の設定ファイルDirへのlink
| + WEB02@ --> 最新の設定ファイルDirへのlink
.........
次回の予告
CEoRには、本稿で取得した設定を書き換えてリモートhostに反映させるputconf
というscriptも存在します。
次回はこちらを紹介する予定......未定