Vagrant + Ansibleでansible_localプロビジョナを使ってみよう!

Pocket

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がインストールできています。

welcome_to_nginx

スポンサーリンク

feedly、RSSをフォローする