Ansible コトハジメ

  • 206
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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

参考