etckeeperを使ってみる

## 設定してみる

### インストール

- バージョン管理のシステムとしてgitをインストール

```
yum install git
```

- epelリポジトリからetckeeperをインストールします

```
yum install epel-release
yum install etckeeper --enablerepo=epel
```

### リポジトリの初期化

- gitリポジトリの作成、バックアップの開始

```
etckeeper init
```

実行結果が以下。
/etc/配下にgitリポジトリが作成されます

```
[root@localhost ~]# etckeeper init
Initialized empty Git repository in /etc/.git/
[root@localhost ~]# ls -al /etc/ | grep git
drwx------   7 root root      132 12月  8 20:44 .git
-rw-r--r--   1 root root      896 12月  8 20:44 .gitignore
```

- 最初のコミット

手動で最初のコミットをします。

```
etckeeper commit "[任意のコメント]"
```

実行結果が以下
これで現在のファイルがコミットされました。

```
[root@localhost ~]# etckeeper commit "1st commit"
 create mode 100644 yum/protected.d/systemd.conf
 create mode 100644 yum/vars/contentdir
 create mode 100644 yum/vars/infra
 create mode 100644 yum/version-groups.conf
 .....
```

### ログの確認

コミットログを確認します。
etckeeperは単独のコマンドがないので、 `etckeeper vcs [gitのコマンド]` を実行することで確認が出来ます。

```
etckeeper vcs log
```

実際に実行結果が以下。
`1st commit` がきちんとコミットされています。

```
[root@localhost ~]# etckeeper vcs log
commit c844247004a4308939178d536135628bb03031cc (HEAD -> master)
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:09:32 2020 +0900

    1st commit
```

### 実際に動くことを確認

- httpdをインストールしてみる

```
yum install httpd
```

- ログを確認する

上記と同様に `etckeeper vcs log` で確認します
httpdをインストールしたあとに自動でコミットされたものがlogとして表示されました。

```
[root@localhost ~]# etckeeper vcs log
commit 7699f77c60903a9b5bdcb5fe493c484db71ab9cb (HEAD -> master)
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:10:32 2020 +0900

    committing changes in /etc made by "/usr/bin/python /usr/bin/yum install httpd"
    
    Package changes:
    +0:apr-1.4.8-7.el7.x86_64
    +0:apr-util-1.5.2-6.el7.x86_64
    +0:httpd-2.4.6-97.el7.centos.x86_64
    +0:httpd-tools-2.4.6-97.el7.centos.x86_64
    +0:mailcap-2.1.41-2.el7.noarch

commit c844247004a4308939178d536135628bb03031cc
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:09:32 2020 +0900

    1st commit
```

### 設定を戻してみる

- 設定を行う

戻す設定を入れます。
テキトーにhostsに設定を入れます。

```
vi /etc/hosts
==========
追加
1.1.1.1 localhost.co.jp
==========
```

- commitする

ちゃんと1ファイルだけcommitされました！

```
etckeeper commit "hosts変更"
```

```
[root@localhost ~]# etckeeper commit "hosts変更"
[master e47ce4c] hosts変更
 1 file changed, 1 insertion(+)
```

- commit logを確認

```
etckeeper vcs log
```

`hosts変更` のcommitが登録されていました！

```
[root@localhost ~]# etckeeper vcs log
commit e47ce4c0db287540c4bf555c2970b6797d66062e (HEAD -> master)
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:13:30 2020 +0900

    hosts変更

commit 7699f77c60903a9b5bdcb5fe493c484db71ab9cb
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:10:32 2020 +0900

    committing changes in /etc made by "/usr/bin/python /usr/bin/yum install httpd"
    
    Package changes:
    +0:apr-1.4.8-7.el7.x86_64
    +0:apr-util-1.5.2-6.el7.x86_64
    +0:httpd-2.4.6-97.el7.centos.x86_64
    +0:httpd-tools-2.4.6-97.el7.centos.x86_64
    +0:mailcap-2.1.41-2.el7.noarch

commit c844247004a4308939178d536135628bb03031cc
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:09:32 2020 +0900

    1st commit
```

- 設定を戻す

以下が戻したいコミットです。
`commit e47ce4c0db287540c4bf555c2970b6797d66062e` を消して、
`commit 7699f77c60903a9b5bdcb5fe493c484db71ab9cb` の直後に戻ってくる、ということをします。


```
▼現在のコミットで消したいコミット
commit e47ce4c0db287540c4bf555c2970b6797d66062e (HEAD -> master)
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:13:30 2020 +0900

    hosts変更

▼このcommitがされた直後に戻ってくる
commit 7699f77c60903a9b5bdcb5fe493c484db71ab9cb
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:10:32 2020 +0900

    committing changes in /etc made by "/usr/bin/python /usr/bin/yum install httpd"
    
    Package changes:
    +0:apr-1.4.8-7.el7.x86_64
    +0:apr-util-1.5.2-6.el7.x86_64
    +0:httpd-2.4.6-97.el7.centos.x86_64
    +0:httpd-tools-2.4.6-97.el7.centos.x86_64
    +0:mailcap-2.1.41-2.el7.noarch
```

こちらでもgitのコマンドを利用して、 `etckeeper vcs revert [コミットID]` で戻します。
コミットIDは上でも書いたように、現在のコミットで消したいコミットの `e47ce4c0db287540c4bf555c2970b6797d66062e` になります。

```
etckeeper vcs revert e47ce4c0db287540c4bf555c2970b6797d66062e
```

コミットメッセージを追加してくださいと表示されましたが、そのままで良いので `:wq` で進みます。

```
Revert "hosts変更"

This reverts commit e47ce4c0db287540c4bf555c2970b6797d66062e.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
#       modified:   hosts
#
```

リバートされました。

```
[root@localhost ~]# etckeeper vcs revert e47ce4c0db287540c4bf555c2970b6797d66062e
[master 1f5eded] Revert "hosts変更"
 1 file changed, 1 deletion(-)
```

- commit logの確認

リバーとされたログが一番上に表示されています。
リバートもcommit logに残ります。

```
[root@localhost ~]# etckeeper vcs log
commit 1f5eded625f0d75f2c47fbfef1397e5549c68643 (HEAD -> master)
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:21:16 2020 +0900

    Revert "hosts変更"
    
    This reverts commit e47ce4c0db287540c4bf555c2970b6797d66062e.

commit e47ce4c0db287540c4bf555c2970b6797d66062e
Author: miyuki_samitani <miyuki_samitani@xxxx.com>
Date:   Tue Dec 8 21:13:30 2020 +0900

    hosts変更

```

- ファイルの確認(/etc/hosts)

確認のため、 設定変更したファイルを確認しました。
`1.1.1.1 localhost.co.jp` はきちんと消えています。

```
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# 
```

## 参考

- [CodeCommitとetckeeperで複数サーバの/etcを管理する](https://dev.classmethod.jp/articles/codecommit-etckeeper/)
- [CentOS 7で『etckeeper』とgitを用いて、/etcフォルダ配下の設定ファイルをバージョン管理する](https://orebibou.com/ja/home/201505/20150510_001/)
- [etckeeperを使ってみる](https://abyssluke.hatenablog.com/entry/2018/10/28/175424)
- [etckeeperをつかって/etcを管理してみる](https://www.kabegiwablog.com/entry/2018/03/26/090000)
- [CentOS 7でEtckeeperを使用してバージョン管理で/ etcを](https://www.codeflow.site/ja/article/how-to-manage-etc-with-version-control-using-etckeeper-on-centos-7)