Ansible 最初の一歩 @ AWS EC2

## Ansibleとは
+ Ansibleの特徴
    - エージェントレスでサーバ構築を自動化してくれるツールです。
    - 構築対象のサーバはsshdが動作していてSSHで接続できればOKです。
    - 設定ファイルはYAMLで書きます。プログラムの知識（Ruby、Python、etc.）は不要です。
    - 数台～数十台規模のサーバ構築を想定しています。

## 準備
+ **Amsibleのインストール**  
    AnsibleをAmazon Linuxにインストールします。
    Amazon LinuxにEPELからAnsibleをインストールする場合、`yum install` に `--enablerepo=epel` オプションを指定します。  

    ```Bash
    [ec2-user@ip-172-31-24-21 ~]$ sudo su -
    [root@ip-172-31-24-21 ~]# yum --enablerepo=epel install ansible
    ```

    途中「y」と答えながらインストールに成功すると、Ansibleは、/etc/ansible にインストールされます。
    このまま Ansible を実行しようとすると、以下のエラーメッセージがでます。

    ```Bash
    Traceback (most recent call last):
      File "/usr/bin/ansible", line 44, in <module>
        import ansible.constants as C
    ImportError: No module named ansible.constants
    ```

    pipでAnsibleをインストールするとエラーが解消します。

    ```Bash
    [root@ip-172-31-24-21 ~]# pip install ansible
    ```
    　  

+ **Ansibleの管理対象マシンを設定**  

    /etc/ansible/hostsファイルに管理対象マシンを登録します。「#」はコメント行を意味します。

    ```hosts
    #172.31.21.132
    ec2_client01
    #172.31.30.162
    ec2_client02
    ```

    [webservers]のようにグループ指定を行うことができます。今回は、グループ指定をしていないため、全体に登録されたことになります。
    　  

+ **EC2インスタンス作成**  
    以下の３台のEC2 Amazon Linuxインスタンスを作成します。

    | マシン名      | IPアドレス    | 用途               |
    |:-------------|:--------------|:------------------|
    | ec2_ansible  | 172.31.24.21  | Ansible実行マシン  |
    | ec2_client01 | 172.31.21.132 | 設定対象マシン１    |
    | ec2_client02 | 172.31.30.162 | 設定対象マシン２    |
    
    設定はデフォルト（22番ポートのみ通信可能）のままでOKです。
    　  

+ **SSH接続の設定**  
    Ansible実行マシンから設定対象マシンに自動でSSH接続できるように設定します。
    Ansible実行マシン（ec2_ansible）に /root/.ssh/config ファイルを作成します。

    ```/root/.ssh/config
    Host ec2_client01
      HostName 172.31.21.132
      Port 22
      User ec2-user
      IdentityFile ~/.ssh/ansible-key
    Host ec2_client02
      HostName 172.31.30.162
      Port 22
      User ec2-user
      IdentityFile ~/.ssh/ansible-key
    ```

    Ansible実行マシン（ec2_ansible）の ~/.ssh に秘密鍵（ansible-key）を配置します。設定対象マシン１、設定対象マシン２の ~/.ssh/には公開鍵を配置します。  
    ssh コマンドで、Ansible実行マシンから設定対象マシン１/２にSSH接続できるようになります。

    ```/root/.ssh/config
    [root@ip-172-31-24-21 ansible]# ssh ec2_client01
    [root@ip-172-31-24-21 ansible]# ssh ec2_client02
    ```

    ※ 初回は問い合わせがありますが、２回目以降は自動でログインします。

## 動作確認
+ **失敗テスト**  
    -m オプションでAnsibleのモジュールを実行することができます。
    EC2のインスタンスを停止したまま`ansible all -m ping`コマンドを実行すると以下のように失敗します。

    ```Bash
    [root@ip-172-31-24-21 ansible]# ansible all -m ping
    ec2_client01 | UNREACHABLE! => {
        "changed": false,
        "msg": "Failed to connect to the host via ssh.",
        "unreachable": true
    }
    ec2_client02 | UNREACHABLE! => {
        "changed": false,
        "msg": "Failed to connect to the host via ssh.",
        "unreachable": true
    }
    ```
    　  

+ **成功テスト**  
    EC2のインスタンスを起動して`ansible all -m ping`コマンドを実行すると以下のように成功します。

    ```Bash
    [root@ip-172-31-24-21 ansible]# ansible all -m ping
    ec2_client01 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    ec2_client02 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    ```
    　

+ **コマンド実行**  
    -a オプションで、コマンドを実行することができます。

    ```Bash
    [root@ip-172-31-24-21 ~]# ansible all -a "pwd"
    ec2_client01 | SUCCESS | rc=0 >>
    /home/ec2-user
    
    ec2_client02 | SUCCESS | rc=0 >>
    /home/ec2-user
    ```

## Next Step
次は、Oracle JDKをPlaybookを使ってインストールしてみます。
　　[AnsibleのPlayBookでOracle JDKをインストールする](http://qiita.com/olympic2020/items/b97b911b13b37d0bb238)