Vagrantで仮想マシンを作る際、
と、思うことはないでしょうか。
そういう時に便利な機能がVagrantのプロビジョニングです。プロビジョニングを使うと、自動的にソフトウェアをインストールしたり、設定変更をすることができます。
プロビジョニングには「Shell」「Chef」「Ansible」など色々種類がありますが、今回は「Ansible」を紹介します。Ansibleプロビジョナの種類や使い方を見ていき、Ansibleプロビジョナで仮想マシンの設定をしてみましょう。
目次
プロビジョニングとは
プロビジョニングとは、自動的にソフトウェアをインストールしたり、自動的に仮想マシンを設定変更することができる機能です。そのため、プロビジョニングを作成すれば、定型的な作業を自動化することができます。
例えば、Webサーバを作るためにnginxをインストールしたり、OSの言語設定を日本語にする作業などを、仮想マシン起動時に自動でできるようになります。
プロビジョニングの実行
プロビジョニングは特定の場合のみ実行されます。特定の場合とは以下の3つです。
- 初回(仮想マシン生成)の「vagrant up」実行時
- 「vagrant provision」実行時
- 「vagrant reload --provision」実行時
初回 の「vagrant up」実行時以外は、明示的にプロビジョニングを指定しない限り、プロビジョニングは実行されません。なお、初回の「vagrant up」実行時に「--no-provision」と指定することで、プロビジョニングを実行せずに仮想マシンを生成することもできます。
Ansibleプロビジョナ
さて、冒頭でも紹介しました通り、今回はAnsibleプロビジョナを使っていきます。まず、Ansibleプロビジョナは2種類ありますので、違いを見ていきましょう。
- ansible…ホストOSのAnsibleを使ってプロビジョニングをする
- ansible_local…ゲストOSのAnsibleを使ってプロビジョニングをする
オススメは「ansible_local」です。なぜなら、ゲストOSのAnsibleを使うため、ホストOSにAnsibleをインストールする必要がありません。また、ホストOSがWindowsの場合、Ansibleを使うことはできませんが、ansible_localなら使うことができます。さらに、ゲストOSにAnsibleがインストールされていない場合は、自動的にAnsibleをインストールしてくれます。
ただ、ゲストOSがWindowsの場合、Ansibleを使うことができませんので、その場合は「ansible」を使いましょう。
ansible_localの使い方
では、ansible_localの使い方を見ていきましょう。Vagrantfileで「config.vm.provision」の設定をしていきます。
config.vm.provision "ansible_local" do |ansible| ansible.playbook = "playbook.yml" end
この3行でansible_localを使うことができます。ansible-playbookを実行するデフォルトのパスは「/vagrant」となりますので、上記のコードは「/vagrant/playbook.yml」のプレイブックを実行するという意味です。他オプションについては、公式サイト(Ansible Local Provisioner)を参照ください。
ansible_localの注意点
ゲストOSでAnsibleを実行しますので、実行するプレイブックはゲストOSに存在しなければいけません。そのため、共有フォルダ機能を使い、ホストOSとゲストOSでフォルダ共有することをオススメします。そうすることにより、ホストOSに配置したプレイブックをゲストOSから実行することができます。
共有フォルダ機能は、Virtualboxの共有フォルダやrsyncなどがあります。Virtualboxの共有フォルダ機能を使う場合は、以下の記事を参考ください。
ansible_localでnginxをインストールしてみよう
それでは、実際にansible_localを使ってみましょう。今回はnginxをインストールするプレイブックを実行し、nginxが正常にインストールできているかを確認してみます。
Vagrantfileを編集
まず、プロビジョニングを使うため、config.vm.provisionを設定していきます。今回はVagrantfileと同じディレクトリにある「install_nginx.yml」というプレイブックを実行するようにします。また、共有フォルダ機能を使うため、config.vm.synced_folderも設定します。
# Virtualboxの共有フォルダでホストOSの「カレントディレクトリ」とゲストOSの「/vagrant」を共有する config.vm.synced_folder ".", "/vagrant", type: "virtualbox" # ~~~ 中略 # ansible_localでinstall_nginx.ymlプレイブックを読み込む config.vm.provision "ansible_local" do |ansible| ansible.playbook = "install_nginx.yml" end
プレイブックを作成
次に、nginxをインストールするためのプレイブックを作ります。先ほど、Vagrantfileで記載した「install_nginx.yml」というファイル名で、プレイブックを作りましょう。
--- - hosts: all become: true tasks: - name: Add nginx repository yum_repository: name: nginx description: nginx repo baseurl: "http://nginx.org/packages/centos/7/$basearch/" gpgcheck: no enabled: yes - name: Install nginx yum: name: nginx state: latest - name: Start nginx service: name: nginx state: started
プロビジョニングを実行する
それでは、準備ができましたので、「vagrant up」で仮想マシンの生成とプロビジョニングを実行します。Ansibleプロビジョニングが実行されることを確認しましょう。
$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Checking if box 'centos/7' is up to date... # ~~~ 中略 ==> default: Running provisioner: ansible_local... default: Running ansible-playbook... PLAY [all] ********************************************************************* TASK [Gathering Facts] ********************************************************* ok: [default] TASK [Add nginx repository] **************************************************** changed: [default] TASK [Install nginx] *********************************************************** changed: [default] TASK [Start nginx] ************************************************************* changed: [default] PLAY RECAP ********************************************************************* default : ok=4 changed=3 unreachable=0 failed=0
最後に、仮想マシンのIPアドレスをブラウザで表示し、nginxがインストールできていることを確認してみます。「Welcome to nginx!」が表示できれば、問題なくnginxがインストールできています。