CentOS 7 を USB メモリからインストール で書いたが、まっさらなCentOSが手元にあったので ansible を使っていろいろインストールしてみた。
ちょっと前に、Ansible 2.0 Has Arrived という記事も話題になってたし。
ansible は Chef のような構成管理ツール。 システムの設定や、ソフトウェアのデプロイ、オーケストレーションなどが可能なIT自動化ツール。 管理対象ノードが多いほどメリットが大きい。
Chef と比較すると、エージェントレスのアーキテクチャで、Chefのように特定言語(Ruby)を学ぶ必要はなく、YAMLで構成を表現する。 これは、Playbookと呼ばれる。Chef でいうレシピ。
マネージャ側は最近は大抵プリインストールされている python とansible さえインストールすればよい。 クライアント側は、マネージャから SSH アクセスさえできればよい。
これを1回やってファイル群をリポジトリで管理しておけば、環境の複製が楽になるし、Infrastructure as a Code ですね。
まず、環境の説明。
本稿では、ansible実行サーバをコントローラ (Control Machine)、ansibleによる 管理対象ノードを管理ノード (Managed Node) と呼ぶことにする。
役割 | ホスト名 | 物理マシン | IPアドレス |
---|---|---|---|
コントローラ (Control Machine) | controller | mac mini | 192.168.11.9/24 |
管理ノード (Managed Node) | managed_node | TOSHIBA laptop | 192.168.11.14/24 |
ansible のバージョンは 2.0.0.2
。
0. 準備
0-1. コントローラ
- ansible をインストールする
1
|
|
0-2. 管理ノード
コントローラ~管理ノード間は、ネットワークを介して管理される。 コントローラから管理ノードへSSHアクセスできる必要があるので、以下の設定を事前に行っておく。
- 管理ノードのネットワーク設定
- コントローラのSSH公開鍵の登録
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1. ansible 設定
まずは、管理ノードへOSアカウント (guestユーザ) を追加作成してみる。
ディレクトリ構成は、Ansible オレオレベストプラクティス を参考にして以下のように作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
それぞれのディレクトリの位置づけは、Ansibleチュートリアルとかを参照するとわかりやすい。
まずは、centos/hosts
へ管理ノードのIPアドレスを登録する。
クライアントが複数ある場合は、このエントリーで複数のアドレスを列挙すればよい。
1 2 |
|
次に、メイン処理を centos/site.yml
に記述する。
外部ファイルをインクルードして、roleの実行順序を指定するだけ。
hosts
のところで、対象を絞れるが、今回は all。うまく使えば、production用とdevelopment用を使い分けたりグループ単位で実行できる。
1 2 3 4 5 6 |
|
vars/common.yml
には Playbook 共通で使いたい変数を設定している。
private_vars/common.yml
には公開したくない変数を設定している。ここでは、guestユーザのパスワードを以下のように指定している。
1 2 |
|
こういうパスワードみたいな情報をgithubに上げたくないので、.gitignoreには private_vars/ を追加しておく。
roles
には、実際のアカウント追加処理を指定している role ディレクトリcommon/guest_account
を指定する。
common/guest_account/tasks/main.yml
には、userモジュールを使って、以下のようにタスクを記述する。
1 2 3 4 5 |
|
name
は任意。タスク内容をコメントとして記述する。
user
がモジュール名、それに続いて各モジュールのオプション。
become
, become_method
で管理ノードで sudo を使って実行することを許可している。
2. ansible 実行
クライアント側で事前にユーザの確認。 guest ユーザは存在しない。
1
|
|
まずは、--check
オプションを付けてテスト実行(dry run)。実際の構成変更はせず、
Playbook のシンタックスチェックなどを実施する。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
問題ないようなので実行してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
クライアント側で事後確認してみると、ユーザができている。
1 2 |
|
3. 他にもいろいろとインストールする
ruby や zsh などもインストールする。 インストール対象のプロダクト毎に role を作っている。
role の粒度がいまいちどれくらいにしたらよいのかが分からない。
たとえば、ruby role には ruby のインストールだけにとどめておくべきか、 rbenv のような関連ツールまで 1 セットで記述するのが良いか。
まあ、使いながらやりやすい粒度を模索する、でも良いと思う。
また、OS 毎の差異を吸収するため、common/role/HOGE/tasks/
以下に main.yml
を置いて、
それぞれのOS毎のymlをインクルードした。
ただ、centos/
的な大本からディレクトリを分けて、main.yml
でOS判定と
条件分岐しないような配置でも良かったかもなとも思っている。
以下のようなディレクトリ構成となった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
公式ドキュメントを見つつ、yum や git モジュールを利用した。
中身の説明は、体力が切れたので割愛。 詳細は、momota/laptop-build を参照。