Ansible コトハジメ

  • 205
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Ansible を15分程度で「もう使えそう」と感じてもらうために書きました。

Ansible はプロビジョニング用アプリケーションです。
同じ目的のものでは Chef、Puppet などがあります。
Ansible の特徴だと感じたのは、とても簡単ですぐ実用できることです。
Chef で挫折してしまった私(不勉強ですみません)も、一日で仕事で必要なことができました。
簡単というと Fabric (やCapistrano) がありますが、環境構築やデプロイには Ansible が強いと感じます。
Python で書かれたものですがユーザーは YAML でタスクを書きます。
以下の作業で Python は出てきますが、Ansible をインストールする以外では本質的に不要なのでご安心(?)ください。

次を前提とします。

  • Vagrant に Ubuntu 13.10 が用意されていること
  • Mac で pip (Pythonのパッケージ管理コマンド) を使えること

Vagrant の準備は次を参考にしてください。
http://qiita.com/seizans@github/items/a0339682fcc70ae2d0f5

インストールする

$ pip install ansible

Ansible で Vagrant の Ubuntu にタスクを実行させる

インベントリーファイル(hostリスト) を用意する

Ansible では host をリストしたファイルをインベントリーファイルと呼びます。
必須なので用意します。
hosts というファイル名(ファイル名は任意)で、次の内容で作成します。(まだhostが1つだけ)

[vagrant]
192.168.111.222

playbookファイル(処理スクリプト) を用意する

処理を記述したYAMLファイルが必要なので用意します。
provision_vagrant.yml というファイル名(ファイル名は任意)で、次の内容で作成します。

- hosts: vagrant
  sudo: true
  user: vagrant
  tasks:
    - apt: pkg=git update_cache=yes state=latest
    - apt: pkg=vim update_cache=yes state=latest

あとは ansible-playbook コマンドで処理を実行できます。ただその前に・・・

Vagrantfile を用意する

Vagrant 環境を ansible で楽に使えるように作成します。
Vagrantfile というファイル名(ファイル名はこれ指定)を次の内容で作成します。

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu1310"  # 自分のbox名と合わせる  
  config.vm.network :private_network, ip: "192.168.111.222"  # インベントリーファイルの内容と合わせる

  config.vm.provision :ansible do |ansible|
    ansible.playbook = "provision_vagrant.yml"  # 作成したplaybookファイル名
    ansible.inventory_path = "hosts"  # 作成したインベントリーファイル名
  end
end

準備ができました。起動させます。

$ vagrant up

すると、VM を起動させるとそのまま playbook に書かれた処理が続けられます。

$ vagrant ssh
$ aptitude show git

などして、実際に sudo aptitude install git されたことを確認できます。

role を作る

role は tasks を分割して管理するための単位です。

roles/python/tasks/main.yml というファイル名で、次の内容で作成します。(名前はrole名のpythonのみ任意)

- command: mkdir {{ virtualenvs_dir }} creates={{ virtualenvs_dir }}
- pip: name=Django virtualenv={{ virtualenv_dir }} state=latest

また provision_vagrant.yml を次の内容に変更します。

- hosts: vagrant
  sudo: true
  user: vagrant
  tasks:
    - apt: pkg={{ item }} update_cache=yes state=latest
      with_items:
        - git
        - python-virtualenv

- hosts: vagrant
  user: vagrant
  roles:
    - python
  vars:
    work_dir: /home/vagrant
    virtualenvs_dir: "{{ work_dir }}/.virtualenvs"
    virtualenv_dir: "{{ virtualenvs_dir }}/env01"

実行する単位(play) を1つ追加しました。
roles としては先に作った python という名前の role を指定しています。
vars には、処理内で使う変数を定義しています。

ここまでで python の virtualenv を用意して Django をインストールする処理が準備できました。
実行してみます。
なお先程は vagrant up で実行しましたが、今度は ansible のコマンドで実行してみましょう。

$ ansible-playbook -i hosts provision_vagrant.yml --private-key=~/.vagrant.d/insecure_private_key
  (-iはインベントリーファイル指定、--private-keyはssh用のプライベート鍵指定)

実際に virtualenv に Django がインストールされたことを確認しましょう。

$ vagrant ssh
$ source .virtualenvs/env01/bin/activate
$ pip freeze

さて上記で role を使いましたが、ここまででは特に大きな恩恵は受けていませんが、
まずはいったん、準備する単位で分割するように作る慣習だ、などと考えておけばいいと思います。
role の中には tasks 以外にも、次のように機能毎のディレクトリを作成して使うことになります。

- roles/
  - role01/
    - tasks/
    - files/
    - vars/
    - templates/
  - role02/
  - ...

モジュールと次のステップ

ここまでで雰囲気は把握できたのではないかと思います。
後は実際にタスクを書いていけば大丈夫だと思います。

その際に必要になるのが、モジュールの使い方を調べることです。
モジュールというのは、ここまでの tasks 内に出てきた commandaptpip のことです。
適切なモジュールを選んで使っていくことで冪等性などの恩恵を受けられます。

各モジュールについては公式ドキュメントを確認してください。
http://docs.ansible.com/modules_by_category.html

参考