Vagrant の使い方まとめ

Vagrant は仮想マシンを実験できる素晴らしいツールです。
毎度毎度やりたいことを自分で掘り起こすのにつらみを感じてきたのでまとめました。
随時まとめていきます。
最近は Otto も出てきたのでそっちに移行したいですが。

ポートフォワーディングの設定

こんな感じでやると http://localhost:8888/ で 8080 でリッスンする仮想マシンにアクセスできます。

  config.vm.network "forwarded_port", guest: 8080, host: 8888

ブリッジしたい

DHCP

  config.vm.network "public_network"

IP 指定したい

サブネットごえするばあいは VM の中にデフォルトゲートウェイを指定してあげる必要があります。

  config.vm.network "public_network", ip: "192.168.0.17"

NIC を指定する

この場合上だけだと vagrant up するたびにブリッジする NIC を聞かれてうざいので、NIC を指定します。

  config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)"

Vagrant box を指定する

僕はよく puppetlabs で提供されている
前までは chef で提供されているものを使ってたんですが、なくなりました。
ATLAS で探してみましょう。

puppetlabs | Atlas by HashiCorp

  config.vm.box = "puppetlabs/centos-7.2-64-nocm"

ATLAS ができる前は野良 Vagrant box を以下から拾ってきたり、セキュリティが気になる場合は Packer で自分で作る必要がありました。

A list of base boxes for Vagrant – Vagrantbox.es

スペックを指定したい(VirtualBox)

デフォルトだと 1 CPU の 2 GB の割当なので、コンピューティングリソースをもう少し増強したい場合は以下の様な指定をする。

  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "2", "--ioapic", "on"]
  end

複数の VM を立ち上げる

何も 1 台構成だけが脳じゃありません。
こんな 3 台構成もできる。

  config.vm.define "web" do |instance|
    instance.vm.box = "puppetlabs/centos-7.2-64-nocm"
    instance.vm.network :private_network, ip: "192.168.33.10"
  end

  config.vm.define "ap" do |instance|
    instance.vm.box = "puppetlabs/centos-7.2-64-nocm"
    instance.vm.network :private_network, ip: "192.168.33.11"
  end

  config.vm.define "db" do |instance|
    instance.vm.box = "puppetlabs/centos-7.2-64-nocm"
    instance.vm.network :private_network, ip: "192.168.33.12"
  end

Windows ユーザーが喜ぶ vagrant ssh の代わりに Tera Term を手軽に使える vagrant-teraterm プラグイン

私も 1 行だけコミットした vagrant-teraterm プラグインというのがあります。
vagrant ssh でもできるが、コマンドプロンプト内で Linux に入るという行為自体がキモい。
これ知る前は毎回 SSH のフォワーディングポート調べて Tera Term 手動で立ち上げて SSH してたんですが、
これで毎回フィンガープリントを確認される不自由から開放されます。
でも、正直 Mac のほうが使いやすいですよ。

vagrant plugin install vagrant-teraterm
vagrant up
vagrant teraterm

シェルプロビジョニングをする

Ansible や Chef を使うほどではないが、毎回立ち上げるたびにコマンドコチコチ入力するのも面倒だというときに一番強力なのがシェルプロビジョニングです。

  config.vm.provision "shell", inline: <<-SHELL
    sudo yum -y install epel-release
    sudo yum -y install --eneblerepo=epel nginx
  SHELL

ある程度出来上がった Vagrant の実行イメージを出力する

これはけっこう強力で、例えばLAN内のローカルミラーを参照するように設定したり、
例えば毎回 vagrant up するたびに Nginx や MySQL をインストールするのは正直だるいって時には vagrant package サブコマンドを使う。
Packer でがんばってやらなくてもいいのでお手軽でおススメ。

ある程度まとまった開発環境ができあがったらそれを他の開発者に配布するという使い方もできる。

vagrant package
rename package.box centos-7.2-x86_64-mysql-5.6.box
vagrant box add centos-7.2-x86_64-mysql-5.6 centos-7.2-x86_64-mysql-5.6.box

add し終わったら Vagrantfile の box 名指定するところにそれを指定して vagrant up すれば特定の役割を持った仮想マシンがいろんなミドルウェアを入れるオーバーヘッドがなくなるので楽ちんなのだ。

プライベートな Vagrant box Registry がほしいなあ。。。

参考リンク

  1. Documentation - Vagrant by HashiCorp
  2. 「hbstudy#60 SerfとConsulでシステム運用を楽しくしよう!」に行ってきました&Serf試してみました - 戦場のプログラマー
  3. RedHat 系 Linux のホスト名を設定する - 戦場のプログラマー
  4. vagrant teraterm が便利すぎてしょうがない件 - 戦場のプログラマー
  5. vagrant-digitalocean provider の簡単な使い方 - 戦場のプログラマー
  6. vagrant-digitalocean で vagrant up すると NoMethodError となる件 - 戦場のプログラマー
  7. Macでvagrant-omnibusプラグインのインストール中にnokogiriのインストールでコケるというお話 - 戦場のプログラマー

テクノロジー系のリリース&イベントカレンダーを作ってみた

Ubuntu, Fedora のリリース日とか、デジタルガジェットの発売日とかを載せてく予定です。
基本ものぐさなのでキャッチアップできていかない気がするので、目的を書いて編集権限リクエストしてくれれば編集権限出しますのでウェルカム。
そんなカレンダーもうあるよって人は教えて下さい。

ちなみに私の趣味の予定も入っています。

Technology Release & Event Calendar

CentOS 7.2.1511 に yum-cron 入れた

yum -y install yum-cron
systemctl start yum-cron
systemctl enable yum-cron

設定ファイル /etc/yum/yum-cron.conf はこれぐらいにしておけば OK 。

CentOS 6 時代は yum-cron を入れたら問答無用でアップデートを適用して再起動が必要だっら再起動する凶悪な仕様だったが、CentOS 7 の yum-cron はダウンロードするのみで止まるようだ。

僕は更新があったらメールを送るようにした。

apply_updates = no

#(snip)

[email]
# The address to send email messages from.
email_from = root@smtp.example.com

# List of addresses to send messages to.
email_to = username@example.com

# Name of the host to connect to to send email messages.
email_host = localhost

Nginx + php-fpm の CentOS 7.2.1511 をリブートしたら 502 Bad Gateway になった

更新が溜まっていたので yum -y update した。
カーネル系の更新があったのでリブートしたら 502 Bad Gateway となった。

2016-04-03_20h32_15

あまりにも初歩的なんだけど、ログを確認したら

2016/04/03 20:31:21 [crit] 1410#0: *1 connect() to unix:/var/run/php-fpm/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 203.0.113.12, server: pg1x.io, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "pg1x.io", referrer: "https://blog.pg1x.com/"

FastCGI 処理系の php-fpm と通信できていないっぽい。
つまり php-fpm のプロセスが立ち上がっていない。
なんつー初歩的。。。
自動起動設定して起動して解決。

systemctl start php-fpm
systemctl enable php-fpm

Nginx 経由で動く WordPress でパーマリンクをデフォルトから変更したら 404 になった

Nginx + php-fpm で構築した新規 WordPress ブログのパーマリンクをもっとわかりやすい URL にしたいなと思って年月日と英語タイトルにしてみたら見事に 404 になった。

Homebrew で GitHub API rate limit exceeded って言われた時


2016-04-03_19h58_29

2016-04-03_19h58_35

検索して出てきたのは以下。

nginxでwordpressのパーマリンクをデフォルト以外に対応する – Qiita

サンプルを元に設定を変えてみる。

server {
    listen       80;
    server_name  yourhost.com;
    root         /usr/share/nginx/wordpress;
    index        index.php

    charset utf-8;

    location / {
        try_files $uri $uri/ @wordpress;
    }

    location ~ \.php$ {
        try_files $uri @wordpress;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /usr/share/nginx/wordpress$fastcgi_script_name;
        include       fastcgi_params;
    }

    location @wordpress {
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /usr/share/nginx/wordpress/index.php;
        include       fastcgi_params;
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

これを参考に設定してみた。

真っ白なんだなー。。
エラーログ確認してみるとなんだか

2016/04/03 19:58:32 [error] 21562#0: *5481 "/var/www/wordpress/2016/03/27/homebrew-says-github-api-rate-limit-exceeded/index.php" is not found (2: No such file or directory), client: 203.0.113.12, server: pg1x.io, request: "GET /2016/03/27/homebrew-says-github-api-rate-limit-exceeded/ HTTP/1.1", host: "pg1x.io", referrer: "https://blog.pg1x.com/"

よくよく見直すと以下が足りていないので付け足した。
私の例はこんな感じ。

        include        fastcgi_params;
server {
    listen 443 default ssl;
    server_name pg1x.io;
    root /var/www/wordpress;
    index  index.php index.html index.htm;

    charset utf-8;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/blog.pg1x.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.pg1x.com/privkey.pem;

    location / {
        try_files $uri $uri/ @wordpress;
    }

    location ~ /wp-login\.php.* {
        include conf.d/access_list.conf;

        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/wordpress$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ \.php$ {
        try_files $uri @wordpress;

        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/wordpress$fastcgi_script_name;
        include        fastcgi_params;
    }

    location @wordpress {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME  /var/www/wordpress/index.php;
        include        fastcgi_params;
    }

}

見れた!

2016-04-03_20h12_50