【Ansibleチュートリアル】基礎の基礎の基礎の基礎編

## はじめに
これはあくまで個人的なメモです。

Ansibleを触る機会があったので
詰まったところなどを解消しつつメモ程度にチュートリアルとして残したくQiitaを利用しました。

## 前提条件

- Vagrantがインストールされている
- VirtualBoxがインストールされている


## vagrant Boxを手に入れよう

centos6.7となっておりますがこれは任意に名前を付ける事が可能な為
centos-6.7などの場合もあります。

### box listを確認する

```shell:hostPC(mac)
$ vagrant box list

centos6.7 (virtualbox, 0)
```

### boxをダウンロードする(※centos6.7があればスキップ)

```shell:hostPC(mac)
$ vagrant box add centos6.7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
```


## 作業ディレクトリを作りvagrantファイルを編集する

### 作業ディレクトリの作成と移動

```shell:hostPC(mac)
$ mkdir ~/ansible
$ cd ~/ansible
```

### Vagrantfileの作成

```shell:hostPC(mac)
# centos6.7の部分はvagrantのbox名
$ vagrant init centos6.7
$ vi Vagrantfile
```

自分は全消しで以下を記入しました。

```yml:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.ssh.insert_key = false

  config.vm.define "webserver1" do |webserver1|
    webserver1.vm.hostname = "webserver1"
    webserver1.vm.box = "centos6.7"
    webserver1.vm.network "private_network", ip: "192.168.33.21"
  end

  config.vm.define "webserver2" do |webserver2|
    webserver2.vm.hostname = "webserver2"
    webserver2.vm.box = "centos6.7"
    webserver2.vm.network "private_network", ip: "192.168.33.22"
  end

end
```

### vagrant立ち上げ

```shell:hostPC(mac)
$ vagrant up
```

### 詳細確認

```shell:hostPC(mac)
$ vagrant ssh-config

Host webserver1
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/{User名}/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

Host webserver2
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/{User名}/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

今回は
webserver1をansibleの適用対象とし
webserver2をansible環境として運用しましょう。

この時私は失敗したと思いました。
ansibleという名前と
targetで分ければよかったと。。。orz


## ansibleインストール

```shell:hostPC(mac)
$ vagrant ssh webserver2
```

```shell:(ssh)webserver2
[vagrant@webserver2 ~]$ sudo yum -y install ansible
```

## ssh-keyの設定関係

ansible環境から対象環境へsshで接続できるように
sshのキーをwebserver2=>webserver1へ送ります。

### ssh-keyの生成とコピー

```shell:(ssh)webserver2
[vagrant@webserver2 ~]$ ssh-keygen -t rsa
[vagrant@webserver2 ~]$ ssh-copy-id vagrant@192.168.33.21
# 色々聞かれますがenter連打でokです
# 最後にpasswordを聞かれますが、vagrantが初期パスワードになっています
```

### ssh接続確認

```shell:(ssh)webserver2
[vagrant@webserver2 ~]$ ssh vagrant@192.168.33.21
[vagrant@webserver1 ~]$

# 2から1にノンパスで行けるようになったので成功です
```



## インベントリの作成

インベントリは、反映先サーバの一覧のようです。

一般的には、**hosts**という名前で利用されるようです。

### インベントリの作成

```shell:hostPC(mac)
$ vi ~/ansible/hosts
```

```yml:~/ansible/hosts
[webserver]
192.168.33.21
```

### 気分転換に疎通確認をしてみる

```shell:(ssh)webserver2
[vagrant@webserver2 ~]$ cd /vagrant/
[vagrant@webserver2 vagrant]$ ansible all -i hosts -m ping

192.168.33.21 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```


## (ここからが本編)Playbookを作成する

playbookを利用しtargetであるwebserver1にnginxをインストールさせます

またplaybookには大きく分けて３つの定義が必要になるそうです

- **target**
    - どこに・誰が実行するか

- **vars**
    - 変数を指定する(taskで使用する)

- **task**
    - どんなことをするかモジュール使って記述する

以上を踏まえてplaybookを作成します

### playbookを記述する


```shell:hostPC(mac)
$ vi ~/ansible/nginx.yml
```

```yml:~/ansible/nginx.yml
- hosts: webserver
  become: True
  tasks:
  - name: install nginx repo
    yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present
  - name: install nginx
    yum: name=nginx
  - name: restart nginx
    service: name=nginx state=restarted
```

#### それぞれの意味

- hosts:
    - hostの指定。今回はグループを指定している。
- become:
    - sudoとして実行する
- tasks:
    - 実行するタスク。ここに記述した順に実行されていく
- name:
    - タスクの名前
- yum:
    - yumモジュールを利用
- service:
    - Serviceモジュールを利用

※Ansibleでは決まったディレクトリなどから情報を暗黙的に取得するため、依存関係を理解しておく必要がある。

## ansible実行

### 適用実行する

```shell:(ssh)webserver2
[vagrant@webserver2 vagrant]$ ansible-playbook -i hosts nginx.yml
```
<img width="716" alt="スクリーンショット_2018-01-18_16_03_46.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/bdf31d1c-1f3c-d301-2904-790bad99bc2f.png">


### もう一度実行してみる

```shell:(ssh)webserver2
[vagrant@webserver2 vagrant]$ ansible-playbook -i hosts nginx.yml
```

nginxはすでにinstallされている為okとなっています。
ただしrestartタスクは何度でもできるものとなっている為
changed=1になっている事がわかります。

<img width="715" alt="スクリーンショット 2018-01-18 15.58.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/dbf6f1ed-99bd-29c4-a10b-91a8e2c3fd78.png">

## 表示してみる

http://192.168.33.21

<img width="1440" alt="スクリーンショット 2018-01-18 15.56.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/a1a6d827-f59a-0b0e-8706-7a56dd4fd5c7.png">


## 最後に

インストール物などを全てコードベースで残す事ができるのは便利ですね。
何か変更があった際、githubなどで差分などを確認できますし
何より目に見える形で残せるのはとても良いです！

共有も簡単でインストールに間違いなども起こらないのでステキです！



参考元：[VagrantでAnsible超初歩ハンズオン](https://qiita.com/da-sugi/items/65ee9034bdb313fed1ab)
　　　：[【チュートリアル】Ansible 基本のキ (インストールから複数サーバへの変更適用)](https://qiita.com/KeijiYONEDA/items/c4c909608b61fb4954eb)
　　　：[Ansible Documentation](http://docs.ansible.com/)