aws上に作成したansibleサーバーでテストサイトを構築する(4) サーバー共通の設定

# はじめに
[前回]()までで、sshでのログオンが可能なEC2インスタンスの作成ができました。
今回は初期状態のAmazon Linuxサーバーに共通で実施しておきたい設定などを行います。

- 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. 参考にしたサイトなど

# ssh接続のオプション設定
最終的には`ansible-playbook`コマンドを実行したらノータッチでサイトが出来上がってほしいです。
が、EC2インスタンス作成直後にSSH接続するとホストキーの確認で実行が止まってしまうので対策します。
`ansible.cfg`を以下のように修正します。

```ini:ansible.cfg
[defaults]
inventory = ./inventories

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
```

ansibleがssh接続を実行する際に、ホストキーの確認を抑止し、さらに接続先から取得したホストキーの書き込み先を`/dev/null`にして記録させないことで、Playbookを繰り返し実行しても大丈夫なようにしています。

# フォルダ構成
ここまででフォルダ構成は以下のようになっています。

```
.
|-- ansible.cfg
|-- aws_infra.yml
|-- group_vars
|   `-- all.yml
|-- inventories
|   `-- hosts
|-- roles
|   |-- aws_ec2
|   |   `-- tasks
|   |       `-- main.yml
|   `-- aws_network
|       `-- tasks
|           |-- create_keypair.yml
|           |-- create_vpc.yml
|           `-- main.yml
`-- site.yml
```

# Playの追加

各サーバーへの設定を行っていく段階に入りましたので、その処理を行うPlaybook、`wordpress.yml`を新しく作成することにします。

これは`site.yml`から呼び出すようにします。
`wordpress.yml`単体でも実行できるようにしますが、最終目標は「Ansibleサーバー以外何もない状態からワンコマンドでテストサイトを作成する」なので。

```yaml:site.yml
---
- import_playbook: aws_infra.yml
- import_playbook: wordpress.yml
```

```yaml:wordpress.yml
- hosts: all
  become: true
  roles:
  - { role: common, tags: [common] }
```

# 共通設定ロールの作成

`wordpress.yml`に記載した`common`ロールを作成します。
`common`ロールには、Amazon Linuxを利用するときに共通で実行したい処理を実装します。

```shell-session:command
$ mkdir -p roles/common/tasks
```

今回使用している Amazon Linux (ami-2a69be4c)では、SELinuxは無効になっており、firewalldもインストールされていないので、設定変更としてはタイムゾーンの変更とrpmの最新化のみ実施しています。

```yaml:roles/common/tasks/main.yml
---
- name: The timezone setting should to be Tokyo.
  file:
    src: /usr/share/zoneinfo/Asia/Tokyo
    dest: /etc/localtime
    state: link
    force: yes

- name: upgrade all packages
  yum: name=* state=latest
```

実行結果。

```shell-session:command
$ ansible-playbook site.yml

PLAY [localhost] ***********************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************
ok: [localhost]

…<中略>…

TASK [aws_ec2 : create ec2 instance] ***************************************************************************************
ok: [web01]

TASK [aws_ec2 : write host list] *******************************************************************************************
ok: [web01] => (item=web01)

PLAY [all] *****************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************
ok: [web01]

TASK [common : The timezone setting should to be Tokyo.] *******************************************************************
changed: [web01]

TASK [common : upgrade all packages] ***************************************************************************************
changed: [web01]

PLAY RECAP *****************************************************************************************************************
localhost                  : ok=9    changed=0    unreachable=0    failed=0
web01                      : ok=9    changed=2    unreachable=0    failed=0
```

# EC2作成後、ssh可能になるまで待機
なお、EC2インスタンスが存在しない状態から`site.yml`を実行すると、インスタンス作成後、SSH接続が可能になるまでタイムラグがあるため、`wordpress.yml`実行時にタイムアウトしてエラー終了することがあります。
これを回避するため、`aws_ec2`ロールの最後にSSH起動するまで待機するタスクを追加します。
SSH接続できるようになるまでがEC2インスタンスの作成ということですね。

```yaml:roles/aws_ec2/tasks/main.yml(追記)
- name: wait for ssh
  wait_for:
    host: "{{ aws_create_ec2.tagged_instances[0].public_ip }}"
    port: 22
```

# 次回
次回はnginxのインストールなど、Webサーバーとしての構成を行います。

- [aws上に作成したansibleサーバーでテストサイトを構築する(5) Webサーバーの構成](https://qiita.com/yoshino_dd/items/1292d6b3beeae26433f7)

---
---