EC2にAnsibleをインストールしてWebサーバを構築する手順を解説

2022年2月9日AWS

Ansible ハンズオン EC2にWebサーバ構築

Ansibeは、構築されたサーバに対して事前に定義した操作を自動で行ってくれるツールです。

以前TerraformというサーバやネットワークなどのリソースをAWS上に自動で構築するIaCツールをご紹介しました。

今回は、インフラ全体というよりサーバの中を自動で構築するようなツールになります。

こんなイメージです。

前提

このような環境のEC2サーバに対してAnsibleを使ってhttpdをインストールしたいと思います。

①の環境作成は、手動で行っても良いですし、IaCで構築しても良いです。

Terraformで作成するためのコードはGitHubにありますのでよかったらご利用ください。

こちらにEC2作成までの記事がありますので参考にしていただければ幸いです。

ansibleでWebサーバを構築する
名称役割
ローカル端末自分のPC。(MacOS)
AnsibleサーバPlaybookを実行してWebサーバを自動で構築する。(AmazonLinux2)
WebサーバPlaybookを実行される側手動の操作は行わない。(AmazonLinux2)

Ansibleのインストール

Ansibleサーバにssh接続したところから始めます。

まずはサーバにAnsibileをインストールします。

$ sudo amazon-linux-extras install ansible2 -y

バージョン確認コマンドで以下のような表示が出ればインストール完了です。

$ ansible --version
ansible 2.6.20
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/ec2-user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.6.9 (unknown, Aug  4 2020, 23:47:46) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

秘密鍵のコピー

この作業はローカル端末で実施します。

Ansibleは対象にssh接続をして操作を実行するため秘密鍵が必要になります。

以下のコマンドで、EC2作成時に指定した秘密鍵をAnsibleサーバに配置してください。

$ scp -i [ansibleサーバに接続するための秘密鍵] [ansibleサーバが構築対象に接続するための秘密鍵]  ec2-user@[EC2のグローバルIPアドレス]:~/.ssh
# e.g.)
$ scp -i ~/.ssh/secretkey.pem ~/.ssh/secretkey.pem ec2-user@1.2.3.4:~/.ssh

Ansible実行用のファイルを作成

AnsibleサーバにWebサーバ構築用のファイルを配置します。

今回、用意するファイルは以下の通りです。

ファイル名役割
site.ymlplaybook本体。ここにWebサーバでの操作を記述します。
hostsplaybookを実行する対象を記述するファイル。 今回は、Webサーバを指定します。
index.htmlwebサーバに表示させるhtmlファイル。中身はなんでもいいです。

サンプルはGitHubにありますのでとりあえず動かしたい場合はREADMEをみがらやってみてください。

まずは、任意の名前のディレクトリを作成してください。

$ mkdir hito-ansible
$ cd hito-ansible

インベントリファイルの作成

インベントリファイルには、Playbookで設定する対象を記載します。

hostsというファイル名で作成しておりますが、コマンドを実行する時にファイルを指定するのでなんでもOKです。

ただし、デフォルトのインベントリファイルは/etc/ansible/hostsとなっています。

コマンド実行時にインベントリファイルを指定しない場合はこのファイルが読み込まれます。

# hosts
[server]
<IP ADDRESS>

[server:vars]
ansible_ssh_port=22
ansible_ssh_user=ec2-user
ansible_ssh_private_key_file=~/.ssh/<SECRET KEY>
__working_user=ec2-user

Playbookの作成

Playbookは対象にどのような操作を行うかを定義するymlファイルです。

コマンドを実行する時に指定するためこちらもファイル名は任意で問題ありません。

本記事ではWebサーバに以下の操作を行います。

  • パッケージのアップデートを実行
  • 言語設定を変更
  • httpdをインストール
  • httpdを起動/自動起動設定
  • index.htmlファイルを配置

# 対象の指定(インベントリファイルで指定した名前)
- hosts: server

  # 管理者権限で実行
  become: true

  # 以下に実際の操作を記述していく
  tasks:

    # パッケージの更新
    - name: updated yum
      yum:
        name: "*"
        state: latest
    
    # 言語設定の変更
    - name: set LANG=ja_JP.UTF-8 in /etc/locale.conf
      lineinfile:
        dest: /etc/locale.conf
        regexp: "^LANG="
        line: "LANG=ja_JP.UTF-8"
        backup: yes

    # httpdのインストール
    - name: installed httpd
      yum:
        name: httpd
        state: installed
      become: yes

    # httpdの起動・自動起動設定
    - name: httpd booted and auto boot conf
      service:
        name: httpd
        state: started
        enabled: yes
      become: yes

    # あらかじめ作っておいたindex.htmlファイルを対象に配置
    - name: deployed index.html
      template:
        src: ./index.html
        dest: /var/www/html/index.html
        mode: 0644

実行

site.ymlとhostsが作成できたら準備完了です。

Playbookの実行前には、シンタックスチェックを行います。

$ ansible-playbook -i hosts site.yml --syntax-check
playbook: site.yml

特に問題がなければ、実行します。

$ ansible-play -i hosts site.yml

初めての場合は、接続しても良いか聞かれるので、yesと回答します。

以下、実行結果です。

[ec2-user@ip-10-1-0-226 an-sample-http]$ ansible-playbook -i hosts site.yml

PLAY [server] ***********************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************
The authenticity of host '54.250.33.127 (54.250.33.127)' can't be established.
ECDSA key fingerprint is SHA256:CboF4eV9aiulzWDdVNJJWvzv1h3P1g+8E5hcLPLcsqA.
ECDSA key fingerprint is MD5:df:7c:72:14:63:4e:81:57:bb:9c:c2:c8:91:b5:02:e4.
Are you sure you want to continue connecting (yes/no)? yes
[WARNING]: Platform linux on host 54.250.33.127 is using the discovered Python interpreter at /usr/bin/python, but future
installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
ok: [54.250.33.127]

TASK [updated yum] ******************************************************************************************************************
changed: [54.250.33.127]

TASK [set LANG=ja_JP.UTF-8 in /etc/locale.conf] *************************************************************************************
changed: [54.250.33.127]

TASK [installed httpd] **************************************************************************************************************
changed: [54.250.33.127]

TASK [httpd booted and auto boot conf] **********************************************************************************************
changed: [54.250.33.127]

TASK [deployed index.html] **********************************************************************************************************
changed: [54.250.33.127]

PLAY RECAP **************************************************************************************************************************
54.250.33.127              : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[ec2-user@ip-10-1-0-226 an-sample-http]$

確認

Webサーバにアクセスしてみましょう。

hitologという見出しとこのブログのリンクが表示されればOKです!

最後に

お疲れ様でした。

今回は、とりあえず動かすところまでを目標にしているためにかなり簡略化した構成でファイルを作成しています。

しかし、ベストプラクティス的には、roleという単位でファイルを分けるなどして再利用性を高めたりすることができます。

Ansible実行の流れがイメージできたら公式のドキュメントを読んで挑戦してみてください。

最後までご覧いただきありがとうございました。

AWS

Posted by kotaro