初めてのAnsible 整理


[「初めてのAnsible」](https://www.oreilly.co.jp/books/9784873117652/)を読み進めながらのメモ

前掲
[初めてのAnsible（1章：イントロダクション）](http://qiita.com/c0tt0n-candy/items/512049586f5a1f1279f3)
[初めてのAnsible（2章：Playbook:始めてみよう）](http://qiita.com/c0tt0n-candy/items/36b4eb2717447071ad21)
[初めてのAnsible（3章：インベントリ:サーバーの記述）](http://qiita.com/c0tt0n-candy/items/1b109c53d8709717a1bb)
[初めてのAnsible（4章：変数とファクト）](http://qiita.com/c0tt0n-candy/items/7144d49636a30433365c)
[初めてのAnsible（7章：複雑なPlaybook）](http://qiita.com/c0tt0n-candy/items/9e9ea1f745bd904e4a5e)
[初めてのAnsible（8章：ロール:プレイブックのスケールアップ）](http://qiita.com/c0tt0n-candy/items/d94131e481fa5f0e4db2)
[初めてのAnsible（9章：Ansibleの高速化）](http://qiita.com/c0tt0n-candy/items/83dfbb158f4520bba7e2)
[初めてのAnsible（10章：カスタムモジュール）](http://qiita.com/c0tt0n-candy/items/33ef98d3c42f04ce7450)


# [Ansible](http://docs.ansible.com/ansible/index.html)とは

* **構成管理ツール**
	* VagrantやDocker、種々のIaaSなんかも使える
* ホスト(サーバ)にエージェントをインストール必要がない（必要なのは以下のみ）
	* ホスト：Python2.5+ or Python2.4(simplejsonライブラリ必要)
	* コントロールマシン：Python2.6+

# ディレクトリ構成

* 公式ドキュメントの[Best Practices](http://docs.ansible.com/ansible/playbooks_best_practices.html)にある例を
	* [Alternative Directory Layout](http://docs.ansible.com/ansible/playbooks_best_practices.html#alternative-directory-layout)

```
playbooks/
├── inventories/
│    ├── production/
│    │   ├── hosts.yml            # production環境のインベントリファイル
│    │   ├── group_vars/          # production環境のグループ変数設定ファイル群
│    |   |    ├── group1
│    |   |    └── group2
│    │   └── host_vars/           # production環境のホスト変数ファイル群
│    |        ├── hostname1
│    |        └── hostname2
│    └── staging/
│        ├── hosts.yml            # staging環境のインベントリファイル
│        ├── group_vars/          # staging環境のグループ変数ファイル群
│        |    ├── group1
│        |    └── group2
│        └── host_vars/           # staging環境のホスト変数ファイル群
│             ├── hostname1
│             └── hostname2
├── library/                      # カスタムモジュール
├── filter_plugins/               # フィルタープラグイン
├── site.yml                      # マスターplaybook
├── webservers.yml                # webserver層のplaybook
├── dbservers.yml                 # dbserver層のplaybook
└── roles/                        # ロールファイル群
     ├── common/                  # commonロールファイル群
     |    ├── tasks/              # タスク群
     |    |    └── main.yml
     |    ├── handlers/           # ハンドラ群
     |    |    └── main.yml
     |    ├── templates/          # テンプレートファイル群
     |    |    └── ntp.conf.j2
     |    ├── files/              # アップロードファイル群
     |    |    ├── bar.txt
     |    |    └── foo.txt
     |    ├── vars/               # オーバーライドすべきでない変数群
     |    |    └── main.yml
     |    ├── defaults/           # オーバーライドできるデフォルトの変数群
     |    |    └── main.yml
     |    └── meta/               # 依存ロール設定ファイル
     |         └── main.yml
     ├── webtier/
     |    :
     ├── monitoring/
     |    :
     └── fooapp/
          :
```

# Playbook

* YAML形式で記述される **設定管理スクリプト**
* 1つ以上のPlayのリスト

## Play

* ホストとタスクを結びつけるもの で以下を含む
	* 設定するホストの集合
	* ホスト上で実行するタスクのリスト

# インベントリファイル

* インベントリ : Ansibleの知るホスト群

* インベントリファイルにはホスト群を記述
	* ホストのグループを定義可能
	* AWS EC2 など動的にインベントリを設定することも可能

# 変数

記述することで定義できる変数と、Ansibleが定義してくれる変数がある

## ホスト変数

* 各ホストに関する変数
* `host_vars/hostname1` で hostname1 の変数を定義

## グループ変数

* 各グループに関する変数
* `group_vars/group1` で group1 に属するホストに変数を定義
* グループの積集合に対して変数を定義する、なども可能

## ファクト

* ホストに関する情報を保存した変数
	* CPUアーキテクチャ / OS / IPアドレス など
* playbook実行のはじめにファクトの収集が行われる

# ロール

* playbookを分割・再利用するための仕組み

## 依存ロール

* あるロールが依存する1つ以上のロールを指定可
* 指定された依存対象のロールが実行されることを保証