AnsibleをインストールしてからVagrantの仮想環境にPython環境を構築するまで

MacからVagrantの仮想マシンにAnsibleを使ってPython環境を設定するまでの流れを記録しておきます。

## 前提
#### 環境

+ ホスト
    + MacBookAir(2011) OS X 10
    + virtualenv, virtualenvwrappeが入ってること
+ 仮想環境
    + Vagrant 1.8.5
    + VirtualBox 5.0.14
    + ubuntu/trusty64 (14.04)

#### 私の実力

* プログラミング歴1年
* Vagrant歴1ヶ月
* Ansible歴2日
* こんなぺーぺーでも遊べました。

## 手順

1. 仮想マシンの準備

    1. 仮想マシンの設定ファイルを置いておきたいフォルダ(AnsTest)に移動する。
    1. ```vagrant init ubuntu/trusty64```
    1. ```Vagrantfile```というファイルが作成されるので好きなエディタで開く。
    2. ```  config.vm.network "private_network", ip: "192.168.33.10"```のコメントアウトを外す。

1. ホスト上にPython仮想環境の作成

    1. ```mkvirtualenv ans --no-site-packages --python=(Pythonのパス)```
    2. Python 2.x系を指定すること。Python 3.x系は将来的に対応する予定らしい。

1. Ansibleのインストール

    1. ```pip install ansible```

1. インベントリファイルの作成、配置

    2. ```/etc/ansible```に```hosts```という名前(任意)で配置する。
    3. 以下の内容を書き込む。[]の中はあとでplaybookのなかでhostとして指定する名前、IPアドレスはVagrantfileでコメントアウトした行にあるものを記入。

    ```hosts
    [AnsTest]
    192.168.33.10
    ```

1. プレイブックの作成

   * 中身についてはのちほど。

   ```provision_vagrant.yml
   - hosts: AnsTest
     become: yes
     user: vagrant
     tasks:
         - name: Install essentials
           apt: pkg={{ item }} update_cache=yes state=present
           with_items:
               - vim
               - git
               - build-essential
               - libssl-dev
               - zlib1g-dev
               - libbz2-dev
               - libreadline-dev
               - libsqlite3-dev
               - wget
               - curl
               - llvm
               - libncurses5-dev
               - libncursesw5-dev
               - xz-utils

         - name: Clone pyenv 
           become: yes
           become_user: vagrant
           git: 
              repo: https://github.com/yyuu/pyenv.git 
              dest: /home/vagrant/.pyenv
         - name: Edit bash
           become: yes
           become_user: vagrant
           blockinfile: 
              create: yes
              dest: /home/vagrant/.bash_profile
              content: |
                # pyenv
                export PYENV_ROOT=/home/vagrant/.pyenv
                export PATH=$PYENV_ROOT/bin:$PATH
                eval "$(pyenv init -)"
         - name: Install Pythons
           become: yes
           become_user: vagrant
           shell: . /home/vagrant/.bash_profile && pyenv install -s 2.7.11 && pyenv install -s 3.5.1
   ```

1. Ansibleの実行
   1. ```ansible-playbook provision_vagrant.yml -k```
   1. ```-k```オプションをつけるとパスワードを求められます。ないと認証失敗的なエラーが出るかも。デフォルトのままなら```vagrant```です。

## プレイブックの中身について
基本的な書き方やモジュールの使い方については他にたくさん良い記事があるので、自分がはまったところについてのみ書いておきます。

* 基本的なタスクの書き方

```
- name: 処理のなまえ
  (モジュール名):(...)
  (モジュールの実行詳細):(...)
- name: 処理のなまえ
  (モジュール名):(...)
  (モジュールの実行詳細):(...)

(...)
```
しかし場合によって```属性=値```をモジュール名の横にならべて書いたり、{{変数}}はダブルクオートしろと言われたり言われなかったり、文法がまだ把握できません。

* 実行時のユーザー
    最初はユーザを指定せず、二行目の```become: yes```だけで実行したのですが、あとで```vagrant ssh```でSSH接続して```pyenv uninstall```しようとしたところ、権限がないということで削除できませんでした。

* 環境変数について
   * これが一番時間をとられました。最初はパス周りを```.bashrc```に書き込んでいたのですが、```blockinfile```などで書き込んで次のタスクに行くと[別シェルで起動する](http://qiita.com/FGtatsuro/items/2366c93131c47aef8dfe)のか
、.bashrcに書き込んだ設定が反映されていない状態で```pyenv install x.x.x```しようとしてエラーになります。
   * じゃあその場で読み込めば良いと思い、```. /home/vagrant/.bashrc```で無理やり読み込ませてもだめで、試行錯誤の結果書き込み先を```.bash_profile```にすることで動くようになりました。
   * 私のAnsible歴の半分はこの環境変数まわりの格闘でした...[これ](http://stackoverflow.com/questions/22256884/not-possible-to-source-bashrc-with-ansible)をみて無理やり動くところまで持って行きました。.bashrc、.bash_profileなどの違いについては[こちら](http://qiita.com/hirokishirai/items/5a529c8395c4b336bf31)が参考になるかと思います。

##　今後の目標
* Webサーバの設定をする。
* プレイブックがそこらじゅうに散らかっているのはどう考えても良くないので、[このあたり](http://docs.ansible.com/ansible/playbooks_best_practices.html)
を参考に構成をもっとスマートにする。
* 仮想マシンでなくクラウド環境に対して実行する。


## 参考
[Ansible コトハジメ](http://qiita.com/t_nakayama0714/items/3a7ac08797b69a31533b#python-3%E5%AF%BE%E5%BF%9C)

[Ansible 入門](http://qiita.com/ArimaRyunosuke/items/1f9d840311584d8160bc)