Ansible
Ansibleとは
Ansibleとは、仮想マシンの構成管理ツールです。
仮想マシンの構築ツールとして、「Vagrant」がありますが、
VagrantのみではOSが立ち上がるのみで、まだ「Webサーバー」としては動きません。
そのため、OSがWebサーバーとして動くように、必要な物(LAMP環境等)をインストールするものです。
課題
基本
- Ansibleが持つ機能と基本的な構成を頭に入れ、簡単に説明ができるようにする
- project-templateの既存構成を使って、Ansible単体でplaybookを走らせる
発展
- apacheのroleを書く
- apacheをインストールするplaybookを書く(実行対象はどのマシンでも構いません)
解説
Ansibleの構成
Ansibleを実行するためには、最小構成でこれら4種類のファイルが必要になります。
inventory:接続先情報
playbook:実行ファイル
roles:処理内容
host_vars、group_vars:変数管理
以降、各ファイルについて詳しく記載します。
Intventory(インベントリ)
まず、インベントリの説明です。
インベントリファイルは、接続先情報を記録する、アドレス帳のような物です。
ここに「実行対象のマシン」のIPアドレス(住所)を記載する事で、 Ansibleを実行した時に、指定されているマシンに対して、処理を実行します。
コードは、以下の形を1セットとして記述します。
これを正式名称「グループ変数」と呼びます。
[server-name]
192.168.X.X
varsとrole(バーズ、ロール)
次に、各バーズファイルの説明です。
バーズファイルは、変数を扱います。
ロールは、バーズ側に定義された変数を組み込む事で、汎用性を持たせる事ができます
バーズファイルは、以下の2種類があります。
host_vars
group_vars
どちらも変数を扱うファイルですが、それぞれの意味合いとしては、環境毎に設定内容を分割する目的で使います。
例えば一般的な例として、基本の(ベースとなる)変数はhost_varsに記載しておき、プロジェクト毎に一部値を変更するといった場合は、group_varsに管理しているファイルで基本の変数を上書きしていくといった仕組みです。
具体的な例をあげると、group_varsディレクトリ以下に、プロジェクト名に対応した以下の様なフォルダを作成します。
group_vars/webserver1
group_vars/webserver2
このように「環境=フォルダ単位」とする事で各フォルダ以下に、「任意の名前.yml」を作成して、設定を分岐させるといった事が可能です。
実際の記述はこのようになります。
---
user:
name: vagrant
group: vagrant
password: vagrant
project: hoge
hostname: hoge.local
project_root: "/home/"
document_root: "/www/html"
log_root: /var/log
charset: utf8
mysql:
dbname: fuga
host: localhost
root_password: foofoo
続けて、ロールの説明です。
ロールには実際に走らせる処理(タスク)を記載します。
以下のようなディレクトリ構成が1セットで、タスク処理は、ymlファイルに記述します。
roles/role-name/tasks/main.yml
「role-name」となっている箇所は、任意で命名します。基本的には「何を処理する物か」が分かりやすい名前で管理します。
具体的な例では、「wordpressをインストールする物」であれば、「wordpress」や、
「wp」と命名するのがベターです。
タスク処理のよくある使用例としては、パッケージ管理コマンドの「yum」を使い、パッケージをインストールをさせるか、
Linuxコマンドの、「cp(コピー)」や「mv(移動・リネーム)」といったシェルコマンドを直接実行させて、処理するといった形になります。
実際の使用例を1つあげると、Ansibleは独自メソッドとして「get_url」という処理を持っています。
これは、「引数にURLを指定して、対象を取得する」という用途のメソッドです。(Linux系の、「curl」や、「wget」と同じような認識で問題ありません)
以下は、「get_url」を使用して「Wordpress本体をダウンロード」している例です。
- name: WordPressの最新版をダウンロード
get_url:
url: https://ja.wordpress.org/latest-ja.tar.gz
dest: "/home/vagrant/www/html/wp.tar.gz"
roleのtemplate機能(テンプレート)
ロール(タスク)について、もう少し詳しく見ていきます。 ロールは、タスクの他に、テンプレートという機能も持っています。
テンプレート機能を使う場合は、以下のように管理名ディレクトリの下層に、templatesフォルダを作成して、.j2(jinja2)形式のファイルを作成して記述します。
roles/管理名/templates/example.j2
templateは共通設定をしつつ、一部を変数で処理するための物です。 1つ前のロールの説明でWordpressをダウンロードする処理を書いていますが、インストールも自動で行いたい場合、設定ファイルの記述をなるべくプロジェクトに依存しない形で、使い回したいと思うはずです。
実際に、wp-config.phpを設定した場合のコードを見てみます。
// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', '');
/** MySQL データベースのユーザー名 */
define('DB_USER', '');
/** MySQL データベースのパスワード */
define('DB_PASSWORD', '');
「中カッコで記載している箇所**」が変数になります。
ここで記載している3種類は、「各バーズファイルの説明」の項目で記載していた、以下の部分を読み込んでいます。
user:
name: vagrant
password: vagrant
mysql:
dbname: fuga
root_password: foofoo
この変数を、「各バーズファイルの説明」の項目に書いたように、環境別に管理しておき、これから説明するプレイブックで読み込む形で使用します。
以上が、ロールの基本的な使い方です。
playbookとinventory(プレイブック、インベントリ)
最後に、プレイブックの説明です。
プレイブックは、走らせるロールをを指定します。
プレイブックは以下のように記述します。
---
- name: プレイブック名
hosts: server-name
become: yes
vars_files:
- host_vars/example.yml
roles:
- ../roles/example-task1
- ../roles/example-task2
- ../roles/example-task3
上から説明します。
name
任意で付ける箇所です。
一般的にAnsibleで行う一連の処理が分かる名前ような名前を付けます。
例えば、「LAMP環境を構築」などです。
hosts
インベントリに記載されている項目を指定する事で、 その宛先(マシン)に向けて、処理を実行します。
上記プレイブックでは、先ほどインベントリに記述していたこの項目を読み込んでいます。
[server-name]
192.168.X.X
become
Ansible版のsudoコマンドです。 引数にyesを指定する事で、role処理の全てをスーパーユーザー権限で行います。
vars_files
rolesに読ませる変数になります。 環境毎に分けていれば、この部分を変えるだけで適応できるため、プレイブックの調整だけで複数台の処理にあてられます。
roles
ここに記載した処理(role)が、実行されます。
例えば、「wordpressのダウンロード」処理と、「データベースの構築」処理は密接ですが、分割しておけば、それぞれを別のプロジェクトでも細かく使い回せます。
role処理は、スクラッチで作るのはコストがかかりますが、一度作ってしまえばどのようにも使いまわせる資産になるので、roleが溜まるほど様々な処理に対応できるようになり、コスト削減に繋がります。