EC2にAnsibleをインストールしてWebサーバを構築する手順を解説
Ansibeは、構築されたサーバに対して事前に定義した操作を自動で行ってくれるツールです。
以前TerraformというサーバやネットワークなどのリソースをAWS上に自動で構築するIaCツールをご紹介しました。
今回は、インフラ全体というよりサーバの中を自動で構築するようなツールになります。
こんなイメージです。
前提
このような環境のEC2サーバに対してAnsibleを使ってhttpdをインストールしたいと思います。
①の環境作成は、手動で行っても良いですし、IaCで構築しても良いです。
Terraformで作成するためのコードはGitHubにありますのでよかったらご利用ください。
こちらにEC2作成までの記事がありますので参考にしていただければ幸いです。
名称 | 役割 |
ローカル端末 | 自分の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.yml | playbook本体。ここにWebサーバでの操作を記述します。 |
hosts | playbookを実行する対象を記述するファイル。 今回は、Webサーバを指定します。 |
index.html | webサーバに表示させる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実行の流れがイメージできたら公式のドキュメントを読んで挑戦してみてください。
最後までご覧いただきありがとうございました。