構成管理ツール 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 には他にも多数のモジュールがあるため、さらにいろいろと試してみたい。
参考ページ
- 構成管理ツール Ansible について – apatheia.info
- Ansible チュートリアル
コメント