LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-23

はじめに

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

ssh接続のオプション設定

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

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サーバー以外何もない状態からワンコマンドでテストサイトを作成する」なので。

site.yml
---
- include: aws_infra.yml
- include: wordpress.yml
wordpress.yml
- hosts: all
  become: true
  roles:
  - common

共通設定ロールの作成

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

command
$ mkdir -p roles/common/tasks

今回使用している Amazon Linux (ami-3bd3c45c)では、SELinuxは無効になっており、firewalld(iptables)もインストールされていないので、設定変更としてはタイムゾーンの変更とEPELリポジトリの常時有効化のみ実施しています。

ここで、yum updateも合わせて実施してます。

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: check epel status
  command: yum-config-manager epel
  changed_when: false
  register: epel_status_result

- name: epel repository is enabled
  command: yum-config-manager --enable epel
  when: "'enabled = False' in epel_status_result.stdout"

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

実行結果。

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 : check epel status] ******************************************************************************************
ok: [web01]

TASK [common : epel repository is enabled] *********************************************************************************
changed: [web01]

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

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

EC2作成後、ssh可能になるまで待機

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

roles/aws_ec2/tasks/main.yml(追記)
- name: wait until ssh is ready
  wait_for:
    host: "{{ aws_create_ec2.tagged_instances[0].public_ip }}"

次回

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



0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up