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日
- こんなぺーぺーでも遊べました。
手順
-
仮想マシンの準備
- 仮想マシンの設定ファイルを置いておきたいフォルダ(AnsTest)に移動する。
vagrant init ubuntu/trusty64
-
Vagrantfile
というファイルが作成されるので好きなエディタで開く。 -
config.vm.network "private_network", ip: "192.168.33.10"
のコメントアウトを外す。
-
ホスト上にPython仮想環境の作成
mkvirtualenv ans --no-site-packages --python=(Pythonのパス)
- Python 2.x系を指定すること。Python 3.x系は将来的に対応する予定らしい。
-
Ansibleのインストール
pip install ansible
-
インベントリファイルの作成、配置
-
/etc/ansible
にhosts
という名前(任意)で配置する。 - 以下の内容を書き込む。[]の中はあとでplaybookのなかでhostとして指定する名前、IPアドレスはVagrantfileでコメントアウトした行にあるものを記入。
[AnsTest] 192.168.33.10
-
-
プレイブックの作成
- 中身についてはのちほど。
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
-
Ansibleの実行
ansible-playbook provision_vagrant.yml -k
-
-k
オプションをつけるとパスワードを求められます。ないと認証失敗的なエラーが出るかも。デフォルトのままならvagrant
です。
プレイブックの中身について
基本的な書き方やモジュールの使い方については他にたくさん良い記事があるので、自分がはまったところについてのみ書いておきます。
- 基本的なタスクの書き方
- name: 処理のなまえ
(モジュール名):(...)
(モジュールの実行詳細):(...)
- name: 処理のなまえ
(モジュール名):(...)
(モジュールの実行詳細):(...)
(...)
しかし場合によって属性=値
をモジュール名の横にならべて書いたり、{{変数}}はダブルクオートしろと言われたり言われなかったり、文法がまだ把握できません。
-
実行時のユーザー
最初はユーザを指定せず、二行目のbecome: yes
だけで実行したのですが、あとでvagrant ssh
でSSH接続してpyenv uninstall
しようとしたところ、権限がないということで削除できませんでした。 -
環境変数について
- これが一番時間をとられました。最初はパス周りを
.bashrc
に書き込んでいたのですが、blockinfile
などで書き込んで次のタスクに行くと別シェルで起動するのか
、.bashrcに書き込んだ設定が反映されていない状態でpyenv install x.x.x
しようとしてエラーになります。 - じゃあその場で読み込めば良いと思い、
. /home/vagrant/.bashrc
で無理やり読み込ませてもだめで、試行錯誤の結果書き込み先を.bash_profile
にすることで動くようになりました。 - 私のAnsible歴の半分はこの環境変数まわりの格闘でした...これをみて無理やり動くところまで持って行きました。.bashrc、.bash_profileなどの違いについてはこちらが参考になるかと思います。
- これが一番時間をとられました。最初はパス周りを
今後の目標
- Webサーバの設定をする。
- プレイブックがそこらじゅうに散らかっているのはどう考えても良くないので、このあたり
を参考に構成をもっとスマートにする。 - 仮想マシンでなくクラウド環境に対して実行する。