CEoRを使って、管理下hostの設定をぶっこ抜く

## やりたいこと

簡単に言うと、管理しているホストの`/etc/`とか`/usr/local/etc/`の下にある設定ファイルを全部ぶっこ抜きたい！
そのような用途にはetckeeperなどもありますが………………

**そのためにパッケージ入れるのぉ？** 
とか
**`/usr/local/etc/`は？**
に対応するため、本稿では[CEoR](https://github.com/sheo0147/CEoR)で実装されている`getconf`を利用します。

## CEoRとは
[CEoR](https://github.com/sheo0147/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](https://github.com/sheo0147/CEoR)には、本稿で取得した設定を書き換えてリモートhostに反映させる`putconf`というscriptも存在します。

次回はこちらを紹介する予定......未定