Ansible でデプロイする

スポンサーリンク

構成管理ツール Ansible を用いて、サーバにファイルをデプロイしてみる。

スポンサーリンク

Ansible について

Ansible とは、Python 製の構成管理ツールで、次のような特徴がある。

  • 構成がシンプル
  • 冪等性がある
  • 対象ホストに特別なソフトウェアを入れる必要がない

目的

今回は以下のような条件下で、サーバにファイルをデプロイすることを目的とする。

  • 連番の名前が付いた多数のサーバに、数個のファイルを配布する
  • サーバには、一般ユーザで鍵認証により ssh 接続する
  • そのユーザはパス無しで sudo できる
  • ファイルの転送には (sftp ではなく) scp を使う
  • root 権限が必要なディレクトリにファイルを置く

このような場合、特別なツールを使わずに実施しようとすると、次のようなことを気にする必要がある。

  • いったん一般ユーザ権限でファイルを転送して、sudo で配置しなおさなければならない
  • 多数のサーバに対して、いかに速く配布するか

Ansible を使うことで、これらの問題を解決できる。

環境要件

Ansible をインストール、使用するには、以下の環境が必要となる。

配布元

  • Python 2系 (3系だと動かなかった)
  • git コマンドもしくは sudo 権限

配布先

  • Python

Ansible のセットアップ

まず配布元のマシンに Python の2系を用意する。今回は pyenv を使うことにする。pyenv のインストール手順は次のページが参考になる。

pyenv が準備できたら Python 2.7.6 を入れる。

$ pyenv install 2.7.6
$ pyenv global 2.7.6
$ python --version
Python 2.7.6

そして Ansible をインストールする。複数の方法があるが、pip で入れる場合は sudo 権限が必要になるようなので、今回は git を使う。

$ cd
$ git clone git://github.com/ansible/ansible.git
$ cd ansible
$ git submodule update --init --recursive
$ source ./ansible/hacking/env-setup > /dev/null
$ echo 'source ./ansible/hacking/env-setup > /dev/null' >> .bashrc

必要なモジュールを入れる。

$ pip install jinja2 pyyaml

入ったか確認する。

$ ansible --version
ansible 1.6 (devel 621fcbb9de) last updated 2014/04/04 18:40:25 (GMT +900)

使い方

Ansible を使うには、主に次の3つのファイル用意する。

ansible.cfg

ansible.cfg では Ansible の設定を行なう。ファイルの転送にデフォルトでは sftp が使用されるが、今回は scp を使いたいので、そのように設定しておく。

[ssh_connection]
scp_if_ssh=True

Inventory

Inventory ファイルでは、配布先のサーバやそのグループを定義する。

例えば www[01-20].example.com の20台を対象にする場合は、次のように記述する。ファイル名は hosts とする。

[web]
www[01:20].example.com

[web:vars]
ansible_ssh_user=(配布先の ssh ユーザ名)
ansible_ssh_private_key_file=(ssh の公開鍵ファイルのパス)

ここまでで、web グループの各ホストと ssh で疎通がとれるかは、ping モジュールで確認できる。

$ ansible -i hosts web -m ping

Playbook

Ansible の動作は Playbook ファイルで指定する。今回は以下のような動作をさせたい。

  • web グループのホスト群を対象とする
  • file1 を /etc/hoge として配布する
  • file2 を /usr/local/bin/fuga として配布する

これを Playbook で表現すると次のようになる。ファイルの配布は ファイル名は deploy.yml とする。

- hosts: web
  sudo: yes
  tasks:
    - name: put /etc/hoge
      copy: src=files/file1 dest=/etc/hoge owner=root group=root mode=640
    - name: put /usr/local/bin/fuga
      copy: src=files/file2 dest=/usr/local/bin/fuga owner=root group=root mode=755

今回はファイルを配布したいので、copy モジュールを使う。src は、配布元サーバにあるファイルを絶対パスまたは yaml ファイルからの相対パスで指定する。hosts: で区切って複数指定することもできる。

テスト

作成した Playbook のテストは、次のコマンドで行なう。

$ ansible-playbook -i hosts deploy.yml --check

実行

テストが問題なさそうなら、次のコマンドで配布を実行する。

$ ansible-playbook -i hosts deploy.yml

エラーが出なければ配布成功だ。

おわりに

今回は特定の条件下での配布が目的だったため、copy モジュールだけを使用した。しかしながら Ansible には他にも多数のモジュールがあるため、さらにいろいろと試してみたい。

参考ページ

コメント

タイトルとURLをコピーしました