Ansibleによる
環境構築の自動化
ツキノワ株式会社
若山 史郎 (r_rudi)
お前だれよ
• 若山史郎 (ツキノワ株式会社)
• github: shirou / twitter: r_rudi
• 「入門Ansible」を書きました
• 普段はgo言語とJSを使ってWebアプリを書いてます
• インフラもDBも全部やります
• Ansibleのサポートします (有償)
今日の内容
1. 環境構築とその自動化
2. Ansibleの紹介と使い方
3. ちょっと便利なところ
• シェルスクリプトからの移行
• 普段の運用で使う
4. AnsibleからOpenStackを使う
環境構築あるある その1
「コマンドを打ってがんばって構築」
→ 1台構築に1日
→ 「もう一台追加ね」
環境構築あるある その2
「この手順書に沿って実行してね」
→ 動かない

→ こぴぺミス / 入力ミス

→ 1台構築に2日
環境構築あるある その3
「秘伝のこのシェルスクリプトを実行すれば構築できるよ」
→ 動かない

→ 動くけど、なにをしているか分からない。

作った人はもういない
環境構築は自動化しましょう
• 何台でも同じ環境を構築できる
• 実行時にミスしない
• ファイルに書くことで履歴を管理できる
• 誰が、なぜこの変更を加えたのか
構成管理ツール
• Chef
• Puppet
• Ansible
自動的に環境を

構築してくれる
Ansibleの紹介
Ansibleのいいところ
• 実行される側にはなにもインストールする必要がない
• sshが通ればいい。
• YAML形式で読みやすく書きやすい
• 実行順序が明確
• 上から順に書いた順番に実行される
• 環境構築だけではなく、普段の運用に使える
Ansibleの設定ファイル
• Inventoryファイル
• 対象となるサーバー群を記述する
• Playbookファイル
• なにをするか手順を記述する
Inventoryファイル
[db]
db-1.example.com
db-2.example.com
db-3.example.com
!
[app]
app-1.example.com
app-2.example.com
グループ
• 管理対象のサーバーを記述
• ホスト名
• IPアドレス
• sshのユーザー名
• グループ化で管理しやすく
Playbookファイル
- hosts: app # inventoryファイルの中から対象ホスト/グループを指定
tasks: # 実行する手順の内容
!
- name: 実行用ユーザーの作成
user: name=appuser
!
- name: ログディレクトリの作成
file: path=/var/log/app state=directory
!
- name: 依存ライブラリのインストール
apt: name="nginx" state=installed
Playbookファイル
- hosts: app # inventoryファイルの中から対象ホスト/グループを指定
tasks: # 実行する手順の内容
!
- name: 実行用ユーザーの作成
user: name=appuser
!
- name: ログディレクトリの作成
file: path=/var/log/app state=directory
!
- name: 依存ライブラリのインストール
apt: name="nginx" state=installed
タスク
モジュール
実行順序
ansible-playbook コマンドの実行
$ ansible-playbook -i inventory_file someplaybook.yml
!
PLAY [app] ********************************************************************
!
GATHERING FACTS ***************************************************************
ok: [app-1]
ok: [app-2]
!
TASK: [実行用ユーザーの作成] ******************************************************
ok: [app-1]
ok: [app-2]
!
TASK: [ログディレクトリの作成] *****************************************************
ok: [app-1]
ok: [app-2]
!
TASK: [依存ライブラリのインストール] ************************************************
changed: [app-1]
changed: [app-2]
!
PLAY RECAP ********************************************************************
app : ok=3 changed=1 unreachable=0 failed=0
変更あり
Playbookのその他の機能
• 繰り返し
• 条件分岐
• 他ファイルの読み込み
• 外部情報の参照
• 環境変数、ファイル、redisなど
• YAMLで書くのが大変なら

モジュールを書けばいい
• どんな言語でも書ける
• python/ruby/shell script
Ansibleのちょっといいところ
• 「今この構築スクリプトを使ってるんですよ」
• それ “script” モジュールで
• 手元のスクリプトを送って実行
• 複数のサーバーで実行できる
• “creates” で二度実行を防げる
シェルスクリプトからの移行
- name: 秘伝のスクリプトを実行
script: hiden.sh —sugoi 

creates=/var/hiden/done
ローカル
app-1
app-2
app-3
運用時に使う — アドホックコマンド —
$ ansible -i inventory_file —m shell -a “uptime” db
!
!
db01 | success | rc=0 >>
16:51:50 up 94 days, 16:43, 1 user, load average: 0.14, 0.05, 0.06
!
db02 | success | rc=0 >>
16:51:29 up 93 days, 1:17, 1 user, load average: 0.28, 0.11, 0.07
!
db03 | success | rc=0 >>
16:53:55 up 94 days, 16:53, 1 user, load average: 0.16, 0.05, 0.06
モジュールを使う例:
$ ansible -i inventory_file -m yum -a name=glibc state=latest db
OpenStackを使う
OpenStackを使う - 11個のモジュールが標準添付
• glance_image - Add/Delete images from glance
• keystone_user - Manage OpenStack Identity (keystone) users, tenants and roles
• nova_compute - Create/Delete VMs from OpenStack
• nova_keypair - Add/Delete key pair from nova
• quantum_floating_ip - Add/Remove floating IP from an instance
• quantum_floating_ip_associate - Associate or disassociate a particular floating IP with an instance
• quantum_network - Creates/Removes networks from OpenStack
• quantum_router - Create or Remove router from openstack
• quantum_router_gateway - set/unset a gateway interface for the router with the specified external network
• quantum_router_interface - Attach/Dettach a subnet’s interface to a router
• quantum_subnet - Add/remove subnet from a network
keystone
nova
quantum
glance
Dynamic Inventory
• Inventoryをスクリプトが生成
• 自分で管理する必要がなくなる
• 乖離がなくなる
$ ansible-playbook -i nova.py someplaybook.yml
まとめ
• 環境構築は自動化しましょう
• ミスを避け、楽をする
• Ansibleはお手軽に導入できます
• sshが通ればいい
• YAMLで読みやすく、書きやすい
• 書くのが大変だと手で実行してしまう
• 運用時にも使えます
• 突発的な障害対応

Open Stack Day - Ansibleによる環境構築の自動化