Ansible
~ Quick Start ~
Internet Initiative Inc.
Hideki Saito (@saito_hideki)

1

ver1.1
目次
‣

自己紹介

‣

はじめに

‣

Ansibleについて
-

使ってみる

‣

インストールする
「仕事」をさせてみる

まとめ

2
自己紹介
‣

氏名: 齊藤 秀喜(さいとう ひでき)
-

‣

Twitter: @saito_hideki
Blog: http://d.hatena.ne.jp/pyde/

勤務先: 株式会社インターネットイニシアティブ(IIJ)
-

http://www.iij.ad.jp/

‣

所属: 日本OpenStackユーザ会 ボードメンバー

‣

趣味: Python/OpenStack /Ansible

‣

仕事: クラウド基盤のちょっとした開発やちょっとした運用
-

http://www.iij.ad.jp/GIO/

3
はじめに
‣ Ansibleは物理・仮想・クラウド基盤に対して「人」が行う仕事を
自動化するためのソフトウェアで構成管理ツールと呼ばれるこ
ともあります。
‣ これまで作業手順書や、それをスクリプト言語などでコード化し
て実行してきた個々の作業を「仕事」としてまとめて管理できる
という特徴があります。
‣ システムの構成管理をする目的で導入しますが、Ansibleだけ
で全てをカバーできるわけではありませんのでご注意を。
‣ 本セッションでは、Ansibleの仕組みと導入方法の一例、そし
て簡単な仕事をさせるまでの流れをご紹介します。

4
Ansibleについて

5
Ansibleとは?
‣ 何をするものなのか?
- Pythonで書かれた*個々の作業*だけなく*まとまった仕事*の単位で自動
化を行うツール
- OS・ミドルウェア・アプリケーションのインストール・設定などの一連の作業を
Playbookとして1つにまとめてワンアクションで実行させることが可能
- 多数の外部モジュールが標準・オプションで提供されている
- 適用した作業に対する冪等性が担保されている(担保されていないモジュー
ルもある)
- push型でエージェントレス。操作対象ノードにSSHでログインできれば最低
限ど動作するため導入の敷居が低い

‣ 入手先は?
- 公式サイト: http://www.ansibleworks.com/
- ソースコード: https://github.com/ansible/ansible
- githubのtagによるとv0.01のリリースは2009年
- 現時点(2013-12)で最新の安定版はv1.4.1
6
さまざまな仕組みを協調動作させる
世の中には、さまざまなタイプの構成管理ツールがありますが、ここでは
大きく2つに分けてみます。
これまで脈々と培ってきた「手順書」ベースの仕事を自動化する必要があ
るのであれば、選択肢は従来型のほうが適しています(現時点では)。
‣ 作業の自動化を主眼とした構成管理ツール
スクリプトなど従来のツールの延長線上にあるもの

-

Puppet�(ruby…)
Chef (ruby…)
Capistrano (ruby…)
Ansible(python!!!) 今回ご紹介します

‣ クラウド基盤の構成管理を行うためのツール
さまざまな出自の異なるクラウド基盤の制御とAPI共通化に注力したもの

-

Apache libcloud
Deltacloud
Rightscale
SCALR
7
構成要素(キーワード)
‣ module
- サービスの起動停止などansibleに行わせる作業を外部モジュールとして管
理する

‣ playbook
- 作業(module)の一連の流れをまとめたもの

‣ plugin
- moduleの実行失敗時のcallbackなどansibleそのものの機能を提供する

‣ inventory
- 操作対象ノードリスト
hostsファイル的なもの

8
Ansibleをインストールする

9
導入から稼働まで(ubuntu12.04lts編�[1])
1. 必要となるパッケージ群をダウンロード
12.04のパッケージ版はv1.1と古く、OpenStack用のモジュールが提供され
ていないためgithubからソースコード(v1.3.4)を取得してインストールする

!

 $ sudo apt-get install -y git python-pip python-virtualenv	

!

2. virtualenv環境構築してAnsibleをインストール
1. virtualenv環境構築
ansibleをOS標準とは別のモジュールパスにインストールする

!
!
!
!
!

$ virtualenv app
New python executable in ansible/bin/python
Installing distribute....done.
Installing pip...done.
$ source app/bin/activate
(app) $

2. ansibleが依存するモジュール群をインストール
(app) $ pip install PyYAML jinja2	
10
導入から稼働まで(ubuntu12.04lts編�[2])
!
3. githubからansibleを取得してインストール

- v1.3.4をcheckoutする
- この例ではモジュールはapp/share/ansible/にインストールされる

(app)
(app)
(app)
(app)
(app)
(app)

$ mkdir src && cd src
$ git clone https://github.com/ansible/ansible.git
$ cd ansible
$ git checkout -b v1.3.4 v1.3.4
Switched to a new branch 'v1.3.4’ 
$ python setup.py build

<pythonのvirtualenv環境>

modules

modules(A)

modules(B)

python

python-virtualenv(A)
~/app/

python-virtualenv(B)
~/hogehoge/

!

OS
virtualenvの外側に影響を与えない
11
導入から稼働まで(ubuntu12.04lts編�[3])
3. 動作確認
1. インベントリファイルを作成
インベントリには操作対象となるホストのIPアドレスを記載する
※他にも様々な記載方法が可能

!

(app) $ echo “192.168.100.110” > hosts	

!
2. pingモジュールで動作確認(successとなることを確認する)
(app) $ ansible -i hosts all -u foo -k -m ping	
SSH password: ********	
192.168.100.110 | success >> {	
"changed": false,	
"ping": "pong"	
}	

!
-i: インベントリファイル名	
-u: 対象ノードにsshログインするユーザ名	
-k: 実行時にsshログインパスワードを入力するインタラクションを発生させる	
-m <モジュール名>

12
restarted

導入から稼働まで(ubuntu12.04lts編�[4])
!
3. setupモジュールで操作対象サーバの情報を取得してみる
取得した情報は環境変数としてPlaybook内で利用可能
(app) $ ansible -i hosts all -u foo -k -m setup	
SSH password: ********	
172.16.8.130 | success >> {	
"ansible_facts": {	
"ansible_all_ipv4_addresses": [	
"192.168.122.1",	
"172.16.8.130",	
"169.254.169.254"	
],	
"ansible_all_ipv6_addresses": [	
"fe80::20c:29ff:fe8e:2665",	
"fe80::883d:a8ff:fead:cfaf"	
],	
"ansible_architecture": "x86_64",	
"ansible_bios_date": "07/31/2013",	
"ansible_bios_version": "6.00",	
"ansible_br_ex": {	
"active": true,	
[省略]
13
Ansibleを使ってみる

14
モジュール実行の仕組み(リモート)
Ansible実行ノードから構成管理対象ノードに対してモジュール
からpythonの実行コードを生成してsftpで転送し、ssh経由で
実行する。

15
モジュール実行の仕組み(ローカル経由でリモート)
pythonの実行系を持たないスイッチなどのネットワークデバイ
スを操作する場合の代表的な動きは以下の通り。実行コードは
Ansibleノード上に生成され実行される。

16
Ansibleの外部モジュール
Category

Description

Cloud

EC2/OpenStackの制御などクラウド基盤管理用モジュール群

Commands

ターゲットノードで直接コマンド実行を行うためのモジュール群

Database

MySQLなどのデータベース操作を行うためのモジュール群

Files

ファイルシステム操作や設定ファイルの書き換えを行うためのモジュール群

Internal

非同期操作の進捗確認などAnsibleが内部利用するためのモジュール群

Inventory

インベントリ情報の動的操作用モジュール群

Messaging

AMQP操作用モジュール群

Monitoring

監視システム操作用モジュール群

Net Infrastructure

物理・仮想ネットワーク操作用モジュール群

Network

操作対象ノードからHTTP/FTPなどの通信を行うためのモジュール群

Notification

IRC/EMailなどを使って通知を行うためのモジュール群)

Packaging

yum/apt/pipなどのパッケージ操作を行うためのモジュール群

Source Control

gitなどのリビジョンコントロールシステム操作用モジュール群

System

OS操作用モジュール群

Utilities

Ansibleの実行を一時停止させるなどのユーティリティモジュール群

Web Infrastructure

djangoなどのWebサービスを操作用モジュール群
17
Ansibleの外部モジュールの使い方
‣

ansible-docコマンドでモジュールのオプションを確認する
[書式] ansible-doc <モジュール名>
(app) $ ansible-doc file	
> FILE	

!

!

Sets attributes of files, symlinks, and directories, or removes	
files/symlinks/directories. Many other modules support the same	
options as the [file] module - including [copy], [template], and	
[assemble].	

Options (= is mandatory):	

!

- force	
force the creation of the symlinks in two cases: the source	
file does not exist (but will appear later); the destination	
exists and a file (so, we need to unlink the "path" file and	
create symlink to the "src" file in place of it). (Choices:	
yes, no)	
<…>	
Notes:

!

See also [copy], [template], [assemble]	

- file: path=/etc/foo.conf owner=foo group=foo mode=0644	
- file: src=/file/to/link/to dest=/path/to/symlink owner=foo group=foo state=link

18
モジュールを使ってみる
‣

serviceモジュールでターゲットホストのhttpdをリスタートしてみる
(app) $ ansible -i hosts all -u foo -k -K -m service -a "name=httpd state=restarted"	
SSH password: ********	
sudo password [defaults to SSH password]: ********	
172.16.0.1 | success >> {	
"changed": true,	
"name": "httpd",	
"state": "started"	
}

!
!
!
!

‣

yumモジュールを使ってlibselinux-pythonパッケージをインストールしてみる
(app) $ ansible -i hosts all -u foo -k -K -m yum -a "name=libselinux-python state=present"	
SSH password: ********	
sudo password [defaults to SSH password]: ********	
172.16.0.1 | success >> {	
"changed": true,	
"msg": "",	
"rc": 0,	
"results": [	
"Loaded plugins: fastestmirror, prioritiesnLoading mirror speeds from cached hostfilen * base:
ftp.jaist.ac.jpn * epel: ftp.kddilabs.jpn * extras: ftp.jaist.ac.jpn * updates: ftp.jaist.ac.jpn183 packages
excluded due to repository priority protectionsnSetting up Install ProcessnResolving Dependenciesn--> Running
transaction checkn---> Package libselinux-python.x86_64 0:2.0.94-5.3.el6_4.1 will be installedn--> Finished
Dependency ResolutionnnDependencies Resolvedn
n================================================================================n Package
Arch
Version
Repository
Size
n================================================================================nInstalling:n libselinux-python
x86_64
2.0.94-5.3.el6_4.1
updates
202 knnTransaction Summary
n================================================================================nInstall
1 Package(s)nnTotal
download size: 202 knInstalled size: 653 knDownloading Packages:nRunning rpm_check_debugnRunning Transaction Test
nTransaction Test SucceedednRunning Transactionnr Installing : libselinux-python-2.0.94-5.3.el6_4.1.x86_64
1/1 nr Verifying : libselinux-python-2.0.94-5.3.el6_4.1.x86_64
1/1 nnInstalled:n libselinuxpython.x86_64 0:2.0.94-5.3.el6_4.1
nnComplete!n"	
]	
}

19
AnsibleのPlaybookで仕事をさせてみる(1)
apacheやmysqlのインストールを行い、適切に設定してサービスを起動する。など1
つ1つの「作業」をまとめて、「ブログサーバを構築して利用者に提供する」といったよ
うに抽象化したものを、ここでは「仕事」と呼ぶことにすると…

小さな仕事・作業

仕事

小道具

nginxを
インストール・構築する

ブログサーバサービスを
利用者に提供する

小道具

MySQLを
インストール・設定する

小道具
PHPをインストールする

これがAnsibleのPlaybookで
行える「仕事」

小道具

WordPressを
インストール・設定する

20
AnsibleのPlaybookで仕事をさせてみる(2)
Playbookのディレクトリ構造

たとえば”wordpress-release”など「仕事」の名前

playbook名/ 
group_vars/
all
roles/
小さな仕事-A/
tasks/
main.yml
handlers/
main.yml
templates/
foo.conf.j2
bar.conf.j2
baz.conf.j2
file/
hogehoge.conf
小さな仕事-B/

Playbook内でで利用する環境変数を定義するファイル
mysqlの設定・起動などの「小さな仕事」の単位をroles内で定義
実際に行う作業を定義
tasks内の作業結果をトリガーとして実施する必要のある
動作を定義。例えば、tasksでmy.cnfの修正作業を実施
場合に必要となる「mysqldの再起動」などを定義する
my.cnfなどの設定ファイルのテンプレートを置く。テンプ
レート中に{{ 環境変数 }} のように書くことでjinja2でパラ
メータの置き換えが可能
対象サーバにそのまま置けば良いファイルを定義

小さな仕事-C/
site.yml

Playbookが含む小さな仕事(roles内の仕事)のリストを定義

21
AnsibleのPlaybookで仕事をさせてみる(3)
ブログサーバを構築して提供するPlaybookを実行してみる
$ ansible-playbook -u root -k -i hosts site.yml	
SSH password: ********	

!
!

PLAY [Install Wordpress, MySQL, Nginx, and PHP-FPM] ***************************	
GATHERING FACTS ***************************************************************	
ok: [192.168.100.110]	
[省略]	
TASK: [Install Mysql package] *************************************************	
changed: [192.168.100.110] => (item=mysql-server,MySQL-python,libselinux-python,libsemanage-python)	

!

TASK: [Create Mysql configuration file] ***************************************	
changed: [192.168.100.110]	
[省略]	
PLAY RECAP ********************************************************************	
192.168.100.110
: ok=25
changed=24
unreachable=0
failed=0

22
ansibleのplaybook例
‣

httpdをインストールして設定しスタートさせる
記述はYAML形式
---	
- hosts: webservers	
vars:	
http_port: 80	
max_clients: 200	
remote_user: root	
tasks:	
- name: ensure apache is at the latest version	
yum: pkg=httpd state=latest	
- name: write the apache config file	
template: src=/srv/httpd.j2 dest=/etc/httpd.conf	
notify:	
- restart apache	
- name: ensure apache is running	
service: name=httpd state=started	
handlers:	
- name: restart apache	
service: name=httpd state=restarted
23
まとめ
‣ 構成管理ツール「Ansible」について概要を説明しました
‣ Ansibleのインストール方法と実行環境(virtualenv)について
紹介しました
‣ Ansibleがターゲットノードに対して操作を実行する仕組みを
簡単に解説しました
‣ Ansibleのモジュール群についてカテゴリ別に説明しました
‣ Playbookの役割と構造、実行方法について紹介しました

24
参考
‣

Ansible
-

http://www.ansibleworks.com/docs/

-

‣

http://www.ansibleworks.com

http://www.ansibleworks.com/docs/modules.html

Example
‣

ansible-examples
-

‣

https://github.com/ansible/ansible-examples

openstack-ansible
-

https://github.com/yosshy/openstack-ansible

25
ご清聴ありがとうございました

26

Ansible quickstart