はじめに
前回までで、sshでのログオンが可能なEC2インスタンスの作成ができました。
今回は初期状態のAmazon Linuxサーバーに共通で実施しておきたい設定などを行います。
- aws上に作成したansibleサーバーでテストサイトを構築する
ssh接続のオプション設定
最終的にはansible-playbook
コマンドを実行したらノータッチでサイトが出来上がってほしいです。
が、EC2インスタンス作成直後にSSH接続するとホストキーの確認で実行が止まってしまうので対策します。
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サーバー以外何もない状態からワンコマンドでテストサイトを作成する」なので。
---
- import_playbook: aws_infra.yml
- import_playbook: wordpress.yml
- hosts: all
become: true
roles:
- { role: common, tags: [common] }
共通設定ロールの作成
wordpress.yml
に記載したcommon
ロールを作成します。
common
ロールには、Amazon Linuxを利用するときに共通で実行したい処理を実装します。
$ mkdir -p roles/common/tasks
今回使用している Amazon Linux (ami-2a69be4c)では、SELinuxは無効になっており、firewalldもインストールされていないので、設定変更としてはタイムゾーンの変更とrpmの最新化のみ実施しています。
---
- 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
実行結果。
$ 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インスタンスの作成ということですね。
- name: wait for ssh
wait_for:
host: "{{ aws_create_ec2.tagged_instances[0].public_ip }}"
port: 22
次回
次回はnginxのインストールなど、Webサーバーとしての構成を行います。