Ansible導入手順

## [概要]
Ansibleとは、Pythonで記述された構成管理ツールです。
記述ファイルはyml形式で記述し、Infrastructure as Codeの管理が可能となります。
Chefなどと違い、エージェントレス型の構成管理ツールとなるため、敷居がだいぶ低いので、構成管理ツールを初めて使う際はとっつきやすいかと思います。

## [事前準備]
yum updateを実施したCentOS6.6を準備して、ssh接続できるまでしておいてください。

OS Xを使用している場合は、自分が前回書いた下記を参考にしてみてください。

[OS XへのVagrant導入方法](http://qiita.com/mackerel/items/d97fe68065fa8669c090)

## [作業内容]

### リポジトリ追加
```bash
$ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# -i rpmをインストールする
# -v 詳細な出力をする
# -h インストール進捗を # で表示する
http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.Ph1eo4: ヘッダ V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
準備中...                ########################################### [100%]
   1:epel-release           ########################################### [100%]

### Ansibleインストール
$ sudo yum -y install ansible
# -y 自動でyes応答
読み込んだプラグイン:fastestmirror
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
epel/metalink                                                                                                                                                 | 5.3 kB     00:00
 * base: www.ftp.ne.jp
 * epel: ftp.kddilabs.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
epel                                                                                                                                                          | 4.3 kB     00:00
epel/primary_db                                                                                                                                               | 5.7 MB     00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package ansible.noarch 0:1.9.2-1.el6 will be インストール
--> 依存性の処理をしています: python-simplejson のパッケージ: ansible-1.9.2-1.el6.noarch
--> 依存性の処理をしています: python-setuptools のパッケージ: ansible-1.9.2-1.el6.noarch
--> 依存性の処理をしています: python-paramiko のパッケージ: ansible-1.9.2-1.el6.noarch
--> 依存性の処理をしています: python-keyczar のパッケージ: ansible-1.9.2-1.el6.noarch
--> 依存性の処理をしています: python-jinja2 のパッケージ: ansible-1.9.2-1.el6.noarch
--> 依存性の処理をしています: python-httplib2 のパッケージ: ansible-1.9.2-1.el6.noarch
--> 依存性の処理をしています: python-crypto2.6 のパッケージ: ansible-1.9.2-1.el6.noarch
--> 依存性の処理をしています: PyYAML のパッケージ: ansible-1.9.2-1.el6.noarch
--> トランザクションの確認を実行しています。
---> Package PyYAML.x86_64 0:3.10-3.1.el6 will be インストール
--> 依存性の処理をしています: libyaml-0.so.2()(64bit) のパッケージ: PyYAML-3.10-3.1.el6.x86_64
---> Package python-crypto2.6.x86_64 0:2.6.1-2.el6 will be インストール
---> Package python-httplib2.noarch 0:0.7.7-1.el6 will be インストール
---> Package python-jinja2.x86_64 0:2.2.1-2.el6_5 will be インストール
--> 依存性の処理をしています: python-babel >= 0.8 のパッケージ: python-jinja2-2.2.1-2.el6_5.x86_64
---> Package python-keyczar.noarch 0:0.71c-1.el6 will be インストール
--> 依存性の処理をしています: python-pyasn1 のパッケージ: python-keyczar-0.71c-1.el6.noarch
--> 依存性の処理をしています: python-crypto のパッケージ: python-keyczar-0.71c-1.el6.noarch
---> Package python-paramiko.noarch 0:1.7.5-2.1.el6 will be インストール
---> Package python-setuptools.noarch 0:0.6.10-3.el6 will be インストール
---> Package python-simplejson.x86_64 0:2.0.9-3.1.el6 will be インストール
--> トランザクションの確認を実行しています。
---> Package libyaml.x86_64 0:0.1.3-4.el6_6 will be インストール
---> Package python-babel.noarch 0:0.9.4-5.1.el6 will be インストール
---> Package python-crypto.x86_64 0:2.0.1-22.el6 will be インストール
---> Package python-pyasn1.noarch 0:0.0.12a-1.el6 will be インストール
--> 依存性解決を終了しました。

依存性を解決しました

=====================================================================================================================================================================================
 パッケージ                                        アーキテクチャ                         バージョン                                      リポジトリー                          容量
=====================================================================================================================================================================================
インストールしています:
 ansible                                           noarch                                 1.9.2-1.el6                                     epel                                 1.7 M
依存性関連でのインストールをします。:
 PyYAML                                            x86_64                                 3.10-3.1.el6                                    base                                 157 k
 libyaml                                           x86_64                                 0.1.3-4.el6_6                                   base                                  52 k
 python-babel                                      noarch                                 0.9.4-5.1.el6                                   base                                 1.4 M
 python-crypto                                     x86_64                                 2.0.1-22.el6                                    base                                 159 k
 python-crypto2.6                                  x86_64                                 2.6.1-2.el6                                     epel                                 513 k
 python-httplib2                                   noarch                                 0.7.7-1.el6                                     epel                                  70 k
 python-jinja2                                     x86_64                                 2.2.1-2.el6_5                                   base                                 466 k
 python-keyczar                                    noarch                                 0.71c-1.el6                                     epel                                 219 k
 python-paramiko                                   noarch                                 1.7.5-2.1.el6                                   base                                 728 k
 python-pyasn1                                     noarch                                 0.0.12a-1.el6                                   base                                  70 k
 python-setuptools                                 noarch                                 0.6.10-3.el6                                    base                                 336 k
 python-simplejson                                 x86_64                                 2.0.9-3.1.el6                                   base                                 126 k

トランザクションの要約
=====================================================================================================================================================================================
インストール        13 パッケージ

総ダウンロード容量: 6.0 M
インストール済み容量: 29 M
パッケージをダウンロードしています:
(1/13): PyYAML-3.10-3.1.el6.x86_64.rpm                                                                                                                        | 157 kB     00:00
(2/13): ansible-1.9.2-1.el6.noarch.rpm                                                                                                                        | 1.7 MB     00:00
(3/13): libyaml-0.1.3-4.el6_6.x86_64.rpm                                                                                                                      |  52 kB     00:00
(4/13): python-babel-0.9.4-5.1.el6.noarch.rpm                                                                                                                 | 1.4 MB     00:00
(5/13): python-crypto-2.0.1-22.el6.x86_64.rpm                                                                                                                 | 159 kB     00:00
(6/13): python-crypto2.6-2.6.1-2.el6.x86_64.rpm                                                                                                               | 513 kB     00:00
(7/13): python-httplib2-0.7.7-1.el6.noarch.rpm                                                                                                                |  70 kB     00:00
(8/13): python-jinja2-2.2.1-2.el6_5.x86_64.rpm                                                                                                                | 466 kB     00:00
(9/13): python-keyczar-0.71c-1.el6.noarch.rpm                                                                                                                 | 219 kB     00:00
(10/13): python-paramiko-1.7.5-2.1.el6.noarch.rpm                                                                                                             | 728 kB     00:00
(11/13): python-pyasn1-0.0.12a-1.el6.noarch.rpm                                                                                                               |  70 kB     00:00
(12/13): python-setuptools-0.6.10-3.el6.noarch.rpm                                                                                                            | 336 kB     00:00
(13/13): python-simplejson-2.0.9-3.1.el6.x86_64.rpm                                                                                                           | 126 kB     00:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                                 9.9 MB/s | 6.0 MB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
Importing GPG key 0x0608B895:
 Userid : EPEL (6) <epel@fedoraproject.org>
 Package: epel-release-6-8.noarch (installed)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
警告: RPMDB は yum 以外で変更されました。
  インストールしています  : python-crypto-2.0.1-22.el6.x86_64                                                                                                                   1/13
  インストールしています  : python-paramiko-1.7.5-2.1.el6.noarch                                                                                                                2/13
  インストールしています  : python-pyasn1-0.0.12a-1.el6.noarch                                                                                                                  3/13
  インストールしています  : python-keyczar-0.71c-1.el6.noarch                                                                                                                   4/13
  インストールしています  : python-setuptools-0.6.10-3.el6.noarch                                                                                                               5/13
  インストールしています  : python-crypto2.6-2.6.1-2.el6.x86_64                                                                                                                 6/13
  インストールしています  : python-simplejson-2.0.9-3.1.el6.x86_64                                                                                                              7/13
  インストールしています  : python-httplib2-0.7.7-1.el6.noarch                                                                                                                  8/13
  インストールしています  : libyaml-0.1.3-4.el6_6.x86_64                                                                                                                        9/13
  インストールしています  : PyYAML-3.10-3.1.el6.x86_64                                                                                                                         10/13
  インストールしています  : python-babel-0.9.4-5.1.el6.noarch                                                                                                                  11/13
  インストールしています  : python-jinja2-2.2.1-2.el6_5.x86_64                                                                                                                 12/13
  インストールしています  : ansible-1.9.2-1.el6.noarch                                                                                                                         13/13
  Verifying               : PyYAML-3.10-3.1.el6.x86_64                                                                                                                          1/13
  Verifying               : python-babel-0.9.4-5.1.el6.noarch                                                                                                                   2/13
  Verifying               : python-keyczar-0.71c-1.el6.noarch                                                                                                                   3/13
  Verifying               : libyaml-0.1.3-4.el6_6.x86_64                                                                                                                        4/13
  Verifying               : python-httplib2-0.7.7-1.el6.noarch                                                                                                                  5/13
  Verifying               : python-simplejson-2.0.9-3.1.el6.x86_64                                                                                                              6/13
  Verifying               : python-jinja2-2.2.1-2.el6_5.x86_64                                                                                                                  7/13
  Verifying               : python-crypto-2.0.1-22.el6.x86_64                                                                                                                   8/13
  Verifying               : ansible-1.9.2-1.el6.noarch                                                                                                                          9/13
  Verifying               : python-crypto2.6-2.6.1-2.el6.x86_64                                                                                                                10/13
  Verifying               : python-paramiko-1.7.5-2.1.el6.noarch                                                                                                               11/13
  Verifying               : python-setuptools-0.6.10-3.el6.noarch                                                                                                              12/13
  Verifying               : python-pyasn1-0.0.12a-1.el6.noarch                                                                                                                 13/13

インストール:
  ansible.noarch 0:1.9.2-1.el6

依存性関連をインストールしました:
  PyYAML.x86_64 0:3.10-3.1.el6                libyaml.x86_64 0:0.1.3-4.el6_6            python-babel.noarch 0:0.9.4-5.1.el6          python-crypto.x86_64 0:2.0.1-22.el6
  python-crypto2.6.x86_64 0:2.6.1-2.el6       python-httplib2.noarch 0:0.7.7-1.el6      python-jinja2.x86_64 0:2.2.1-2.el6_5         python-keyczar.noarch 0:0.71c-1.el6
  python-paramiko.noarch 0:1.7.5-2.1.el6      python-pyasn1.noarch 0:0.0.12a-1.el6      python-setuptools.noarch 0:0.6.10-3.el6      python-simplejson.x86_64 0:2.0.9-3.1.el6

完了しました!
```





### 鍵認証設定
Ansibleは、sshで接続し設定を行います。
そのため、リモートサーバにsshの公開鍵を設定しておく必要があります。
今回は、リモートは準備していないので、自身(localhost)に対して設定していきます。

#### 秘密鍵・公開鍵の作成
```bash
$ ssh-keygen -t rsa
# -t 鍵タイプを指定する
# rsa 鍵タイプをrsaに指定
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
cc:b3:81:50:cf:58:f7:cf:ba:5d:b7:99:e7:2b:94:14 vagrant@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|      . . .      |
|     . = . . E   |
|    . . o   . .  |
|     . +     +   |
|      . S   . +  |
|         +   +   |
|        .   o   o|
|             + .*|
|            . o*+|
+-----------------+
```

#### 公開鍵をauthorized_keysに登録
```bash
$ ssh-copy-id localhost
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is 36:6c:bc:ed:fc:72:e7:d4:c2:65:3d:0d:23:42:9e:74.
Are you sure you want to continue connecting (yes/no)? yes # yes応答
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
vagrant@localhost's password:
Now try logging into the machine, with "ssh 'localhost'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
```

### インベントリファイル作成
インベントリファイルとは、Ansibleで実行するサーバのリストを定義します
WEBサーバ、DBサーバといったグルーピング分けもすることが可能となっています。

```bash
$ vi hosts
```

```hosts
[ansible]
localhost

### [ ]でグルーピングする、大きなくくりを指定し、次に適用するサーバを記載していきます。
```
インベントリファイルは、デフォルトでは下記のパスになってます。
`/etc/ansible/hosts`

上記のパスを定義しているファイルは下記となっています。
`/etc/ansible/ansible.cfg`

`ansible.cfg`ファイルが読み込まれる順序は下記のようになっています。

 - 環境変数で指定 ANSIBLE_CONFIG
 - カレントディレクトリ
 - ~/.ansible.cfg
 - /etc/ansible/ansible.cfg

コマンドオプション`-i`でhostsファイルを指定することも可能です。


### ansible.cfg作成
```bash
$ vi ansible.cfg
```

内容は下記

```ansible.cfg
[defaults]
hostfile = ./hosts
```

### ansibleコマンドお試し実行
```bash
$ ansible all -m ping
### all 全てにグループに適用
### -m ansibleモジュールを使用
localhost | success >> {
    "changed": false,
    "ping": "pong"
}

```
ping応答があることが確認できました。

## [事後確認・作業]
特に無し