20200911のLinuxに関する記事は7件です。

さくらVPSサーバーで作成したWebサービスのSSL化を行うに辺り、詰まった点

前提条件として

さくらVPSで環境構築が完了して、自分で作成したWebサービスの独自ドメインを取得しており
ドキュメントルートを設定して、ドメイン名(○○.com等)でhttp接続が完了しているという条件で
記述していきます。

作業環境

CentOS7
Apache2.4.6

Let's encryptで無料SSL証明書発行してSSL化

今回は無料でSSL証明書を発行したかったのでLet's encryptを使用しました。

詰まった箇所

https://weblabo.oscasierra.net/letsencrypt-2/

コチラの参考記事の内容を完璧に行ってもhttp接続からhttps接続に切り替わらない。

対策

参考記事に書かれている 
Apache 2.4 への設定が上手く反映されていない可能性を考える。

$apachectl configtest←このコマンドでssl.confの構文チェックを行う。

すると下記エラーメッセージが出る。

Syntax error on line XX of /path/to/ssl.conf:
SSLCertificateFile: file '/path/to/cert.pem' does not exist or is empty

上記エラーメッセージで検索しまくると

https://www.proto-star.com/2016/04/24/lets-encrypt-apache-%E3%81%A7%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E7%94%9F%E6%88%90%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%A6%E3%82%8B%E3%81%AE%E3%81%AB/

コチラの記事に巡り合えた。パーミッションの設定を変更してみると

$ apachectl configtest
Syntax OK

Apache 2.4 への設定は上手くいったことを確認して再度ブラウザを確認すると今度は接続タイムアウトのエラーが。。

色々調べているとファイアウォールかApacheのエラーが原因ぽかったので

ファイヤーウォールの確認
$ firewall-cmd --list-all --permanent
apacheの確認
$ systemctl status httpd

上記コマンドを叩いてみるとファイアウォールの方は問題なさそうなのですが
apacheの方は長文の英文メッセージの中にfailedという文字が。。

はい、アパッチが原因ですね。

アパッチのエラーログを確認するとssl.conf内のポート番号443が重複しているというようなエラーメッセージが出力されている。

glepコマンドで443で検索をかけると、バックアップ用にコピーしていた

ssl.old.conf
ssl.oldest.conf

上記ファイルが本丸のssl.confと競合していた。。

なのでこれらのファイルを削除して再度アパッチを起動してブラウザを確認すると

接続タイムアウトのエラーが解決されて、https接続もしっかり出来ていました。

バックアップファイルの取り方に問題があったようでOSは拡張子で判断するのでバックアップファイルを取るなら下記のようにするのが正解のようです。

ssl.conf.bak
ssl.conf.old

拡張子は完全に盲点でした。。
今回のような訳の分からないエラーが出た時は、今思うと当たり前ですがエラーログをしっかり見てから、解決に向けて行動をした方が良いですね。

ていうかプログラミングでエラーにぶつかった時は基本的にエラーログを見るのは当たり前なのですが、環境構築に対する知識が乏しく、アパッチにエラーログがあるという概念すらなかったです。

とはいえ、今回のエラーで環境構築やネットワーク関連の知識がある程度付いたのでエラーに巡り合えて良かったと
ポジティブな結果として終わらそうと思います笑

長文失礼致しました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

conf.d配下のファイルの備忘録

 vhosts.confを作ってVHを設定することで有名なconf.dですが、ほかのconfファイルもちらっと調べてまとめてみました。

  • mod_dnssd.conf
     DNS Service Discoveryの略?ネット診断ツールのようですがよくわかりません。。

  • welcome.conf
     中身は以下の感じです.
    <LocationMatch "^/+$">
      Options -Indexes                -①
      ErrorDocument 403 /error/noindex.html      -②
    </LocationMatch>

 ①コメント状態でドメイン名またはIPアドレスでアクセスすると以下のようなディレクトリインデックス画面が表示される.
キャプチャ.JPG
 ②コメントを外していればエラーだった時にちょっとリッチな画面が返ってくる.

 ※とはいえsudo付けても読み取り専用ファイルなのでいじれないような...

 他にもwebalizer(WEBアクセスログ解析ソフト)とかwsgi(Web Server Gateway Interface)などありますが、割愛!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpenWRT(LEDE)使いこなし : rtorrent + LINE Notify

はじめに

OpenWRT/LEDEのNASサーバーにrtorrentとLINE Notify環境を構築したので、
折角なので連携させてみました。

前記事:
中華ファンレスNASをOpenWRT(LEDE)で使う
OpenWRT(LEDE)使いこなし : rtorrent
OpenWRT(LEDE)使いこなし : LINE Notify

前準備

やりたいことは、
「rtorrentでファイルのダウンロードが終わったタイミングで、完了したファイル名をLINEに通知して欲しい」
です。

LINE Notify自体の前準備は適当にggるか、
Qiitaであればこの記事辺りです。
LEDEへのLINE Notify環境構築は、前記事を参照してください。

先ずはrtorrentにフックをかけて実行する為の
LINE Notify実行スクリプトを用意します。

line-nortify.sh
#!/bin/bash
# Script for LINE nortify
token=XXXXXX
curl -X POST -H "Authorization: Bearer ${token}" -F "message=$1" https://notify-api.line.me/api/notify

LEDEは環境が貧弱で/home すらないので、
/root/sh 等、適当に配置して実行出来るようにしておきます。
尚、私はbashをinstallしていますが、標準のOpenWRT/LEDEではashだと思うので、
bashをinstallするか、読み替えるか、等して下さい。

rtorrentへのフック

.rtorrent.rc にコードを書いていきます。
勉強したい方は、マニュアルとしては、以下を解読すれば良い様です。
https://rtorrent-docs.readthedocs.io/en/latest/cmd-ref.html

今回はダウンロード完了時にフックをか掛けたいだけですので、
以下の1行を、/root/.rtorrent.rc に追記します。

/root/.rtorrent.rc
method.set_key=event.download.finished,notify_me,"execute2=/root/sh/line-nortify.sh,$d.name="

結構便利

私は、RaspberryPi等のinstallイメージファイルを色々と落として来る事が多く、
サーバーによっては物凄く(半日以上、等)時間がかかる為、
push通知でダウンロード完了タイミングを知る事が出来るのはとても便利です。

また、私の環境ではLEDEのrtorrent向けGUI(luci-app)がアクセス出来なくなる事が多いですが、
この場合でも、ダウンロード完了を知る事が出来る為、
安心してリセット・リブートを実施する事が出来ます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Slack で UI 上で表示されなくなった機能を使う

環境

  • Ubuntu Linux 18.04 LTS
  • slack-desktop-4.0.2-amd64.deb

テキストフォーマットのクリア

いつしかテキストフォーマットのクリアボタンが無くなっていた。
どうやら機能として無くなっているみたい。

Preferences - Advanced - Format messages with markup
をONにするとそもそも余計なテキストフォーマットをしなくなるので幸せになれた。

text snippet の作成

昔は入力エリアの+ボタンから作成していたが、+ボタンが無くなった。

入力エリアのイナズママーク - Create code or text snippet

または入力エリアでCtrl+Shift+Enter

常駐終了

昔は常駐アイコンをクリックで終了が選択できたができなくなっている

GUIで終了する方法は無い?

ワークスペースアイコンリストのスクロール

以前はスクロールバーがあったが無くなっている

マウスホイールトスクロール
またはキーボードフォーカスを合わせてキー操作

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[公式ドキュメント] Vagrantチュートリアル (翻訳+徹底解説付き!)

はじめに

対象読者

  • 仮想環境って聞いたことはあるけど実際に使ったことはない。
  • ターミナル の基本的なコマンド(cd, ls, mkdirなど)はなんとなくわかる。
  • さらっとVirtualBox/Vagrantの基本をおさえて使ってみたい。
  • 仮想環境を使ってLinuxを勉強してみたい。

内容紹介

上記のような方がVagrantの概要と使い方を短時間でさらっと掴めるように

の二つのVagrant公式ドキュメント記事を翻訳してまとめました。

また上記の2つのドキュメントをまとめるにあたって、(初学者でも)出来るだけこのQiita記事のみで理解が出来るように、補足説明をかなり丁寧に付け加えました。

特に「公式ドキュメントを読む上で知っておくべき概念/用語」と「VirtualBoxとVagrantのインストール」に関しては補足のために独立した章として解説を加えてあります。(必要ない方はもちろん飛ばしておk!)

※「ここがわからん!━(ノдヽ)━」ってポイントがあれば是非是非コメントください!また「この翻訳は意訳しすぎで駄目!この補足説明はおかしい!(`Д´)」というご指摘もお願い致します。<(_ _)>

事前準備その1 知っておくべき概念/用語

ここでは次の章で実際にVirtualBoxとVagrantを用いて仮想環境を構築する前に、知っておくと理解が捗る用語を補足として7つのトピックに分けて解説していきます。

1. VirtualBoxによる仮想化とは?

VirtualBoxとはIT用語辞典/e-Wordsによれば『オープンソースの仮想化ソフトウェアの一つ。オペレーティングシステム(OS)上で実行されるアプリケーションの一つとして仮想的なコンピュータ(仮想マシン/VM:Virtual Machine)を構築し、その上で別のOSを実行することができる』ものです。

MacやWindows、Linuxといったホスト(土台となる)OSの上に異なるOSを持つ仮想的なマシンを動かせるのが特徴です。Vagrantではこういった(VirtualBoxを含めた)仮想化ソフトウェアのことをプロバイダと呼んでいます。

上記の筆者作成図ではホストOSの上に仮想化ソフトウェアが載っています。これをホストOS型の仮想化と呼びます。(これ以外にもハイパーバイザー型等あるのですが今回は割愛します。)

OSの上に別のOSで動く仮想マシン載せてるんなんだなぁという理解で今のところは問題ありません。

2. プロバイダ(Provider)とは

仮想環境を提供するソフトウェアのことです。Vagrantはこの仮想環境上に仮想マシンを構築し、操作します。今回は基本となるVirtualBoxを用いますが、プラグインでVMWare Fusion(Workstation)やAWS(EC2)、Rackspaceなども追加可能です。

3. プロビジョニング(Provisioning)とは

仮想マシンへ、Webサーバー(ApacheやNginx)、プログラミング言語(PHP、Python、Ruby,,,etc)、DBMS(PosgreやMySQL,,,etc)といったソフトウェアのインストール・設定をすること、です。

今回は公式ドキュメントに沿ってシェルスクリプトを用いますが、他にもAnsible、Chef、Puppetなどのプロビジョニングツールが使用できます。

4. Boxファイルとは

仮想マシンを起動する際にベースとなるイメージファイルのことです。仮想マシンのテンプレートのようなものと思ってもらえれば良いです。

5. Vagrant cloudとは

Vagrant clooudとは公式が用意してくれているBoxファイルの公開サイトです。
@alfaさんのQiita記事『Vagrantの正しいはじめ方』を読むまでは私もvagrantbox.esという非公式のBoxファイルサイトから落としてきていました。Vagrantの公式ドキュメントをしっかり読む良いきっかけになりました。深謝です!

6. Vagrantfileとは

仮想マシンの構築(Vagrantを使って構築する仮想マシンのスペックやプロビジョニングツールの指定など)を記述するファイルです。

7. Vagrantコマンドとは

ターミナル上で簡単にVagrantを操作出来るようにするコマンドのことです。

ここまでのまとめ

VirtualBoxのみでも仮想化は可能なのですが、Vagrantを用いることで「Vagrantfile」で仮想環境の設定情報を簡単に設定/共有し、「Vagrantコマンド」でそれを実行することで、環境構築を非常に楽にすることが出来るのです。

事前準備その2 VirtualBoxとVagrantのインストール

VirtualBoxをインストール

まずOracleのVirtualBox公式ページへアクセスして、

左側のDownloadsから自分の環境にあったものをクリックしてダウンロード!

インストーラーが開いてからは、全てに肯定的に回答すればインストールが無事終わります。

Vagrantのインストール

Vagrantの公式ページへアクセスしてDownloadボタンをクリック!

自分の環境にあったものを選択してDownloadボタンをクリック!
dmgファイルがダウンロードされるのでそれをクリック!

Vagrant.pkg をダブルクリックしてインストーラを起動させます。
選択は「続ける」をクリックしていけば良いです。

以上でVirtualBoxとVagrantのインストールは終了です!
いよいよ次から公式ドキュメントの読解を進めていきます!

Introduction to Vagrant

Vagrantとは

Vagrantは仮想マシン環境を(単一の業務手順で)構築・管理するためのツールです。
使いやすいワークフローと自動化に焦点を当てたVagrantは、開発環境のセットアップ時間を短縮し生産性の平均水準(production parity)を押し上げてくれます。

Why Vagrant

Vagrantは設定が容易で(チームの誰でも)再現性出来る、ポータブル(移植可能な)作業環境を提供してくれます。

またその環境は業界の標準となっている技術に基づいて構築されており、あなたのチームの生産性と柔軟性を最大化するのに役立つ単一の一貫したワークフローにより管理されます。

Vagrantは様々な巨人の肩に乗る(既存の技術の組み合わせの上に立つ)ことでその威力を発揮します。

仮想マシンはVirtualBoxのような仮想環境の他、VMware、AWS、または他のプロバイダーの上にプロビジョニング(provisioning)されます。シェルスクリプト、Chef、Puppetなどの業界標準のプロビジョニングツールを使用することで、仮想マシン上にソフトウェアを自動的にインストールして設定することができます。

デベロッパーの方々に向けて

Vagrantは依存関係と一連の設定を単一の一貫した使い捨て環境中で分離します。またその際に自分の使い慣れたツール(例えばエディタ やブラウザ、デバッカなど)が使えなくなるということは一切ありません。

一度、(あなたを含めた)誰かがVagrantfileを一つ作成してしまえば、vagrant upとコマンドを打つだけで自分の仕事に必要な物は全てインストールされ設定も済みます。

チームの他メンバーも同じ設定から開発環境を作成しているので、Linux、Mac、WindowsのどのOS上で作業していたとしても、チームメンバーは同一環境で同じ依存関係を反映した、全く同じように設定された、コードを走らせることになります。

これで「 自分の環境でしか発生しない現象(バグ)」とはお別れできますね!

オペレーター/Dev opsの方々に向けて

Vagrantは、インフラの管理スクリプトの開発とテストのため、使い捨て環境と一貫したワークフローを提供します。

シェルスクリプトやChef cookbook、Puppetモジュール、その他VirtualBoxやVMwareのようなローカルの仮想環境に用いるものをすぐにテスト出来ます。

そして同じ構成でこれらのスクリプトをリモートのクラウド環境(AWSやRackSpaceなど)で同じフローに基づいてテスト出来ます。

(AWSの)EC2インスタンスをリサイクルするためにカスタムしたスクリプトを捨て、様々なマシンへSSHプロンプトをジャグリングするのを辞めて、代わりにVagrantを使って自分の生活に正気を取り戻しましょう!

デザイナーの方々に向けて

VagrantはWebアプリケーションに必要案設定を全て自動で行ってくれるので、デザイン業務にのみ集中出来るようになります!

一度開発者がVagrantを設定してしまえば、そのアプリを動作させる方法について二度と思い悩む必要はないわけです。

デザインテストのために、他の開発者に自分の環境の修正を手伝ってもらう必要はもうありません。デザイナーの皆さんは、コードをチェックして、vagrant upして、デザインを始めるだけで良いんです!

全ての人に向けて

Vagrantは最も容易、かつ最速で仮想環境を作るためにデザインされたソフトウェアです!
次の章ではいよいよVagrantのクイックスタートガイドに入ります!

Getting started

1. Quick Start

前提

- Vagrantをインストールしていること
- VirtualBoxをインストールしていること

VirtualBox上でUbuntu 18.04 LTS 64-bit.仮想マシンを起動させる

Boxファイル名は作者が作ってくれています。Vagrant clooudから落とす場合はurlの記載がいりません。

    //Boxファイルを指定してVagrantfileを作成
    $ vagrant init hashicorp/bionic64
    //VMの立ち上げ
    $ vagrant up
    //VMの状態確認
    $ vagrant status
    //ssh接続
    vagarnt ssh
    //VMの削除
    $ vagrant destroy

vagrant upコマンドを打つだけでプロジェクトに必要な全て(依存関係のあるソフトのインストールやネットワーク、同期されたファイルのセットアップなど)を用意してくれるので自分のマシンで快適に作業が出来ます!

2. Install Vagrant

自分のOS環境にあったVagrantのインストール

※前章でインストール済みでない場合はインストールしてください。

インストールされたか確かめる

ターミナルを立ち上げて下記の3つのコマンドのどれかを打ち込んでみましょう。

    $ vagrant
    $ vagrant -h
    $ vagrant -v

注意
いくつかのOSのディストリビューションには上流のパッケージレポジトリにvagrantパッケージが含まれている物もあります。そういう場合には(そのディストリビューションの)パッケージマネージャーを用いたインストールは辞めてください。
(パッケージの依存関係から問題が生じることもあります。)ダウンロードページをご利用ください。

3. Initialize a Project Directory

Vagrantfileの作成

(1)自分のPJのルートディレクトリを指定。Vagrantの設定オプションの多くは、このルートディレクトリからの相対的なものです。
(2)自分のPJに必要なマシンとリソースの種類を記述。また同じようにどのソフトウェアをインストールするか、どのようにアクセスしたいかも記述する

  • ディレクトリを作成
    //vagrant_getting_startedディレクトリを作成
    $ mkdir vagrant_getting_started
    //vagrant_getting_startedディレクトリに移動
    $ cd vagrant_getting_started
  • ディレクトリを初期化
    $ vagrant init hashicorp/bionic64

vagarant init(組み込み関数ですが)はboxファイル名とURLを引数にとります。
これでVagrantfileが同じディレクトリに出来ているはずです。このファイルはバージョン管理の対象となることを意図されており、新規のチームメンバーがこのvagrantfileを使ってすぐに環境構築出来るようにしています。

4. Install and Specify a Box

Vagrantでbaseイメージ(イメージファイル)を使えば素早く仮想マシンをクローンすることが出来ます。
こうしたbaseイメージはVagrantではBoxファイルとして知られています。またBoxファイルの指定はVagrantfileの作成後に常にやる仕事の一つであり、一番最初にやるべきことでもあります。

Boxファイルをインストールする(オプショナル)

(後々に習得するコマンドでこの作業は基本的に不要となりますが)もし、Vagrantfileを作成することなく、boxファイルをインストールしたい時に役立つこともあるのでBoxファイルをインストールするコマンドについて解説します。

    $ vagrant box add hashicorp/bionic64
    $ vagrant box add ユーザー名/box名

Boxは現在のユーザー向きにグローバルに保存されます。またそこからそれぞれのPJでboxファイルをイニシャルのイメージとして使用出来ます。(つまり二つのプロジェクトで同じBoxファイルを使用していて、片方でファイルを追加しても、もう片方には影響が出ない、ということです。)
boxファイル部分はURLやローカルのファイルパスでも代替可能です。

Boxファイルを使う

Vagrantfileを開いて、config.vm.boxにBoxファイル名を指定しましょう。
もし仮にboxが事前に追加されていなくてもVagratは起動の際に自動でboxをダウンロードし追加してくれます。(だから上で紹介したBox追加作業は基本的にいらないんです。)

config.vm.box_versionかconfig.vm.box_urlでバージョンを明示的にすることも出来ます。(両方とも必須ではない。)

    Vagrant.configure("2") do |config|
      config.vm.box = "hashicorp/bionic64"
      config.vm.box_version = "1.0.282" #->optionnal:config.vm.box_version = "1.0.282"
      #config.vm.box_url = "https://vagrantcloud.com/hashicorp/bionic64"
    end

他のBoxを探す

Vagrant cloudで探しましょう!
※有料アカウントを使えば組織内で限定のBoxを公開したり出来るが今回はパスします。

5. Boot an Environment

  • VM(仮想マシン)を立ち上げよう

下記のコマンドを打てば1分ほどでUbuntuで動くVMが立ち上がるはずです

    $ vagrant up

[補足] コマンドとGUIでそれぞれVMの状態を確認する

まずコマンドで状態を確認します。

    $ vagrant status

次にGUI(グラフィカルユーザーインターフェース)でVMが立ち上がっているのを確認します。
起動時にVirtualBox立ち上げがされるようにVagrantfileを書き換えします。

    //GUIモードを有効にするためコメントアウトを2つ外す
    config.vm.provider "virtualbox" do |vb|
    #   # Display the VirtualBox GUI when booting the machine
    vb.gui = true
    #
    #   # Customize the amount of memory on the VM:
    #   vb.memory = "1024"
    end

これで自動的にVirtualBoxが立ち上がるようになるはずです。
ただ(公式ドキュメントでやっているように)SSH接続で動かす方がいつものterminalで動かせて楽なのでオススメです!

SSH接続する

立ち上げた仮想マシンにSSH接続してみましょう。

    $ vagrant ssh

ssh接続から抜けたければexitlogoutと打つか、ctrl + dと押しましょう。

SSH接続したらまずVagrantfileがあることを確認しましょう

    [vagrant@localhost ~]$ pwd
    /home/vagrant
    [vagrant@localhost ~]$ cd ../../
    [vagrant@localhost /]$ ls
    bin   dev  home  lib64       media  opt   root  selinux  swapfile  tmp  vagrant
    boot  etc  lib   lost+found  mnt    proc  sbin  srv      sys       usr  var
    [vagrant@localhost /]$ ls vagrant/
    Vagrantfile
    [vagrant@localhost /]$

警告!!
仮想マシンだからってrm -rf/ なんてやっちゃダメ!!というのもVagrantは/vagrantにあるディレクトリをあなたのVagrantfileを含むホスト上のディレクトリと共有していて、これも削除されてしまうことになってしまいます!共有フォルダの詳細については次の節で解説していきます。

仮想マシンを破棄する

ssh接続を抜けて、マシン作成時に作成されたリソースを全て削除しましょう。

    $ vagrant destroy
        default: Are you sure you want to destroy the 'default' VM? [y/N] y ->yと入力!
    ==> default: Forcing shutdown of VM...
    ==> default: Destroying VM and associated drives...

    //vagrantの状態を確認
    $ vagrant status
    Current machine states:

    default                   not created (virtualbox)

    The environment has not yet been created. Run `vagrant up` to
    create the environment. If a machine is not created, only the
    default provider will be shown. So if a provider is not listed,
    then the machine is not created for that environment.

    //ちなみにBoxファイルはなくなっていない
    $ vagrant box list
    hashicorp/bionic64  (virtualbox, 1.0.282)

Boxファイルも削除する

    $ vagrant box remove hashicorp/bionic64
    Removing box 'hashicorp/bionic64' (v1.0.282) with provider 'virtualbox'...

ここまでで一通り、Vagrantでの環境構築、操作、破棄について学べました。
次の節からでは自分のローカルPCと(ゲストの)仮想マシンを間でファイルを同期する方法について学んでいきましょう。

6. Synchronize Local and Guest Files

SSH接続先のプレーンなvimエディタでファイルを編集したいという人は多くないと思います。

Vagrantではファイルを、ローカル-SSH先ゲストPC間で自動的に同期してくれます。
これにより、ローカルで編集したファイルを、仮想開発環境で実行することが出来ます。

デフォルトで、Vagrantはあなたのプロジェクトディレクトリ(3. Initialize a Project Directoryの vagrant initでVagrantfileを作ったディレクトリ)をゲストマシンの/vagrantディレクトリに共有します。

では実際にゲストマシンとのローカルPCでのファイル共有がどのように行われているのか確認していきましょう。

共有ファイルの振る舞いを見てみよう

注意 vagrant sshした時のホームディレクトリである/home/vagrantはローカルでのファイル共有先とは違います。(共有先はルート直下の/vagrantディレクトリ)

まずssh接続して/vagrantディレクトリに移動しましょう。

    $ vagrant ssh
    $ cd ../../vagrant
    $ pwd
    ->/vagrant

/vagrrantディレクトリでhogeファイルを新規作成して

$ touch hoge

ローカルのプロジェクトファイルにもhogeディレクトリがあることが確認できました!

$ exit
logout
$ ls
Vagrantfile hoge

With synced folders, you can continue to use your own editor on your host machine and have the files sync into the guest machine.
同期されたファイルを使って

次はローカルのマシン上でfuga.htmlというファイルを作ってVMでもそのファイルが同期されるかみてみましょう。

まず、ローカルでファイルを作ります。

$ touch fuga.html
$ ls 
Vagrantfile hoge fuga

次にお好みのエディタでfugaの中身を編集してみます。

fuga.html
    <p>ちゃんと編集できてる?</p>

ssh先でもあるfuga.htmlがあることが確認できました!

    $ vagrant ssh
    $ cd ../../
    $ ls vagrant/
    Vagrantfile hoge fuga.html
    //fuga.htmlの中身を確認(viewコマンドで確認でもおk)
    $ cat vagrant/fuga.html
    <p>ちゃんと編集できてる?</p>

次の説ではプロビジョニングを使ってパッケージ、ユーザー、その他諸々をインストールする方法について学んでいきましょう。

7. Provision a Virtual Machine

この節ではプロビジョニングをつかってVMをWebサーバーにしていきましょう。

ローカルの方でHTMLのディレクトリを作成

~/Desktop/vagrant_testにhtmlディレクトリを作成する。

$ mkdir html

次にhtmlディレクトリにindex.htmlファイルを作成する。

~/Desktop/vagrant_test/html/index.html
    <!DOCTYPE html>
    <html lang="ja">

    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Vagrant</title>
    </head>

    <body>
      <h1>Vagrant始めてみたンゴ!</h1>
    </body>

    </html>

※metaタグとかで文字コードしてしないと日本語が文字化けしちゃうよ!

プロビジョニングスクリプトを書いてみる!

このチュートリアルではシェルスクリプトを使って(Webサーバーとして)Apacehをセットアップしていきます。まず下記のシェルスクリプトをbootstrap.shとして保存します。

bootstrap.sh
    #!/usr/bin/env bash

    apt-get update
    apt-get install -y apache2
    if ! [ -L /var/www ]; then
      rm -rf /var/www
      ln -fs /vagrant /var/www
    else
    fi

このスクリプトがApacheをダウンロードし起動してくれます。

さらに「同期されるファイルのディレクトリ」と「Apacehサーバーが、レスポンスとして提供するコンテンツが置いていないか探す場所」との二つの間のsymlink(シンボリックリンク)を作ってくれます。

[補足] シェルスクリプト

  • #!以降のスクリプト

一行目の#!以降のスクリプトはShebang(シバン)と言ってインタプリタ(ソースコードを解釈し実行する翻訳機のようなプログラムのこと)を指定してくれています。
つまり今回だと「これはbashスクリプトして解釈してね」とコンピュータに教えているわけです。
bin/bashでも特に問題ありません。リンク先の解説がわかりやすいです!

  • apt-get

apt-getはDebian用のパッケージ管理システムです。(今回使っているUbuntuもDebian系という種類のLinuxです。)Macで言うところのHomebrewのようなものです。
Ubuntu 14.04から「apt-get」ではなく「apt」コマンドが推奨されるようになっています。リンク先の解説にもある通り、基本的にaptコマンドの方がユーザーにとっても楽です。

  • if以降のスクリプトについて

シェルスクリプトわからん!となりそうだが要は下記のようなif文が書かれていると思えば良いでしょう。
参考:【シェルスクリプト】条件分岐させるifの使い方!

if [ 条件1 ]; then
条件1の際の処理
elif [ 条件2 ]; then
条件2の際の処理
else
条件1,2のどちらでもない場合の処理
fi

条件1にあたるのが! [ -L /var/www ]ですが、-Lは「file が存在し、かつシンボリックリンクならば真となる」ということを意味しており、!は論理否定(!trueであればfalseと同義)を表しています。

つまり/var/wwwディレクトリにfileが存在しなければ処理を走らせる、という意味になります。

以上からこのシェルスクリプトは

初回は「シンボリックリンクの/var/wwwがないので(普通の/var/wwwディレクトリが存在していれば削除した上で、)/vagrantのシンボリックリンクとしての/var/wwwを作成します。」

そして二度目は「シンボリックリンクの/var/wwwがあるのでelse以降の処理(今回は何もない)を走らせる」

ということをしてくれるのだ、ということがわかりました。

次にbootstrap.shを起動させます。

bootstrap.shが起動するようにVagrantを設定する

VMをセットアップしたときにこのスクリプトが起動されるようにVagrantを設定しましょう!

Vagrantfileに下記のconfig.vm.provisionの行を追加してください。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.provision :shell, path: "bootstrap.sh"
end

これでVagrantはbootstrap.shをシェルプロビジョナーとして使ってくれるようになります。

Webサーバーをプロビジョニングする

もしまだ仮想マシンを立ち上げていないのであればvagrant upとするだけでVagrantは自動的にbootstrap.shを使ってプロビジョニングしてくれます。

ただ、既に仮想マシンを立ち上げていても下記のようにリロードしてやれば問題なく動いてくれます。
(プロビジョニングは初回のvagrant upの時のみしかされないので再度vagrant upとしてもダメです。)

$ vagrant reload --provision

ではssh先でwgetコマンドを使ってHTMLファイルを取得してみましょう!

$ vagrant ssh
$ wget -qO- 127.0.0.1
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vagrant</title>
</head>

<body>
  <h1>Vagrant始めてみたンゴ!</h1>
</body>

</html>

[補足] wgetコマンドとは

アットマークIT/Linux基本コマンドによればwgetは「URLを指定してファイルをダウンロードしてくれる」コマンドです。
-q(--quiet)は「経過のメッセージを出力しない」オプションです
-O file(--output-document=file)はダウンロードしたファイルをfile として指定している先に保存します。(リダイレクトで保存先を指定するのに似ている。)また-をfileとして指定するとファイルは標準出力されます。

これが働いてくれているのは既に設定したシェルスクリプトの中で「Apacheのインストール」と「/vagrantディレクトリをApacheのDocumentルートとして設定する」ことを行っているからです。

[補足] Apacheのドキュメントルート

Apachewebサーバーはディフォルトで/var/wwwディレクトリに自身が管理しWebブラウザへのレスポンスとして返すファイルやデータがあるという風に設定されています。(この管理対象下のディレクトリのことをDocumentルートと読んでいるわけです。)
今回はその/var/wwwが/vagrantのシンボリックリンクとなっているため、/vagrantの中身をいじると当然AapcheのDocumentルート下のファイルに変更が反映されます。

次のチュートリアルではネットワークについて扱います。ゲストマシンに対してポートを投げることでゲストマシンの提供するWebサイトにアクセスしてみましょう。

プロビジョニングスクリプトがあまりにも複雑になる場合

プロビジョニングスクリプトの場合は、毎回ビルドするのではなく、あらかじめパッケージがインストールされているカスタムVagrantボックスをパッケージ化した方が効率的です。こちらに詳細があります。

8. Configure the Network

ポートフォワーディング(ポート転送)では、ゲストマシン上のポートを指定をし、ホストマシン上のポートを通して(ファイルの)共有をすることが出来ます。

ポートの転送について設定することで、ゲストマシンのApacheWebサーバーにアクセス出来るようになります。Vagrantfileにconfig.vm.networkの行を追加して、、

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.provision :shell, path: "bootstrap.sh"
  config.vm.network :forwarded_port, guest: 80, host: 4567
end

※上記は「ホストOSに対する4567番ポートへのアクセスをゲストOSの80番ポートに転送すること」を意味しています。

リロードしましょう。

$ vagrant reload

仮想マシンが再起動したら、http://127.0.0.1:4567 にアクセスしてみましょう。

というわけで無事アクセスできたました!

ちなみに、Vagrantには他にもネットワークの形態があり、ゲストマシンに静的なIPアドレスの割り当を行ったり、既存ネットワークにゲストマシンをブリッジさせたりすることができます。他のネットワーク形態に興味がある方はネットワーキングのページを読んでみてください。

9. Share an Environment

Vagrantでは開発環境を提供するのに加えて、これらの環境上で共有や共同作業を容易にしてくれます。この基本機能のことをVagrant Shareと呼びます。

Vagrant Shareはプラグインです。このプラグインはあなたのVagrant環境をネットを介して世界中の誰であっても共有することを可能にします。Vagrant Shareはインターネットに接続された世界中のあらゆるデバイスから自分のVagrant環境に直接ルーティングするURLを提供してくれます。

前提

ngrokをインストールしていること
→ローカル環境で作っているサイトをネット経由で見せたい!って時に使うツール。
※ざっくり概要を掴みたい方は@EsfahanさんのQiita記事、「ngrokの使い方(windows, mac)」がオススメです!

プラグインをインストールする

Vagrant Shareをインストールしましょう

$ vagrant plugin install vagrant-share

環境を共有する

    $ vagrant share

ウェブブラウザを開いて自分の出力したURLを訪れてみましょう!既に作成したApacheがレスポンスしてくれたページがロードされるはずです!(ファイルを修正してURLを再読み込みすれば当然反映されます!)このページは世界中のあらゆるデバイスからアクセス出来ます!

最後に忘れずにセッションを終了させましょう。

$ ^C
==> default: Halting Vagrant share!

もうURLを再読み込みしてもページが見れなくなっているはずです!

Vagrant Shareについてもっと知りたい方はこちらを。
次の章では、ティアダウン(teardown)プロセスについて学んでいきましょう!

10. Teardown an Environment

ここでは今までの章で構築し、手を加えてきた仮想環境を実際に、

(1)一時停止[休止] vagrant suspend
(2)完全停止[シャットダウン] vagrant halt
(3)削除 vagrant

させていきましょう。(1)~(3)のどのオプションを用いるかはあなたがどのくらい長く仕事に用いる仮想環境を止めるか、どのくらい素早く仮想環境を再度起動させたいのか、に依ります。
(当然、休止→停止→削除の順に再起動までの時間はかかります。)

まだはVagrantを立ち上げていない方は立ち上げをお願いします。

$ vagrant up
$ vagrant status
->default                   running (virtualbox)

(1)仮想マシンを一時停止させてみよう

まずは仮想マシンをvagrant suspendを使って一時停止させましょう。

$ vagrant suspend
==> default: Saving VM state and suspending execution...
$ vagrant status
->default                   saved (virtualbox)

vagrant suspendコマンドによる仮想マシンの一時停止はVMを素早く休止、再起動させることができます。

VMはvagrant upとすることで再度停止前の状態で起動します。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'hashicorp/bionic64' version '1.0.282' is up to date...
==> default: Resuming suspended VM...
##... output truncated ...

(2)仮想マシンを完全停止させてみよう

まずは仮想マシンをvagrant haltを使って一時停止させましょう。

$ vagrant halt
$ vagrant status
->default                   poweroff (virtualbox)

これで安全にゲストマシンのOSはシャットダウンされ、VM自体もパワーダウンしてくれます。ディスクの中身もしっかり保存されています。
では確認のため再起動してみましょう。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'hashicorp/bionic64' version '1.0.282' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
##... output truncated ...

ただし完全停止した仮想マシンの再起動にはコールドブートから起き上がるので幾分時間はかかりますし、停止中もディスクスペースを消費します。

(3)仮想マシンを削除してみよう

vagrant destroyして仮想マシンを削除すると、あなたのローカルのマシンからゲストマシンのすべての痕跡が削除されます。ゲストマシンを停止し、電源を落としすことで(ゲストマシンが消費していた)ディスクスペースとRAMを取り戻しましょう。

$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...

上記にあるようにvagrant destroyコマンドの後のプロンプトには「y」(yes)を記入してください。

ここからでもvagrant upと打てば再度仮想マシンは起動させることが出来ます。ただ、起動には時間がかかりますし、以前の状態は破棄されています。

11. Rebuild an Environment

(Vagrantを用いれば)プロジェクトから離れてどれだけ経とうと、すぐに環境をスピンアップ(マシンを起動すること)することが出来ます。

やり方は単純です。

$ vagrant up

以上です!Vagrant環境はVagrantfileを介して全て設定済みです。ですから開発メンバーはいつでもvagrant upコマンドを打つだけで、Vagrantにあなたの作業環境を再現させることが出来るんです。

これでVagrantによる環境構築の一連のライフサイクルは一通り終わりです!

次の最終章ではVirtualBox以外のプロバイダーについても触れておきましょう!

12 .Explore other Providers

新しいプロバイダをインストールする

プロバイダごとの設定について各公式ドキュメントを参照してください!

新しいプロバイダで起動する

新しいプロバイダをインストール出来たら下記のコマンドを打つだけで問題ありません。
(Vagrantfileを弄る必要はありません!)

$ vagrant up --provider=vmware_desktop

一度、上記のように別のプロバイダを指定してvagrant upをしてやれば他のVagrantコマンドでも自動的に指定したプロバイダを使ってくれるようになります!

なので例えばSSH接続の準備や仮想マシンの削除の準備が出来たら(これまでの章でやっていたように)普通にコマンドを打つだけで全く問題ありません。

プロバイダについてより詳しく学びたい方はこちらのページ(リンク先英文公式ドキュメント)を参照してください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[公式ドキュメントで入門] Vagrantチュートリアル (翻訳+徹底解説付き!)

はじめに

対象読者

  • 仮想環境って聞いたことはあるけど実際に使ったことはない。
  • ターミナル の基本的なコマンド(cd, ls, mkdirなど)はなんとなくわかる。
  • さらっとVirtualBox/Vagrantの基本をおさえて使ってみたい。
  • 仮想環境を使ってLinuxを勉強してみたい。

内容紹介

上記のような方がVagrantの概要と使い方を短時間でさらっと掴めるように

の二つのVagrant公式ドキュメント記事を翻訳してまとめました。

また上記の2つのドキュメントをまとめるにあたって、(初学者でも)出来るだけこのQiita記事のみで理解が出来るように、補足説明をかなり丁寧に付け加えました。

特に「公式ドキュメントを読む上で知っておくべき概念/用語」と「VirtualBoxとVagrantのインストール」に関しては補足のために独立した章として解説を加えてあります。
(必要ない方はもちろん飛ばしておk!こちらからどうぞ!)

※「ここがわからん!━(ノдヽ)━」ってポイントがあれば是非是非コメントください!また「この翻訳は意訳しすぎで駄目!この補足説明はおかしい!(`Д´)」というご指摘もお願い致します。<(_ _)>

[事前準備その1] 知っておくべき概念/用語

ここでは次の章で実際にVirtualBoxとVagrantを用いて仮想環境を構築する前に、知っておくと理解が捗る用語を補足として7つのトピックに分けて解説していきます。

1. VirtualBoxによる仮想化とは?

VirtualBoxとはIT用語辞典/e-Wordsによれば『オープンソースの仮想化ソフトウェアの一つ。オペレーティングシステム(OS)上で実行されるアプリケーションの一つとして仮想的なコンピュータ(仮想マシン/VM:Virtual Machine)を構築し、その上で別のOSを実行することができる』ものです。

MacやWindows、Linuxといったホスト(土台となる)OSの上に異なるOSを持つ仮想的なマシンを動かせるのが特徴です。Vagrantではこういった(VirtualBoxを含めた)仮想化ソフトウェアのことをプロバイダと呼んでいます。

上記の筆者作成図ではホストOSの上に仮想化ソフトウェアが載っています。これをホストOS型の仮想化と呼びます。(これ以外にもハイパーバイザー型等あるのですが今回は割愛します。)

OSの上に別のOSで動く仮想マシン載せてるんだなぁという理解で今のところは問題ありません。

2. プロバイダ(Provider)とは

仮想環境を提供するソフトウェアのことです。Vagrantはこの仮想環境上に仮想マシンを構築し、操作します。今回は基本となるVirtualBoxを用いますが、プラグインでVMWare Fusion(Workstation)やAWS(EC2)、Rackspaceなども追加可能です。

3. プロビジョニング(Provisioning)とは

仮想マシンへに『Webサーバー(ApacheやNginx)、プログラミング言語(PHP、Python、Ruby,,,etc)、DBMS(PosgreやMySQL,,,etc)』といったソフトウェアをインストール・設定すること、です。

今回は公式ドキュメントに沿ってシェルスクリプトを用いますが、他にもAnsible、Chef、Puppetなどのプロビジョニングツールが使用できます。

4. Boxファイルとは

仮想マシンを起動する際にベースとなるイメージファイルのことです。仮想マシンのテンプレートのようなものと思ってもらえれば良いです。

5. Vagrant cloudとは

Vagrant clooudとは公式が用意してくれているBoxファイルの公開サイトです。
@alfaさんのQiita記事『Vagrantの正しいはじめ方』を読むまでは私もvagrantbox.esという非公式のBoxファイルサイトから落としてきていました。Vagrantの公式ドキュメントをしっかり読む良いきっかけになりました。深謝です!

6. Vagrantfileとは

仮想マシンの構築(Vagrantを使って構築する仮想マシンのスペックやプロビジョニングツールの指定など)を記述するファイルです。

7. Vagrantコマンドとは

ターミナル上で簡単にVagrantを操作出来るようにするコマンドのことです。

ここまでのまとめ

VirtualBoxのみでも仮想化は可能なのですが、Vagrantを用いることで「Vagrantfile」で仮想環境の設定情報を簡単に設定/共有し、「Vagrantコマンド」でそれを実行することで、環境構築を非常に楽にすることが出来るのです。

[事前準備その2] VirtualBoxとVagrantのインストール

VirtualBoxをインストール

まずOracleのVirtualBox公式ページへアクセスして、

左側のDownloadsから自分の環境にあったものをクリックしてダウンロード!

インストーラーが開いてからは、全てに肯定的に回答すればインストールが無事終わります。

Vagrantのインストール

Vagrantの公式ページへアクセスしてDownloadボタンをクリック!

自分の環境にあったものを選択してDownloadボタンをクリック!
dmgファイルがダウンロードされるのでそれをクリック!

Vagrant.pkg をダブルクリックしてインストーラを起動させます。
選択は「続ける」をクリックしていけば良いです。

以上でVirtualBoxとVagrantのインストールは終了です!
いよいよ次から公式ドキュメントの読解を進めていきます!

[公式]Introduction to Vagrant

Vagrantとは

Vagrantは仮想マシン環境を(単一の業務手順で)構築・管理するためのツールです。
使いやすいワークフローと自動化に焦点を当てたVagrantは、開発環境のセットアップ時間を短縮し生産性の平均水準(production parity)を押し上げてくれます。

Why Vagrant

Vagrantは設定が容易で(チームの誰でも)再現性出来る、ポータブル(移植可能な)作業環境を提供してくれます。

またその環境は業界の標準となっている技術に基づいて構築されており、あなたのチームの生産性と柔軟性を最大化するのに役立つ単一の一貫したワークフローにより管理されます。

Vagrantは様々な巨人の肩に乗る(既存の技術の組み合わせの上に立つ)ことでその威力を発揮します。

仮想マシンはVirtualBoxのような仮想環境の他、VMware、AWS、または他のプロバイダーの上にプロビジョニング(provisioning)されます。シェルスクリプト、Chef、Puppetなどの業界標準のプロビジョニングツールを使用することで、仮想マシン上にソフトウェアを自動的にインストールして設定することができます。

デベロッパーの方々に向けて

Vagrantは依存関係と一連の設定を単一の一貫した使い捨て環境中で分離します。またその際に自分の使い慣れたツール(例えばエディタ やブラウザ、デバッカなど)が使えなくなるということは一切ありません。

一度、(あなたを含めた)誰かがVagrantfileを一つ作成してしまえば、vagrant upとコマンドを打つだけで自分の仕事に必要な物は全てインストールされ設定も済みます。

チームの他メンバーも同じ設定から開発環境を作成しているので、Linux、Mac、WindowsのどのOS上で作業していたとしても、チームメンバーは同一環境で同じ依存関係を反映した、全く同じように設定された、コードを走らせることになります。

これで「 自分の環境でしか発生しない現象(バグ)」とはお別れできますね!

オペレーター/Dev opsの方々に向けて

Vagrantは、インフラの管理スクリプトの開発とテストのため、使い捨て環境と一貫したワークフローを提供します。

シェルスクリプトやChef cookbook、Puppetモジュール、その他VirtualBoxやVMwareのようなローカルの仮想環境に用いるものをすぐにテスト出来ます。

そして同じ構成でこれらのスクリプトをリモートのクラウド環境(AWSやRackSpaceなど)で同じフローに基づいてテスト出来ます。

(AWSの)EC2インスタンスをリサイクルするためにカスタムしたスクリプトを捨て、様々なマシンへSSHプロンプトをジャグリングするのを辞めて、代わりにVagrantを使って自分の生活に正気を取り戻しましょう!

デザイナーの方々に向けて

VagrantはWebアプリケーションに必要案設定を全て自動で行ってくれるので、デザイン業務にのみ集中出来るようになります!

一度開発者がVagrantを設定してしまえば、そのアプリを動作させる方法について二度と思い悩む必要はないわけです。

デザインテストのために、他の開発者に自分の環境の修正を手伝ってもらう必要はもうありません。デザイナーの皆さんは、コードをチェックして、vagrant upして、デザインを始めるだけで良いんです!

全ての人に向けて

Vagrantは最も容易、かつ最速で仮想環境を作るためにデザインされたソフトウェアです!
次の章ではいよいよVagrantのクイックスタートガイドに入ります!

[公式]Getting started

1. Quick Start

前提

  • Vagrantをインストールしていること
  • VirtualBoxをインストールしていること

VirtualBox上でUbuntu 18.04 LTS 64-bit.仮想マシンを起動させる

Boxファイル名は作者が作ってくれています。Vagrant clooudから落とす場合はurlの記載がいりません。

    //Boxファイルを指定してVagrantfileを作成
    $ vagrant init hashicorp/bionic64
    //VMの立ち上げ
    $ vagrant up
    //VMの状態確認
    $ vagrant status
    //ssh接続
    vagarnt ssh
    //VMの削除
    $ vagrant destroy

vagrant upコマンドを打つだけでプロジェクトに必要な全て(依存関係のあるソフトのインストールやネットワーク、同期されたファイルのセットアップなど)を用意してくれるので自分のマシンで快適に作業が出来ます!

2. Install Vagrant

自分のOS環境にあったVagrantのインストール

※前章でインストール済みでない場合はインストールしてください。

インストールされたか確かめる

ターミナルを立ち上げて下記の3つのコマンドのどれかを打ち込んでみましょう。

    $ vagrant
    $ vagrant -h
    $ vagrant -v

注意
いくつかのOSのディストリビューションには上流のパッケージレポジトリにvagrantパッケージが含まれている物もあります。そういう場合には(そのディストリビューションの)パッケージマネージャーを用いたインストールは辞めてください。
(パッケージの依存関係から問題が生じることもあります。)ダウンロードページをご利用ください。

3. Initialize a Project Directory

Vagrantfileの作成

(1)自分のPJのルートディレクトリを指定。Vagrantの設定オプションの多くは、このルートディレクトリからの相対的なものです。
(2)自分のPJに必要なマシンとリソースの種類を記述。また同じようにどのソフトウェアをインストールするか、どのようにアクセスしたいかも記述する

  • ディレクトリを作成
    //vagrant_getting_startedディレクトリを作成
    $ mkdir vagrant_getting_started
    //vagrant_getting_startedディレクトリに移動
    $ cd vagrant_getting_started
  • ディレクトリを初期化
    $ vagrant init hashicorp/bionic64

vagarant init(組み込み関数ですが)はboxファイル名とURLを引数にとります。
これでVagrantfileが同じディレクトリに出来ているはずです。このファイルはバージョン管理の対象となることを意図されており、新規のチームメンバーがこのvagrantfileを使ってすぐに環境構築出来るようにしています。

4. Install and Specify a Box

Vagrantでbaseイメージ(イメージファイル)を使えば素早く仮想マシンをクローンすることが出来ます。
こうしたbaseイメージはVagrantではBoxファイルとして知られています。またBoxファイルの指定はVagrantfileの作成後に常にやる仕事の一つであり、一番最初にやるべきことでもあります。

Boxファイルをインストールする(オプショナル)

(後々に習得するコマンドでこの作業は基本的に不要となりますが)もし、Vagrantfileを作成することなく、boxファイルをインストールしたい時に役立つこともあるのでBoxファイルをインストールするコマンドについて解説します。

    $ vagrant box add hashicorp/bionic64
    $ vagrant box add ユーザー名/box名

Boxは現在のユーザー向きにグローバルに保存されます。またそこからそれぞれのPJでboxファイルをイニシャルのイメージとして使用出来ます。(つまり二つのプロジェクトで同じBoxファイルを使用していて、片方でファイルを追加しても、もう片方には影響が出ない、ということです。)
boxファイル部分はURLやローカルのファイルパスでも代替可能です。

Boxファイルを使う

Vagrantfileを開いて、config.vm.boxにBoxファイル名を指定しましょう。
もし仮にboxが事前に追加されていなくてもVagratは起動の際に自動でboxをダウンロードし追加してくれます。(だから上で紹介したBox追加作業は基本的にいらないんです。)

config.vm.box_versionかconfig.vm.box_urlでバージョンを明示的にすることも出来ます。(両方とも必須ではない。)

    Vagrant.configure("2") do |config|
      config.vm.box = "hashicorp/bionic64"
      config.vm.box_version = "1.0.282" #->optionnal:config.vm.box_version = "1.0.282"
      #config.vm.box_url = "https://vagrantcloud.com/hashicorp/bionic64"
    end

他のBoxを探す

Vagrant cloudで探しましょう!
※有料アカウントを使えば組織内で限定のBoxを公開したり出来るが今回はパスします。

5. Boot an Environment

  • VM(仮想マシン)を立ち上げよう

下記のコマンドを打てば1分ほどでUbuntuで動くVMが立ち上がるはずです

    $ vagrant up

[補足] コマンドとGUIでそれぞれVMの状態を確認する

まずコマンドで状態を確認します。

    $ vagrant status

次にGUI(グラフィカルユーザーインターフェース)でVMが立ち上がっているのを確認します。
起動時にVirtualBox立ち上げがされるようにVagrantfileを書き換えします。

    //GUIモードを有効にするためコメントアウトを2つ外す
    config.vm.provider "virtualbox" do |vb|
    #   # Display the VirtualBox GUI when booting the machine
    vb.gui = true
    #
    #   # Customize the amount of memory on the VM:
    #   vb.memory = "1024"
    end

これで自動的にVirtualBoxが立ち上がるようになるはずです。
ただ(公式ドキュメントでやっているように)SSH接続で動かす方がいつものterminalで動かせて楽なのでオススメです!

SSH接続する

立ち上げた仮想マシンにSSH接続してみましょう。

    $ vagrant ssh

ssh接続から抜けたければexitlogoutと打つか、ctrl + dと押しましょう。

SSH接続したらまずVagrantfileがあることを確認しましょう

    [vagrant@localhost ~]$ pwd
    /home/vagrant
    [vagrant@localhost ~]$ cd ../../
    [vagrant@localhost /]$ ls
    bin   dev  home  lib64       media  opt   root  selinux  swapfile  tmp  vagrant
    boot  etc  lib   lost+found  mnt    proc  sbin  srv      sys       usr  var
    [vagrant@localhost /]$ ls vagrant/
    Vagrantfile
    [vagrant@localhost /]$

警告!!
仮想マシンだからってrm -rf/ なんてやっちゃダメ!!というのもVagrantは/vagrantにあるディレクトリをあなたのVagrantfileを含むホスト上のディレクトリと共有していて、これも削除されてしまうことになってしまいます!共有フォルダの詳細については次の節で解説していきます。

仮想マシンを破棄する

ssh接続を抜けて、マシン作成時に作成されたリソースを全て削除しましょう。

    $ vagrant destroy
        default: Are you sure you want to destroy the 'default' VM? [y/N] y ->yと入力!
    ==> default: Forcing shutdown of VM...
    ==> default: Destroying VM and associated drives...

    //vagrantの状態を確認
    $ vagrant status
    Current machine states:

    default                   not created (virtualbox)

    The environment has not yet been created. Run `vagrant up` to
    create the environment. If a machine is not created, only the
    default provider will be shown. So if a provider is not listed,
    then the machine is not created for that environment.

    //ちなみにBoxファイルはなくなっていない
    $ vagrant box list
    hashicorp/bionic64  (virtualbox, 1.0.282)

Boxファイルも削除する

    $ vagrant box remove hashicorp/bionic64
    Removing box 'hashicorp/bionic64' (v1.0.282) with provider 'virtualbox'...

ここまでで一通り、Vagrantでの環境構築、操作、破棄について学べました。
次の節からでは自分のローカルPCと(ゲストの)仮想マシンを間でファイルを同期する方法について学んでいきましょう。

6. Synchronize Local and Guest Files

SSH接続先のプレーンなvimエディタでファイルを編集したいという人は多くないと思います。

Vagrantではファイルを、ローカル-SSH先ゲストPC間で自動的に同期してくれます。
これにより、ローカルで編集したファイルを、仮想開発環境で実行することが出来ます。

デフォルトで、Vagrantはあなたのプロジェクトディレクトリ(3. Initialize a Project Directoryの vagrant initでVagrantfileを作ったディレクトリ)をゲストマシンの/vagrantディレクトリに共有します。

では実際にゲストマシンとのローカルPCでのファイル共有がどのように行われているのか確認していきましょう。

共有ファイルの振る舞いを見てみよう

注意 vagrant sshした時のホームディレクトリである/home/vagrantはローカルでのファイル共有先とは違います。(共有先はルート直下の/vagrantディレクトリ)

まずssh接続して/vagrantディレクトリに移動しましょう。

    $ vagrant ssh
    $ cd ../../vagrant
    $ pwd
    ->/vagrant

/vagrrantディレクトリでhogeファイルを新規作成して

$ touch hoge

ローカルのプロジェクトファイルにもhogeディレクトリがあることが確認できました!

$ exit
logout
$ ls
Vagrantfile hoge

With synced folders, you can continue to use your own editor on your host machine and have the files sync into the guest machine.
同期されたファイルを使って

次はローカルのマシン上でfuga.htmlというファイルを作ってVMでもそのファイルが同期されるかみてみましょう。

まず、ローカルでファイルを作ります。

$ touch fuga.html
$ ls 
Vagrantfile hoge fuga

次にお好みのエディタでfugaの中身を編集してみます。

fuga.html
    <p>ちゃんと編集できてる?</p>

ssh先でもあるfuga.htmlがあることが確認できました!

    $ vagrant ssh
    $ cd ../../
    $ ls vagrant/
    Vagrantfile hoge fuga.html
    //fuga.htmlの中身を確認(viewコマンドで確認でもおk)
    $ cat vagrant/fuga.html
    <p>ちゃんと編集できてる?</p>

次の説ではプロビジョニングを使ってパッケージ、ユーザー、その他諸々をインストールする方法について学んでいきましょう。

7. Provision a Virtual Machine

この節ではプロビジョニングをつかってVMをWebサーバーにしていきましょう。

ローカルの方でHTMLのディレクトリを作成

~/Desktop/vagrant_testにhtmlディレクトリを作成する。

$ mkdir html

次にhtmlディレクトリにindex.htmlファイルを作成する。

~/Desktop/vagrant_test/html/index.html
    <!DOCTYPE html>
    <html lang="ja">

    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Vagrant</title>
    </head>

    <body>
      <h1>Vagrant始めてみたンゴ!</h1>
    </body>

    </html>

※metaタグとかで文字コードしてしないと日本語が文字化けしちゃうよ!

プロビジョニングスクリプトを書いてみる!

このチュートリアルではシェルスクリプトを使って(Webサーバーとして)Apacehをセットアップしていきます。まず下記のシェルスクリプトをbootstrap.shとして保存します。

bootstrap.sh
    #!/usr/bin/env bash

    apt-get update
    apt-get install -y apache2
    if ! [ -L /var/www ]; then
      rm -rf /var/www
      ln -fs /vagrant /var/www
    else
    fi

このスクリプトがApacheをダウンロードし起動してくれます。

さらに「同期されるファイルのディレクトリ」と「Apacehサーバーが、レスポンスとして提供するコンテンツが置いていないか探す場所」との二つの間のsymlink(シンボリックリンク)を作ってくれます。

[補足] シェルスクリプト

  • #!以降のスクリプト

一行目の#!以降のスクリプトはShebang(シバン)と言ってインタプリタ(ソースコードを解釈し実行する翻訳機のようなプログラムのこと)を指定してくれています。
つまり今回だと「これはbashスクリプトして解釈してね」とコンピュータに教えているわけです。
bin/bashでも特に問題ありません。リンク先の解説がわかりやすいです!

  • apt-get

apt-getはDebian用のパッケージ管理システムです。(今回使っているUbuntuもDebian系という種類のLinuxです。)Macで言うところのHomebrewのようなものです。
Ubuntu 14.04から「apt-get」ではなく「apt」コマンドが推奨されるようになっています。リンク先の解説にもある通り、基本的にaptコマンドの方がユーザーにとっても楽です。

  • if以降のスクリプトについて

シェルスクリプトわからん!となりそうだが要は下記のようなif文が書かれていると思えば良いでしょう。
参考:【シェルスクリプト】条件分岐させるifの使い方!

if [ 条件1 ]; then
条件1の際の処理
elif [ 条件2 ]; then
条件2の際の処理
else
条件1,2のどちらでもない場合の処理
fi

条件1にあたるのが! [ -L /var/www ]ですが、-Lは「file が存在し、かつシンボリックリンクならば真となる」ということを意味しており、!は論理否定(!trueであればfalseと同義)を表しています。

つまり/var/wwwディレクトリにfileが存在しなければ処理を走らせる、という意味になります。

以上からこのシェルスクリプトは

初回は「シンボリックリンクの/var/wwwがないので(普通の/var/wwwディレクトリが存在していれば削除した上で、)/vagrantのシンボリックリンクとしての/var/wwwを作成します。」

そして二度目は「シンボリックリンクの/var/wwwがあるのでelse以降の処理(今回は何もない)を走らせる」

ということをしてくれるのだ、ということがわかりました。

次にbootstrap.shを起動させます。

bootstrap.shが起動するようにVagrantを設定する

VMをセットアップしたときにこのスクリプトが起動されるようにVagrantを設定しましょう!

Vagrantfileに下記のconfig.vm.provisionの行を追加してください。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.provision :shell, path: "bootstrap.sh"
end

これでVagrantはbootstrap.shをシェルプロビジョナーとして使ってくれるようになります。

Webサーバーをプロビジョニングする

もしまだ仮想マシンを立ち上げていないのであればvagrant upとするだけでVagrantは自動的にbootstrap.shを使ってプロビジョニングしてくれます。

ただ、既に仮想マシンを立ち上げていても下記のようにリロードしてやれば問題なく動いてくれます。
(プロビジョニングは初回のvagrant upの時のみしかされないので再度vagrant upとしてもダメです。)

$ vagrant reload --provision

ではssh先でwgetコマンドを使ってHTMLファイルを取得してみましょう!

$ vagrant ssh
$ wget -qO- 127.0.0.1
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vagrant</title>
</head>

<body>
  <h1>Vagrant始めてみたンゴ!</h1>
</body>

</html>

[補足] wgetコマンドとは

アットマークIT/Linux基本コマンドによればwgetは「URLを指定してファイルをダウンロードしてくれる」コマンドです。
-q(--quiet)は「経過のメッセージを出力しない」オプションです
-O file(--output-document=file)はダウンロードしたファイルをfile として指定している先に保存します。(リダイレクトで保存先を指定するのに似ている。)また-をfileとして指定するとファイルは標準出力されます。

これが働いてくれているのは既に設定したシェルスクリプトの中で「Apacheのインストール」と「/vagrantディレクトリをApacheのDocumentルートとして設定する」ことを行っているからです。

[補足] Apacheのドキュメントルート

Apachewebサーバーはディフォルトで/var/wwwディレクトリに自身が管理しWebブラウザへのレスポンスとして返すファイルやデータがあるという風に設定されています。(この管理対象下のディレクトリのことをDocumentルートと読んでいるわけです。)
今回はその/var/wwwが/vagrantのシンボリックリンクとなっているため、/vagrantの中身をいじると当然AapcheのDocumentルート下のファイルに変更が反映されます。

次のチュートリアルではネットワークについて扱います。ゲストマシンに対してポートを投げることでゲストマシンの提供するWebサイトにアクセスしてみましょう。

プロビジョニングスクリプトがあまりにも複雑になる場合

プロビジョニングスクリプトの場合は、毎回ビルドするのではなく、あらかじめパッケージがインストールされているカスタムVagrantボックスをパッケージ化した方が効率的です。こちらに詳細があります。

8. Configure the Network

ポートフォワーディング(ポート転送)では、ゲストマシン上のポートを指定をし、ホストマシン上のポートを通して(ファイルの)共有をすることが出来ます。

ポートの転送について設定することで、ゲストマシンのApacheWebサーバーにアクセス出来るようになります。Vagrantfileにconfig.vm.networkの行を追加して、、

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.provision :shell, path: "bootstrap.sh"
  config.vm.network :forwarded_port, guest: 80, host: 4567
end

※上記は「ホストOSに対する4567番ポートへのアクセスをゲストOSの80番ポートに転送すること」を意味しています。

リロードしましょう。

$ vagrant reload

仮想マシンが再起動したら、http://127.0.0.1:4567 にアクセスしてみましょう。

というわけで無事アクセスできたました!

ちなみに、Vagrantには他にもネットワークの形態があり、ゲストマシンに静的なIPアドレスの割り当を行ったり、既存ネットワークにゲストマシンをブリッジさせたりすることができます。他のネットワーク形態に興味がある方はネットワーキングのページを読んでみてください。

9. Share an Environment

Vagrantでは開発環境を提供するのに加えて、これらの環境上で共有や共同作業を容易にしてくれます。この基本機能のことをVagrant Shareと呼びます。

Vagrant Shareはプラグインです。このプラグインはあなたのVagrant環境をネットを介して世界中の誰であっても共有することを可能にします。Vagrant Shareはインターネットに接続された世界中のあらゆるデバイスから自分のVagrant環境に直接ルーティングするURLを提供してくれます。

前提

ngrokをインストールしていること
→ローカル環境で作っているサイトをネット経由で見せたい!って時に使うツール。
※ざっくり概要を掴みたい方は@EsfahanさんのQiita記事、「ngrokの使い方(windows, mac)」がオススメです!

プラグインをインストールする

Vagrant Shareをインストールしましょう

$ vagrant plugin install vagrant-share

環境を共有する

    $ vagrant share

ウェブブラウザを開いて自分の出力したURLを訪れてみましょう!既に作成したApacheがレスポンスしてくれたページがロードされるはずです!(ファイルを修正してURLを再読み込みすれば当然反映されます!)このページは世界中のあらゆるデバイスからアクセス出来ます!

最後に忘れずにセッションを終了させましょう。

$ ^C
==> default: Halting Vagrant share!

もうURLを再読み込みしてもページが見れなくなっているはずです!

Vagrant Shareについてもっと知りたい方はこちらを。
次の章では、ティアダウン(teardown)プロセスについて学んでいきましょう!

10. Teardown an Environment

ここでは今までの章で構築し、手を加えてきた仮想環境を実際に、

(1)一時停止[休止] vagrant suspend
(2)完全停止[シャットダウン] vagrant halt
(3)削除 vagrant

させていきましょう。(1)~(3)のどのオプションを用いるかはあなたがどのくらい長く仕事に用いる仮想環境を止めるか、どのくらい素早く仮想環境を再度起動させたいのか、に依ります。
(当然、休止→停止→削除の順に再起動までの時間はかかります。)

まだはVagrantを立ち上げていない方は立ち上げをお願いします。

$ vagrant up
$ vagrant status
->default                   running (virtualbox)

(1)仮想マシンを一時停止させてみよう

まずは仮想マシンをvagrant suspendを使って一時停止させましょう。

$ vagrant suspend
==> default: Saving VM state and suspending execution...
$ vagrant status
->default                   saved (virtualbox)

vagrant suspendコマンドによる仮想マシンの一時停止はVMを素早く休止、再起動させることができます。

VMはvagrant upとすることで再度停止前の状態で起動します。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'hashicorp/bionic64' version '1.0.282' is up to date...
==> default: Resuming suspended VM...
##... output truncated ...

(2)仮想マシンを完全停止させてみよう

まずは仮想マシンをvagrant haltを使って一時停止させましょう。

$ vagrant halt
$ vagrant status
->default                   poweroff (virtualbox)

これで安全にゲストマシンのOSはシャットダウンされ、VM自体もパワーダウンしてくれます。ディスクの中身もしっかり保存されています。
では確認のため再起動してみましょう。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'hashicorp/bionic64' version '1.0.282' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
##... output truncated ...

ただし完全停止した仮想マシンの再起動にはコールドブートから起き上がるので幾分時間はかかりますし、停止中もディスクスペースを消費します。

(3)仮想マシンを削除してみよう

vagrant destroyして仮想マシンを削除すると、あなたのローカルのマシンからゲストマシンのすべての痕跡が削除されます。ゲストマシンを停止し、電源を落としすことで(ゲストマシンが消費していた)ディスクスペースとRAMを取り戻しましょう。

$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...

上記にあるようにvagrant destroyコマンドの後のプロンプトには「y」(yes)を記入してください。

ここからでもvagrant upと打てば再度仮想マシンは起動させることが出来ます。ただ、起動には時間がかかりますし、以前の状態は破棄されています。

11. Rebuild an Environment

(Vagrantを用いれば)プロジェクトから離れてどれだけ経とうと、すぐに環境をスピンアップ(マシンを起動すること)することが出来ます。

やり方は単純です。

$ vagrant up

以上です!Vagrant環境はVagrantfileを介して全て設定済みです。ですから開発メンバーはいつでもvagrant upコマンドを打つだけで、Vagrantにあなたの作業環境を再現させることが出来るんです。

これでVagrantによる環境構築の一連のライフサイクルは一通り終わりです!

次の最終章ではVirtualBox以外のプロバイダーについても触れておきましょう!

12 .Explore other Providers

新しいプロバイダをインストールする

プロバイダごとの設定について各公式ドキュメントを参照してください!

新しいプロバイダで起動する

新しいプロバイダをインストール出来たら下記のコマンドを打つだけで問題ありません。
(Vagrantfileを弄る必要はありません!)

$ vagrant up --provider=vmware_desktop

一度、上記のように別のプロバイダを指定してvagrant upをしてやれば他のVagrantコマンドでも自動的に指定したプロバイダを使ってくれるようになります!

なので例えばSSH接続の準備や仮想マシンの削除の準備が出来たら(これまでの章でやっていたように)普通にコマンドを打つだけで全く問題ありません。

プロバイダについてより詳しく学びたい方はこちらのページ(リンク先英文公式ドキュメント)を参照してください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuxMintにElixirを導入する

LinuxMintでは公式手順+ファイルの書き換えをする。

  LinuxMint使ってるとよくある事象ではあるのですが、パッケージをインストールするときにパッケージの取得元を変更してあげる必要があるときがあります。
 Elixirの環境セットアップ時も必要だったので、どこをどう書き換えるかも含め、導入手順を記載しておきます。

※ほぼ、公式に記載されている手順通りです。
※LinuxMint19.3 xcfeを利用しています。

導入手順

 

①debファイルの用意

wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && sudo dpkg -i erlang-solutions_2.0_all.deb

②パスの変更

 下記パスのファイルをエディタで開きます。
※読み取り専用ファイルのため、Vimとかだとsudoをつけてあげる必要があるかもしれません。

/etc/apt/sources.list.d/erlang-solutions.list

 開くと下記のような内容が記載されているはずです。

### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out this entry, but any other modifications may be lost.
deb http://binaries.erlang-solutions.com/debian tina contrib

 3行目("deb"から始まる行)を下記の内容へ書き換えます。

deb http://binaries.erlang-solutions.com/debian bionic contrib

③インストール
 下記3つコマンドを叩くだけです。

sudo apt-get update
sudo apt-get install esl-erlang
sudo apt-get install elixir

補足

こちらの記事を元にパスを一部変更して行いました。
https://nakawork.net/posts/install-erlang-linux

公式手順も一部抜粋しておきます。

Ubuntu 14.04/16.04/17.04/18.04/19.04 or Debian 7/8/9/10
Add Erlang Solutions repository: wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && sudo dpkg -i erlang-solutions_2.0_all.deb
Run: sudo apt-get update
Install the Erlang/OTP platform and all of its applications: sudo apt-get install esl-erlang
Install Elixir: sudo apt-get install elixir

引用元:https://elixir-lang.org/install.html#gnulinux

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む