Vagrant+Ansible 環境構築メモ


Homebrew caks でインストール (Macの場合)

```bash:Homebrewでインストール
$ brew cask install ansible
```



# 動作確認バージョン

下記動作確認時のバージョン

```bash:各種バージョン確認
$ VBoxManage  -v
5.0.6r103037

$ vagrant -v
Vagrant 1.7.4

$ ansible --version
ansible 1.9.2
```


# vagrant で仮想端末作成

作業用のディレクトリ作成し、その配下にVagrantfileを用意する。

```
$ mkdir ansible_test
$ cd ansible_test
$ vagrant init centos/7
```

これでひな形の Vagrantfile が出来ているので、以下の状態に変更する。

```ruby:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
end

```

ここまでの確認として `vagrant up` で仮想環境が立ち上がることを確認。
仮想環境が立ち上がったら `vagrant ssh` でアクセスできることを確認。

```
$ vagrant ssh

[vagrant@localhost ~]$ yum list installed
```

# Ansible の準備

ホストの Vagrantfile を作成した場所に provisioning ディレクトリを作成。
その配下にAnsibleが参照するInventoryファイル(ファイル名は`hosts`)を作成する。

## Inventoryファイルの用意

```provisioning/hosts
[vagrants]
192.168.33.10
```


# Ansible経由でping実行してみる

```bash:ping
$ ansible -i provisioning/hosts all -m ping -u vagrant --private-key=.vagrant/machines/default/virtualbox/private_key
```

```bash:実行結果
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}
```

# 設定ファイルの用意

ssh接続情報を ssh.config に出力

```
$ vagrant ssh-config > ssh.config
```

```ssh.config
Host 192.168.33.10
  HostName 192.168.33.10
  User vagrant
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile path/to/private_key
  IdentitiesOnly yes
  LogLevel FATAL

```

Ansible の実行オプションを ansible.cfg に記述

```ansible.cfg
[defaults]
hostfile = provisioning/hosts

[ssh_connection]
ssh_args = -F ssh.config
```

もう一度 ping してみる

```
$ ansible all -m ping
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}
```



# サンドボックスを有効化

```bash:
$ vagrant sandbox on
```

# PlayBookの作成

```provisioning/site.yml
---
- hosts: vagrants
  sudo: yes
  user: vagrant
  tasks:
    - name: install packages git
      yum: name=git update_cache=yes
```

上記PlayBookを`vagrant provision`で読み込むように設定

```Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provisioning/site.yml"
    ansible.inventory_path = "provisioning/hosts"
    ansible.limit = 'all'
  end
end
```


# provision実行

```bash:provision実行
$ vagrant provision
==> default: Running provisioner: ansible...

PLAY [vagrants] ***************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.33.10]

TASK: [install packages git] **************************************************
changed: [192.168.33.10]

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

```

自動的に仮想端末へgitがインストールされる。
仮想端末へsshでログインして git コマンドが使えることを確認。

# playbookを個別に実行

以下のようにタグを指定して実行することも可能。

```
$ ansible-playbook site.yml -t hoge
```


# 参考

## Vagrant関連

[Atlas by HashiCorp](https://atlas.hashicorp.com/)

[Ansible - Provisioning - Vagrant Documentation](http://docs.vagrantup.com/v2/provisioning/ansible.html)


## Ansible関連

[Ansible Documentation](http://docs.ansible.com/)

[AnsibleとVagrantで開発環境を構築する - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/2882/)

[Vagrant と Ansible を組み合わせて使う | CUBE SUGAR STORAGE](http://momijiame.tumblr.com/post/78187543848/vagrant-%E3%81%A8-ansible-%E3%82%92%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E4%BD%BF%E3%81%86)

[Using Vagrant and Ansible — Ansible Documentation](http://docs.ansible.com/ansible/guide_vagrant.html)

[ansible/ansible-examples](https://github.com/ansible/ansible-examples)

[Ansibleでよく使うファイル操作モジュール ｜ Developers.IO](http://dev.classmethod.jp/server-side/ansible/ansible-file-modules-intro/)

[Ansible Galaxy | Find, reuse, and share the best Ansible content](https://galaxy.ansible.com/)

[実践！Ansibleベストプラクティス（前編） - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/3084/)

[実践！Ansibleベストプラクティス（後編） - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/3086/)

[Best Practices — Ansible Documentation](http://docs.ansible.com/ansible/playbooks_best_practices.html)