aws上に作成したansibleサーバーでテストサイトを構築する(1) Ansibleサーバー構築

# はじめに
EC2上に構築したAnsibleサーバーで、新しいVPCの作成、EC2インスタンスの準備、ELBでの冗長化、RDSの作成をして、テストサイトを構築してみます。
テスト対象のWebアプリは何でもいいのですが、ここではwordpressをインストールすることにしました。
今回作成するのは、素のwordpressを準備するところまでで、カスタマイズ部分をデプロイして、テストする部分は含めません。

- aws上に作成したansibleサーバーでテストサイトを構築する
  1. [Ansibleサーバー構築](https://qiita.com/yoshino_dd/items/1e0969fd6dab1b51e1e0)
  1. [AWSネットワーク構成](https://qiita.com/yoshino_dd/items/d9be528837803ebb4bd3)
  1. [EC2インスタンスの作成](https://qiita.com/yoshino_dd/items/4368e468c6aa5353bf3c)
  1. [サーバー共通の設定](https://qiita.com/yoshino_dd/items/3fa56fc09e9162d6ad4a)
  1. [Webサーバーの構成](https://qiita.com/yoshino_dd/items/1292d6b3beeae26433f7)
  1. [RDSの構成-1](https://qiita.com/yoshino_dd/items/8d559b60d5b9f316d8bb)
  1. [RDSの構成-2](https://qiita.com/yoshino_dd/items/1da42dc2d1446ec20526)
  1. [WordPressの設定](https://qiita.com/yoshino_dd/items/d41694d468c5c64d78a0)
  1. 参考にしたサイトなど

# AWSアカウントの準備
AWSのアカウント作成については記載しませんので、適宜作成してください。
新規で作成したときには、以下のページなどを参考にしてアカウントの保護をしたほうがよいでしょう。

- [AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](http://qiita.com/tmknom/items/303db2d1d928db720888)

今回は、IAMロールを割り当てるのでその権限があるアカウントでAWSにサインインする必要があります。

# Ansibleサーバー用インスタンスの準備
まず最初に、環境を構築・管理するAnsibleサーバーを構築します。AWS上の最初のサーバーなので手作業で実施します。

## インスタンスの設定
AWSマネジメントコンソールでデフォルトのVPC上にEC2インスタンスを作成します。
画面上部の「サービス」から「EC2」を開き、「インスタンスの作成」をクリックします。
マシンイメージの選択画面となるので、ここでは無料枠のAmazon Linuxである`ami-2a69be4c`を選択します。
![2017-10-27_11h32_48.png](https://qiita-image-store.s3.amazonaws.com/0/150514/beaf2993-e396-15b9-fd57-14db73bac791.png)

EC2のタイプは同じく無料枠の`t2.micro`を選択。
![2017-10-03_11h21_27.png](https://qiita-image-store.s3.amazonaws.com/0/150514/b0dae434-0262-a7c0-568b-e053bb7cd3f4.png)

選択したら「確認と作成」ではなく、「次の手順：インスタンスの詳細の設定」をクリックします。

## ネットワークの設定
ネットワーク関連の設定で、自動割り当てパブリックIPが有効になっていることを確認してください。(既定で作成されているサブネットでは有効になっているはずです。)
これがないと作ったサーバーに外からログインできません。(後からでも変更はできます)
![2017-10-03_11h25_55.png](https://qiita-image-store.s3.amazonaws.com/0/150514/234da28d-bef8-d099-2c23-98342b5748a9.png)

## IAMロールの設定
今回作成するインスタンスには、IAMロールを使用してAWSの操作を許可するように設定します。
ACCESS_KEYを使う方法もありますが、今回はせっかくEC2インスタンス上にAnsibleサーバーを構築するので、キーやAWSアカウントの管理を考えなくてもよいようにロールを使用します。

上の画面で「新しいIAMロールの作成」をクリックして、「IAM Management Console」で「ロールの作成」をクリックします。
「ロールタイプの選択」画面が表示されるので「AWSサービス」から「EC2」を選択。
![2017-10-03_12h01_15.png](https://qiita-image-store.s3.amazonaws.com/0/150514/c5cffc70-bd09-8aef-db2d-505d103f5eed.png)
![2017-10-03_12h05_33.png](https://qiita-image-store.s3.amazonaws.com/0/150514/78741a5a-6eb7-23f9-c0c2-4f69e936f1c7.png)

アクセス権限は「AmazonEC2FullAccess」を割り当てて[^1]ください。
![2017-10-03_12h08_11.png](https://qiita-image-store.s3.amazonaws.com/0/150514/35e5cef2-f594-2bd4-c757-e78659b41449.png)

最後の確認画面で、作成したロールの名前を付けます。ここでは「ansible_server_role」としました。
![2017-10-03_12h16_01.png](https://qiita-image-store.s3.amazonaws.com/0/150514/c298fdcd-c2e2-d5c2-9696-a8aed5d50b44.png)

[^1]: 権限が適切かはあまりわかっていません…

残りの選択肢は変更せず、「確認と作成」をクリックします。

## セキュリティグループの設定
「インスタンス作成の確認」画面が表示されます。
ここで作成するEC2インスタンスへのSSH接続のみを許可するセキュリティグループを作成します。
「セキュリティグループの編集」をクリックしてください。
![2017-10-03_12h22_07.png](https://qiita-image-store.s3.amazonaws.com/0/150514/430fa808-390b-d44a-67c3-17578968e41b.png)

EC2の作成、操作を許可する権限をつけているので、可能であれば接続元となるソースはマイIPなどを指定して絞り込んだほうがよいでしょう。
![2017-10-03_12h27_04.png](https://qiita-image-store.s3.amazonaws.com/0/150514/2c889b71-ea10-299d-aab4-93f92763ecab.png)

## アクセス用キーペアの設定
すべて入力して「確認と作成」ボタンをクリックすると、インスタンスへのSSH接続に使用するキーペアが要求されます。
「新しいキーペアの作成」を選択してキーペア名を入力し、「キーペアのダウンロード」をクリックして秘密鍵をダウンロードしてください。
ここでは「ansible-server-key」としました。
![2017-10-27_11h46_58.png](https://qiita-image-store.s3.amazonaws.com/0/150514/5c652cfd-79eb-b16f-5b72-27ed4f49f287.png)

「インスタンスの作成」をクリックすると仮想マシンの作成が始まります。

# Ansible関連パッケージのインストール
インスタンスが起動したら、グローバルIPアドレス宛にSSHで接続してみましょう。
認証には前項でダウンロードした秘密鍵を使用します。ユーザーは`ec2-user`です。

SSHで無事接続できたら、ansibleサーバーとしてのセットアップを実行します。
AnsibleでAWSを操作するためにはbotoが必要ですが、AWS関連のモジュールで便利なものはboto3を要求するので、そちらもインストールします。

```shell-session:command
$ sudo su -
# yum update -y
# pip install ansible
# pip install boto3
```

後はお好みでgitなどをインストールしてください。
また、このサーバー上で頻繁に作業することになるので、ローカルのホスト名表示だけでも変更しておいたほうが混乱しにくいでしょう。[^2]

[^2]: [Linux インスタンスのホスト名の変更 - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html)

できあがったサーバーのAnsible関連のバージョンは以下の通りとなりました。

```shell-session:command
$ python --version
Python 2.7.12

$ aws --version
aws-cli/1.11.132 Python/2.7.12 Linux/4.9.51-10.52.amzn1.x86_64 botocore/1.7.36

$ pip list | grep -i boto
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
boto (2.42.0)
boto3 (1.4.7)
botocore (1.7.36)

$ ansible --version
ansible 2.4.1.0
  config file = None
  configured module search path = [u'/home/ec2-user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python2.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.12 (default, Sep  1 2016, 22:14:00) [GCC 4.8.3 20140911 (Red Hat 4.8.3-9)]
```

pipからWarningが出ていますが、以下のファイルを作成すると出なくなります。[^3]

```ini:~/.pip/pip.conf
[list]
format = legacy
```

[^3]: [[小ネタ] pip 9 系にしたら pip list で警告出るようになったので止めたい](https://dev.classmethod.jp/server-side/language/pip-9-pip-list-deprecate-message/)

# 次回
次回はAnsibleを使用して、テストサイト用のAWSのネットワーク関連リソースを作成していきます。

- [aws上に作成したansibleサーバーでテストサイトを構築する(2) AWSネットワーク構成](https://qiita.com/yoshino_dd/items/d9be528837803ebb4bd3)

---