MacでAnsible+Ubuntu仮想環境を0から構築する。

# この記事で書いたこと
CentOS関係の仮想環境を用いたAnsibleはよく記事がありますが、Ubuntu環境を構築したうえでAnsibleを行うやり方を書いたものがあまりなかったので、macで0から作ってみました。

この記事では、Mac上にVirtualBoxのUbuntu環境を作ります。さらに、Mac上のansibleでUbuntuにソフトをインストールするところまで書きます。

# 環境
- Mac OSX 10.12.4（16E195）

# HomeBrewでVagrantとVirtualBoxをインストール

brewとcaskのインストール

```sh
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install caskroom/cask/brew-cask
```

VagrantとVirtualBoxのインストール

```sh
brew cask install virtualbox
brew cask install vagrant
```

# Ansibleのインストール

Ansible動作にはpythonが必要です。
macにpythonが入っていない人は、インストールしておきます。

```sh
brew install python
```

ansibleをインストールします。

```sh
brew install ansible
```

簡単ですね。

# 仮想環境Ubuntuのインストール

vagrant initでVagrantの初期設定を作ります。vagrantのボックスはこちらから参照しました。→[Vagrant box ubuntu/trusty64 v20170619.0.0 - Vagrant Cloud](https://app.vagrantup.com/ubuntu/boxes/trusty64/versions/20170619.0.0)


```sh
 vagrant init ubuntu/trusty64
```

成功すると、Vagrantfileが作られています。vagrantは基本的にこちらにサーバ設定を書きます。


ローカルのansibleからにubuntuにアクセスするため、ローカルIPアドレスを設定します。Vagrantfile以下の文のコメントアウトを外します。

```
  config.vm.network "private_network", ip: "192.168.33.10"
```

Vagrantfileから必要箇所だけ取り出すと以下のようにすっきりします。

```
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "private_network", ip: "192.168.33.10"
end
```

さて、いよいよUbuntuを起動します。コマンドは以下。
初期化時に自動でubuntu/trusty64のイメージをダウンロードしてくれます。

```sh
vagrant up
```

大きいファイルを落としてくるので、やや時間がかかります。うまく行きましたでしょうか？赤文字でエラーなどでなければ成功です。

ではこちらでubuntuにログインします。

```sh
vagrant ssh
```

`vagrant@vagrant-ubuntu-trusty-64:~$`とでて、ログインできたことが確認できます。

(※vagtantはデフォルトだとユーザー:vagrant, パスワード: vagrantという設定になっています)

# sshでログインする。
vagrant sshを使用せず、macからsshでログインするように設定します。
まず、秘密鍵と公開鍵のペアを作成し、公開鍵をubuntuにssh-copy-idで送り込みます。

```sh
ssh-keygen -t rsa
```
問いかけがでますが、すべてEnter。すでに~/.ssh/id_rsaの秘密鍵が存在していれば、このコマンドは不要です。

ssh-copy-idで、公開鍵をubuntuに送ります。このコマンド一つでアクセス許可してくれるので、便利です。

```sh
ssh-copy-id -i ~/.ssh/id_rsa vagrant@192.168.33.10
```

入れるか試しましょう。

```sh
ssh vagrant@192.168.33.10
```

パスワードを聞かれずログインできれば成功です。


# Ansibleを試してみる。
とりあえず最初のplaybook(Ansibleで行いたい構成を書いたファイル)を作ってみます。

./test.yml:


```yml
- hosts: ubuntu
  user: vagrant
  tasks:
    - name: output message.
      debug: msg="hello ansible"
```

ubuntuという名前のサーバに対して、vagrantというユーザー名でログインし、ログを出してみます。

hosts: ubuntuとしてサーバーにubuntuという名前を付けています。任意の名前でOKです。
user: vagrantについて、今回、ubuntuへはデフォルトでvagrantというユーザーでしかログインできないので、vagrantと設定します。

さらに、同じディレクトリにホストの情報を別ファイルhostsに書きます。


./hosts:

```
[ubuntu]
192.168.33.10
```
注意！ubuntuというところは、先程hosts:に設定したホスト名です。
その下にvagrantのIPを書きました。


さて、以下コマンドでAnsibleをためします。

```yml
ansible-playbook -i hosts test.yml
```

**hostsファイルに設定したターゲットのubuntuサーバに対して、test.ymlに書いたアクションを実行します**

以下出力がでて、うまくメッセージが出力されました。

```
PLAY [ubuntu] ******************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.33.10]

TASK [output message.] *********************************************************
ok: [192.168.33.10] => {
    "msg": "hello ansible"
}

PLAY RECAP *********************************************************************
192.168.33.10              : ok=2    changed=0    unreachable=0    failed=0

```


# aptでソフトをインストール
aptで最新のNTPをインストールしてみます。
以下のプレイブックを作成します。

apt.yml(名前は任意です):

```yml
- hosts: ubuntu
  user: vagrant
  become: yes
  tasks:
    - name: install latest ntp package
      apt: pkg=ntp state=latest
```

sudoユーザーでないとパッケージのインストールができないため3行目にbecome: yesを付けています。
(ansible1.8以前はsudo:yesでよかったのですが、deplicationになり文法が変わりました。)
パッケージインストールは最終行のapt: コマンドで実行します。

以下コマンドで実行します。

```
ansible-playbook -i hosts apt.yml
```

エラー無く終了したら成功です。


以前chefを使用したことがありますが、それと比べるとymlに設定項目を描くだけで、ansibleは比較的覚えることが少なく扱いやすい印象を受けました。

あとは、ansible公式ドキュメント等を参照していろいろ作っていけそうです。

[Ansible Documentation — Ansible Documentation](http://docs.ansible.com/ansible/latest/index.html)



# 参考
大変参考になりました😄 Ansibleとはそもそも何か？と言うところから学びたい人はこちら。
[Ansibleをはじめる人に。 - Qiita](http://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c)

ベストプラクティスの構成例が書いてあります。
[Ansible チュートリアル | Ansible Tutorial in Japanese](http://yteraoka.github.io/ansible-tutorial/#simple-playbook)