VMの作成とAnsibleによるWebサーバーの構築

# 全体の構成

記事初めて書きます。まだエンジニアになりたてですので間違った記述等があったらご指摘いただけると幸いです。

今回は備忘録として書きます。


全体としてこのような構成を目指しました。

![スクリーンショット 2019-01-22 15.59.11.png](https://qiita-image-store.s3.amazonaws.com/0/347450/434bdc6d-ed30-a611-0755-a18a77ba94df.png)

- VM1にAnsibleを導入
- 導入したAnsibleでVM2にapacheを導入し、webサーバーを構築する
- 構築したwebサーバにMacからアクセスする。



# VMの作成



- 環境
    - ホストOS:Mac
    - VM1:centOS7.2
    - VM2:centOS7.2

- 前提
    - vagrant導入済(ver 5.2)
    - VirtualBox導入済(ver 2.2.3)

Vagrantfileは下記の通り。

```ruby:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.define "ansible_server" do |vm01|
        vm01.vm.box = "bento/centos-7.2"
        vm01.vm.hostname = "ansible-server"
        vm01.vm.network :private_network, ip: "192.168.1.10"
        vm01.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210
        vm01.vm.network :forwarded_port, id: "http", guest: 80, host: 3400
  end
  config.vm.define "ansible_target" do |vm02|
        vm02.vm.box = "bento/centos-7.2"
        vm02.vm.hostname = "ansible-target"
        vm02.vm.network :private_network, ip: "192.168.1.20"
        vm02.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2220
        vm02.vm.network :forwarded_port, id: "http", guest: 80, host: 3500
  end
end
```
vagrant upしてVM1にssh接続します。ルート権限で入りました。初期パスワードは"vagrant"

```shell:Mac
vagrant up
```
```shell:Mac~ansible-server
$ ssh root@localhost -p 2210
root@localhost's password:

[root@ansible-server ~]#
```

# Ansibleのインストール

早速Ansibleをインストールします。

```shell:ansible-server
[root@ansible-server ~]# yum install ansible

```
anisbleで対象のサーバーのプロビジョニングを行うには、対象サーバーとssh通信が行えている必要があります。よって対象サーバーに公開鍵を送り込んでssh通信を行えるようにします。

```shell:ansible-sserver
[root@ansible-server ~]# ssh-keygen -t rsa

[root@ansible-server ~]# ssh-copy-id root@192.168.1.20
```

# プロビジョニング

「web」というフォルダを作成して、そこで作業を行いました。
下記のような構成でプロビジョニングしました。

```shell:ansible-server
[root@ansible-server web]# tree
.
├── apache.yml
├── files
│   └── index.html
└── hosts
```
hostsには、Ansibleによるプロビジョニングの対象となるサーバーのIPアドレスを記述します。

```ini:hosts
[ansible-target]
192.168.1.20
```

apache.ymlはAnsibleが自動で処理するタスクで、下記のように書きました。

```yaml:apache.yml

　- name: install and start apache
    hosts: ansible-target
    become: yes

  tasks:
  - name: httpd package is present
    yum:
      name: httpd
      state: latest

  - name: latest index. html file is present
    copy: src=./files/index.html dest=/var/www/html/

  - name: httpd is started
    service:
      name: httpd
      state: started

  - name: start firewalld
    command: systemctl start firewalld.service

  - name: open 80
    command: firewall-cmd --zone=public --add-service=http --permanent

  - name: restart firewall
    command: firewall-cmd --reload

```
index.htmlはこちらです

```html:files/index.html

<p>herohero</p>
```

ansible-playbookで実際にプロビジョニングをする前に、--checkをつけて確認しました。

```shell:ansible-server
ansible-playbook --check -i hosts apache.yml

PLAY [install and start apache] **************************************************************************************************************************
・
・
PLAY RECAP ***********************************************************************************************************************************************
192.168.1.20               : ok=4    changed=3    unreachable=0    failed=0

```

本実行ではもちろん外す。


```shell:ansible-server
[root@ansible-server web]# ansible-playbook -i hosts apache.yml
・
・
PLAY RECAP ***********************************************************************************************************************************************
192.168.1.20               : ok=7    changed=6    unreachable=0    failed=0
```

少しcheckバージョンと内容が違う。
vagrantによりVMを作成するときに80番ポートを3500番にフォワードする設定をしていたので、localhost:3500にアクセスすると.
.


![スクリーンショット 2019-01-22 17.37.50.png](https://qiita-image-store.s3.amazonaws.com/0/347450/32b242ff-b57f-f96e-31d8-ac8db62cbe98.png)

アクセスできました。

#今回詰まったところ
何故か単純に80番が解放された状態だけではMacからアクセスできなかった。
いろいろ調べたところ、port forwardingをすればアクセスできるとの記事が書かれたところがあったのでVagrantfileの設定からhttpのport fowardを設定したらアクセスできるようになった。
また、Ansibleでfirewallの設定はせずに、VM2を立てた時のデフォルトのままでもlocalhost:3500にアクセスできました。
この辺のネットワークの知識は今後も勉強します。

記述についてこちらのページを大いに参考にさせていただきました。
https://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c