序章

Linuxエコシステムでは、ソフトウェアを定期的にインストール、保守、およびアップグレードする必要があります。 ただし、ローカル構成ファイルに加えられた変更を追跡する必要があります。 変更を加える前に構成ファイルのコピーを作成するという古いスタンバイとは対照的に、etckeeperを使用すると、ソフトウェア開発プロジェクトの場合と同じように、Git、Mercurial、Bazaar、またはDarcsリポジトリを使用して変更を追跡できます。

さらに、etckeeperはyumとシームレスに統合され、パッケージのアップグレード時に/etcディレクトリのコンテンツに加えられた変更を自動的にコミットします。 これにより、必要に応じて、または必要に応じて、構成ファイルの以前のバージョンに戻すことができます。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • sudo非rootユーザーを含む1つのCentOS7ドロップレット。これは、このチュートリアルのステップ1から4に従ってセットアップできます。

etckeeperは、ファイルのアクセス許可、メタデータ、および変更のみを追跡します。 ファイルの復元を実行するためのすぐに使用できるツールは提供されていないため、リビジョン管理システムの基本を理解する必要があります。

この記事では、etckeeperが使用するデフォルトのVCSであるGitを使用します。 Gitとバージョン管理に関する記憶を更新したい場合は、このチュートリアルシリーズを確認してください。 このガイドではGitを直接使用しませんが、etckeeperを介してGit固有のコマンドを実行できます。

ステップ1—etckeeperのインストール

このステップでは、etckeeperをインストールします。

まず、CentOS 7サーバーでEPEL(Enterprise Linux用の追加パッケージ)を有効にする必要があります。これは、etckeeperを含むリポジトリであるためです。

sudo yum update && sudo yum install epel-release

次に、etckeeperをインストールします。

sudo yum update && sudo yum install etckeeper

GitにはデフォルトでCentOS7が付属しているため、インストールする必要はありません。

ステップ2—etckeeperの構成をカスタマイズする

etckeeperをインストールしたら、次のステップは/etc/etckeeper/etckeeper.conf構成ファイルを更新することです。

まず、Nanoまたはお気に入りのテキストエディタで構成ファイルを開きます。

sudo nano /etc/etckeeper/etckeeper.conf

以下は、etckeeperが正しく機能するために構成する必要のある重要な変数です。 残りの設定はコメントアウトしたままにしておいてください。

まず、コメント# The VCS to use.の下で、VCS="git"のコメントが解除されていることを確認します(つまり、 行頭に#はありません)。 gitはCentOS7のetckeeperインストールで使用されるデフォルトのVCSであるため、デフォルトでは、このオプションはすでにコメント解除されています。

etckeeperが1日に1回自動的に変更をコミットしないようにする場合は、AVOID_DAILY_AUTOCOMMITS=1のコメントが解除されていることを確認してください。 これを設定するかどうかを決定するには、システム構成ファイルが頻繁に変更されるかどうかを検討する必要があります(例: テスト環境は毎日変わることがよくあります)。 もしそうなら、あなたはその行をコメントアウトする必要があります。 それ以外の場合は、コメントを残すことができます。

/etcにコミットされていない変更がある場合に、yum installを中止する場合は、必ずAVOID_COMMIT_BEFORE_INSTALL=1のコメントを解除してください。 これには、yumを使用してパッケージをインストールする前に手動でコミットする必要があります。 それ以外の場合は、コメントアウトしたままにしておくと、yumはインストールを実行する前に更新されたファイルを自動的にコミットします。 この選択は完全にあなた次第です。 それはあなたの環境と変化の量に大きく依存します。 これは前の例とよく似ていますが、今回はパッケージをインストールする頻度に依存する点が異なります。

オプションの更新が完了したら、ファイルを保存して閉じます。

ステップ3—Gitリポジトリを初期化する

このステップでは、/etcでGitリポジトリを初期化します。

まず、/etcディレクトリに移動します。

cd /etc

次に、次のコマンドを実行してリポジトリを初期化します。

sudo etckeeper init

次のメッセージが表示されます。

Initialized empty Git repository in /etc/.git/

これで、.gitディレクトリと/etc内の.gitignoreファイルが表示されます。 たとえば、次のコマンドを実行した場合:

ls -la /etc | grep git

次の行が出力に含まれているはずです。

drwx------.  7 root     root       4096 Apr  2 21:42 .git
-rw-r--r--.  1 root     root        874 Apr  2 21:42 .gitignore

.gitは、ローカルシステムで保護する必要があります(したがって、スーパーユーザーのみの読み取り、書き込み、および実行のアクセス許可)。 バージョン管理システムはそれ自体でファイルのアクセス許可を追跡しないため、etckeeperは代わりにこの機能を提供します。

.gitディレクトリには、Git自体の使用を目的としたいくつかの構成ファイルと説明ファイルおよびその他のサブディレクトリが含まれています。 .gitignoreファイルは、gitが無視する必要のある明示的に追跡されていないファイルを指定し、etckeeper全体で管理することを目的としています。 1つの例外を除いて、手動で編集することはお勧めできません。

バージョン管理を使用して追跡したくない特定のファイルがある場合は、それらを手動で.gitignoreファイルに追加できます。 ファイルの追跡を停止するには、まず.gitignoreを開いて編集します。

sudo nano .gitignore

ファイルの最後の行は# end section managed by etckeeperになります。 無視するファイルのファイル名を、このファイルの上に1行に1つずつ追加します。

file_to_ignore
another_file_to_ignore
# end section managed by etckeeper

次に、ファイルを保存して閉じます。

さらに、以前にローカルリポジトリを初期化したため、現在gitによって管理されているキャッシュからこれらのファイルを削除する必要があります。

etckeeper vcs rm --cached file_to_ignore

以前に.gitignoreに追加した数のファイルに対して、上記のコマンドを繰り返します。

ステップ4—/etcをGitリポジトリにコミットする

このステップでは、最初の/etcをコミットします。

最初のコミットを追加するのは簡単です。 次のコマンドを入力するだけです。 厳密には必要ではありませんが、後で簡単に識別できるように、各コミットに説明を追加する必要があります。

sudo etckeeper commit "First commit of my /etc directory"

次に、以下のように、リポジトリにコミットされているファイルの出力リストが表示されます(切り捨てられています)。

create mode 100644 selinux/targeted/modules/active/modules/dnsmasq.pp
create mode 100644 selinux/targeted/modules/active/modules/dnssec.pp
create mode 100644 selinux/targeted/modules/active/modules/docker.pp
create mode 100644 selinux/targeted/modules/active/modules/dovecot.pp

ステップ5—変更を加える

このステップでは、/etcのファイルにいくつかの変更を加えてコミットします。 次のステップでは、これらの変更を元に戻します。

まず、選択したファイルの内容を変更します。 たとえば、/etc/hostsの最後にIPアドレスとそれに関連付けられたホスト名で構成される行を追加することにより、ローカルの名前解決に新しいホストを追加できます。

まず、ファイルを開きます。

sudo nano /etc/hosts

次に、ファイルの最後に次の行を追加します。

192.168.0.2    node01

ファイルを保存して閉じます。 それでは、この変更をコミットしましょう。

sudo etckeeper commit "Added a line to the hosts file"

最後に、ファイルの権限を変更します。

sudo chmod 640 /etc/hosts

そして、その所有権を変更します( sammy を自分のユーザー名に置き換えてください)。

sudo chown sammy:sammy /etc/hosts

/etc/hostsの現在の権限と所有権を確認できます。

ls -l /etc/hosts

出力は次のようになります。

-rw-r----- 1 sammy sammy 675 Apr 17 15:01 /etc/hosts

ステップ6—変更を元に戻す

それでは、etckeeperの復元機能をテストしてみましょう。ファイルとその内容だけでなく、そのアクセス許可と所有権もテストします。

まず、これまでに行ったコミットをリストします。

sudo git log --pretty=oneline

出力の最初の列は、コミットを一意に識別するSHA-1ハッシュです。 2つ目は、以前に変更を送信したときに使用した説明です。

出力はこれに似ていますが、ハッシュが異なります。

d0958fbe4d947a6a3ad98141f9fe89d1fd1a95c4 Added a line to the hosts file
76c193da740a3e137fa000773a79de8bb5c898b7 First commit of my /etc directory

各コミットのハッシュに注意してください。 それらを使用して、前の状態にロールバックします。

/etc/hostsを、このチュートリアルを開始する前の外観にロールバックしてみましょう。 赤の文字を、最初のコミットに対応するSHA-1ハッシュに置き換えます。 SHA-1ハッシュ文字列全体を指定する必要はないことに注意してください。 それを一意に識別するいくつかの文字で十分です。

sudo etckeeper vcs checkout 76c19 /etc/hosts

これで、/etc/hostsの内容、権限、所有権をチェックして、それらが元に戻されたことを確認できます。

ファイルの最後の数行を見てください。

tail /etc/hosts

予想どおり、追加した192.168.0.2 node01行が欠落している、このような出力が得られるはずです。

...

# The following lines are desirable for IPv6 capable hosts
::1 test-etckeeper test-etckeeper
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

/etc/hostsの現在の権限と所有権をもう一度確認してください。

ls -l /etc/hosts

次のような出力が表示されます。

-rw-r--r-- 1 root root 704 Apr 17 15:01 /etc/hosts

ファイルの内容、およびアクセス許可と所有権が正しく復元されました。

結論

このチュートリアルでは、/etcディレクトリをGitリポジトリに保存するための優れたツールであるetckeeperの使用方法について説明しました。 Bazaar、Mercurial、またはDarcsリポジトリにも使用できます。

選択したVCSに関係なく、etckeeperは構成ファイルを常に把握し、変更を元に戻したり機能を変更したりする必要がある場合に、常に前の状態にロールバックできるようにします。