vagrantでやり直しを可能にする
オフライン環境でもvagrantを使って開発がしたい
private_networkを使ってvagrant upしたらエラーが出たので、手順化しました。
The specified host network collides with a non-hostonly network!
This will cause your specified IP to be inaccessible. Please change
the IP or name of your host only network so that it no longer matches that of
a bridged or non-hostonly network.
検証環境
ホストOS:windows8.1
ゲストOS:CentOS
仮想化ツール:VirtualBox、Vagrant
ホストオンリーネットワークの作成
ファイル(F)→環境設定(P)→ネットワーク→ホストオンリーネットワーク(H)
→ホストオンリーネットワークの追加
VirtulBox Host-Only Ehthernet Adapterをダブルクリック
を設定
Vagrantfileの作成
ネットワークの設定はpublic_networkではなくprivate_networkを使います
ipアドレスは10.0.0.101にしました。
構築
ホストをオフラインに設定
右からシャッとだして、オフラインに設定します。
接続
無事接続できました。
参考URL
Leandro Facchinetti | Vagrant host-only network troubleshooting
gitlabの構築
CentOSでgitlabの構築をします
サーバの用意
gitlabのインストール
Ubuntu,Debian,CentOSのパッケージがあります
https://www.gitlab.com/downloads/
確認
ブラウザから接続
アカウントとパスはこれでログインできます
その他
ポートの変更
※reconfigureを実行直後は以下のエラーが出ますが、しばらく待つと接続できるようになります。
リスタート
nginxとpostgre使ってます
バックアップ
参考URL
ChefServerでjenkins構築
chef serverを使ってjenkinsを構築します。
vagrantでjenkinsをインストールするサーバを作成
Vagrantfile
Opscode Communityからjenkinsのcookbookを取得
chef serverにcookbookを登録
clientをserverに登録
clientにレシピを登録
clientにレシピをインストール
ブラウザから確認
おわり
ChefServerによるサーバー管理
手順通りにインストールしたのにうまくいかない。。
うまくはいくけど、手順長すぎ、あと何台構築しないといけないんだろうか。。
なんかバグが出た、このサーバだけ設定が古いせいか、ちゃんとアップデートしといてよ。。
サーバーの構築作業は何かとめんどくさいことが多いです。
今回はそういった問題を解決してくれる便利ツールChefを使ってみました。
構成
Chef Serverは以下の3種類で構成されています。
・Chef Server:レシピやクライアントを管理します
・Chef Client:レシピを使って構築します
・Workstation:レシピの登録やクライアントの追加をします
※レシピ:サーバを構築するための設定です
Chef Soloなどほかの構成はこちらがわかりやすかったです。
下準備
VagrantでServer、Clinet、Workstationにするサーバを作ります。
※vimとscreenを入れているのは趣味です。Chefには使いません。
$ vim Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define :chefs do |dev|
dev.vm.box = "chef/centos-6.5"
dev.vm.network :public_network, ip: "192.168.1.140"
dev.vm.hostname = "192.168.1.140"
# provisioning
dev.vm.provision "shell" do |s|
s.inline = ""
s.inline += "sudo yum install screen -y;"
s.inline += "sudo yum install vim -y;"
end
end
config.vm.define :chefc do |dev|
dev.vm.box = "chef/centos-6.5"
dev.vm.network :public_network, ip: "192.168.1.141"
dev.vm.hostname = "192.168.1.141"
# provisioning
dev.vm.provision "shell" do |s|
s.inline = ""
s.inline += "sudo yum install screen -y;"
s.inline += "sudo yum install vim -y;"
end
end
config.vm.define :work do |dev|
dev.vm.box = "chef/centos-6.5"
dev.vm.network :public_network, ip: "192.168.1.142"
dev.vm.hostname = "192.168.1.142"
# provisioning
dev.vm.provision "shell" do |s|
s.inline = ""
s.inline += "sudo yum install screen -y;"
s.inline += "sudo yum install vim -y;"
end
end
end
今回はすべてCentOSで作っていますが、UbuntuなどほかのOSももちろん使えます。
・Chef Server:192.168.1.140:CentOS
・Chef Client:192.168.1.141:CentOS
・Workstation:192.168.1.142:CentOS
Chef Server(192.168.1.140)を構築
[192.168.1.140] $ wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-server-11.0.12-1.el6.x86_64.rpm
[192.168.1.140] $ sudo rpm -ivh chef-server-11.0.12-1.el6.x86_64.rpm
[192.168.1.140] $ sudo chef-server-ctl reconfigure
使っているOSに応じてインストール方法が違います。
こちらを参考に。Install Chef | Chef
Workstation(192.168.1.142)の構築
knifeをインストール。
最新バージョンだとエラーになるため、旧バージョンをインストールしました。
[192.168.1.142] $ wget https://www.opscode.com/chef/install.sh
[192.168.1.142] $ sudo bash install.sh -v 11.4.0
レポジトリ作成
[192.168.1.142] $ sudo yum install git
[192.168.1.142] $ git clone git://github.com/opscode/chef-repo.git
[192.168.1.142] $ mkdir -p ~/chef-repo/.chef
[192.168.1.142] $ cd chef-repo
[192.168.1.142] $ echo '.chef' >> .gitignore
Chef Server(192.168.1.140)から鍵を持ってくる
[192.168.1.140]$ sudo scp /etc/chef-server/chef-validator.pem vagrant@192.168.1.142:/home/vagrant/chef-repo/.chef/validation.pem
[192.168.1.140]$ sudo scp /etc/chef-server/admin.pem vagrant@192.168.1.142:/home/vagrant/chef-repo/.chef/
鍵の権限を変更
knifeの初期化
[192.168.1.142] $ knife configure --initialWARNING: No knife configuration file foundWhere should I put the config file? [/home/vagrant/.chef/knife.rb]Please enter the chef server URL: http://192.168.1.142:4000 https://192.168.1.140Please enter a name for the new user: [vagrant]Please enter the existing admin name: [admin]Please enter the location of the existing admin's private key: [/etc/chef/admin.pem] ~/chef-repo/.chef/admin.pemPlease enter the validation clientname: [chef-validator]Please enter the location of the validation key: [/etc/chef/validation.pem] ~/chef-repo/.chef/validation.pemPlease enter the path to a chef repository (or leave blank): ~/chef-repoCreating initial API user...Please enter a password for the new user:Created user[vagrant]Configuration file written to /home/vagrant/.chef/knife.rb
レシピの作成
サンプルの手順通りアパッチのレシピを作ります
[192.168.1.142] $ knife cookbook create apache_tutorial
apacheのパッケージを入れる設定
[192.168.1.142] $ vim ~/chef-repo/cookbooks/apache_tutorial/recipes/default.rb
package "httpd" do
action :install
end
service "httpd" do
action [ :enable, :start ]
end
cookbook_file "/var/www/html/index.html" do
source "index.html"
mode "0644"
end
Hello Worldを表示するhtmlファイルを作る
[192.168.1.142] $ vim ~/chef-repo/cookbooks/apache_tutorial/files/default/index.html<html>
<body>
<h1>Hello, world!</h1>
</body>
</html>
knifeでサーバにレシピを登録する
[192.168.1.142] $ knife cookbook upload apache_tutorial
サーバで登録したレシピを確認
ログイン
Username:admin
Password:p@ssw0rd1
無事apache_tutorialのレシピが登録されています。
クライアント登録
サーバにクライアントを登録します。
[192.168.1.142] $ knife bootstrap 192.168.1.141 -x vagrant -P vagrant --sudo
無事登録されました。
クライアントにレシピを登録する
WorkStationから実行します
[192.168.1.142] $ knife node run_list add 192.168.1.141 'recipe[apache_tutorial]'
サーバの画面からでも可能です。
以下の画面でAvailable RecipesからRun Listにドラッグ&ドロップをするだけ。
追加できました。
レシピを反映する
[192.168.1.142] $ knife ssh name:192.168.1.141 'sudo chef-client' -P vagrant
レシピが反映されたか確認
WEBからアクセスするとHello Worldと表示され、作ったレシピ通りに動いています。
・
Chefいいね!
参考
入門 Chef Server #biglobetechtalk :かなり参考になりました
トラブルシューティング
$ sudo knife configure initial
WARNING: No knife configuration file found
Where should I put the config file? [/root/.chef/knife.rb]
ERROR: Ohai::Exceptions::DependencyNotFound: Can not find a plugin for dependency os
→バグらしいので旧バージョンをインストールする
vagrantで開発環境を整える
vagrantはdockerのようにべき等性のある開発環境を作ることができます。
dockerはコンテナ型の仮想化であるのに対し、vagrantはVirtualBox、VMWare、Hyper-Vを利用しているのでホスト型とハイパーバイザー型の仮想化です。
ようは、WindowsやMacで簡単にlinux環境を作ったり壊したりできるとても便利なツールです。
ではではWindows環境でCentOS、Fedora、Debian、Ubuntu環境を作ってみます。
インストール
ここから環境にあったものをダウンロードしてインストール
ruby gemもあるがバージョンが古い。
あとVirtualBoxもインストールする
VirtualBoxで64bitのOSが入れられなかくなるのでHyper-VはOFFにします。
sshクライアントはPuTTY ごった煮版を使いました。
試しにubuntu環境を作る
コマンドプロンプトを起動(windowsキー→cmdと打つ→Enter)し以下のコマンドを実行。
> mkdir test
> cd test
> vagrant init hashicorp/precise32
> vagrant up
それぞれのコマンドがやっていることはこんなイメージ。
vagrant init hashicorp/precise32
ubuntuの32bit(hashicorp/precise32)のイメージをダウンロードし、Vagrantfileを初期化。
vagrant up
Vagrantfileを読み込みVirtualBoxでubuntu環境を作成。
仮想環境にログインする
SSHクライアントがないので怒られる。Cygwinなどで起動していればこれでログインできるはず。
今回はPuttyを使ってログインします。必要な情報はこれです。
Host: 127.0.0.1
Port: 2222
Username: vagrant
ホスト名:127.0.0.1
ポート:2222
ユーザ:vagrant
パス:vagrant
でログインできます。
vagrant@precise32:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04 LTS
Release: 12.04
Codename: precise
ubutu環境の出来上がりです。
他の環境も作る
vagrantはOSを『box』で管理しています。
ではCentOS、Fedora、Debian、Ubuntuのboxをvagrantcloudから取得します。
# ダウンロード
> vagrant box add chef/centos-6.5
> vagrant box add chef/ubuntu-13.10
> vagrant box add chef/debian-7.4
> vagrant box add chef/fedora-20# 確認
>vagrant box list
chef/centos-6.5 (virtualbox, 1.0.0)
chef/debian-7.4 (virtualbox, 1.0.0)
chef/fedora-20 (virtualbox, 1.0.0)
chef/ubuntu-13.10 (virtualbox, 1.0.0)
hashicorp/precise32 (virtualbox, 1.0.0)
Vagrantfileを作る
dev.vm.boxにbox名を指定します。
VirtuabBoxに環境を作る
> vagrant up
VirtuabBoxに環境ができました。
プロビジョニング
デフォルトではscreenやvimが入っていません。Vagrantfileを修正して入れます。
centosだけvimとscreenをインストールする設定をします。
> notepad Vagrantfile
VAGRANTFILE_API_VERSION = "2"dev.vm.provision "shell" do |s|endendendendendend
起動しているboxの設定を読み込みなおすには『up』コマンドではなく『reload』コマンドを使います。
centosのみプロビジョニングも含めて再設定するため、『centos --provision』と書いています。
$ screen -v
Screen version 4.00.03 (FAU) 23-Oct-06
$ vim --version
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Apr 5 2012 10:17:30)
無事インストールできました。
そのほかコマンド
vagrantの終了
vagrant destroy
vagrantの中断
vagrant suspend
vagrant resume
boxの作成
vagrant package --base CentOS64
※実行前にVirtualBox上でCentOS64という名前の仮想環境を作る必要があります。
boxの削除
vagrant box remove hashicorp/precise32 virtualbox
資料
xmlのパースがしたい!nokogiri
RubyでxmlやhtmlのパースするためにNokogiriの使い方を調べました。
インストール
gemからインストールできます。
gem install nokogiri
■パース
・直接パース
html = "<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>"
html_doc = Nokogiri::HTML(html)
xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")
puts html_doc
puts xml_doc
結果
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>
<root>
<aliens>
<alien>
<name>Alf</name>
</alien>
</aliens>
</root>
・ファイルからパース
f = File.open("test.xml")
doc = Nokogiri::XML(f)
f.close
puts doc
結果
<?xml version="1.0"?>
<sushi>
<ikura>very good</ikura>
<saba>good</saba>
</sushi>
・urlからパース
require 'open-uri'
doc = Nokogiri::HTML(open("http://yahoo.co.jp"))
puts doc.title
実行結果
・自動で補完する
</b>がないので通常であればエラーになるはずが、、
doc = Nokogiri::XML('<a><b>b<c>c</c></a>')
puts doc
<?xml version="1.0"?>
<a>
<b>b<c>c</c></b>
</a>
勝手に補完してくれます。
・パースするときのオプション
xmlの構文が間違っているときエラーにしたい場合はオプションをつけて読み込みます
doc = Nokogiri::XML('<a><b>b<c>c</c></a>') do |config|
config.strict
end
puts doc
実行するとちゃんとエラーになります
/opt/ruby-1.9.3-p545/lib/ruby/gems/1.9.1/gems/nokogiri-1.6.1/lib/nokogiri/xml/document.rb:55:in `read_memory': Premature end of data in tag a line 1 (Nokogiri::XML::SyntaxError)
from /opt/ruby-1.9.3-p545/lib/ruby/gems/1.9.1/gems/nokogiri-1.6.1/lib/nokogiri/xml/document.rb:55:in `parse'
from /opt/ruby-1.9.3-p545/lib/ruby/gems/1.9.1/gems/nokogiri-1.6.1/lib/nokogiri/xml.rb:33:in `XML'
from noko.rb:43:in `<main>'
■検索
・<b></b>で囲まれたタグを取得
コード
doc = Nokogiri::XML('<a><b>b1</b><b>b2</b><c><b>b3</b></c></a>')
puts doc
puts doc.xpath("//b")
パースしたxml
<?xml version="1.0"?>
<a>
<b>b1</b>
<b>b2</b>
<c>
<b>b3</b>
</c>
</a>
結果
<b>b1</b>
<b>b2</b>
<b>b3</b>
・特定のタグを取得
コード
doc = Nokogiri::XML('<a><b>b1</b><b>b2</b><c><b>b3</b></c></a>')
puts doc
puts doc.xpath("/a/b")[1]
パースしたxml
<?xml version="1.0"?>
<a>
<b>b1</b>
<b>b2</b>
<c>
<b>b3</b>
</c>
</a>
結果
<b>b2</b>
・値を取得
コード
doc = Nokogiri::XML('<a><b>b1</b><b>b2</b><c><b>b3</b></c></a>')
puts doc
puts doc.xpath("/a/b")[1].inner_text
パースしたxml
<?xml version="1.0"?>
<a>
<b>b1</b>
<b>b2</b>
<c>
<b>b3</b>
</c>
</a>
結果
b2
・属性値を取得
コード
doc = Nokogiri::XML('<a><b>b1</b><b src="src_b2">b2</b><c><b>b3</b></c></a>')
puts doc
puts doc.xpath("/a/b")[1].attr("src")
パースしたxml
<?xml version="1.0"?>
<a>
<b>b1</b>
<b src="src_b2">b2</b>
<c>
<b>b3</b>
</c>
</a>
結果
src_b2
■変換
・値の変更
コード
doc = Nokogiri::XML('<a><b>b</b><c>c</c></a>')
puts doc
b = doc.at_css "b"
b.content = "bbbb"
puts doc
変換前
<?xml version="1.0"?>
<a>
<b>b</b>
<c>c</c>
</a>
変換後
<?xml version="1.0"?>
<a>
<b>bbbb</b>
<c>c</c>
</a>
・ノードの移動
コード
doc = Nokogiri::XML('<a><b>b</b><c>c</c></a>')
puts doc
b = doc.at_css "b"
c = doc.at_css "c"
b.parent = c
puts doc
変換前
<?xml version="1.0"?>
<a>
<b>b</b>
<c>c</c>
</a>
変換後
<?xml version="1.0"?>
<a>
<c>c<b>b</b></c>
</a>
・ノード移動2
コード
doc = Nokogiri::XML('<a><b>b</b><c>c</c></a>')
puts doc
b = doc.at_css "b"
c = doc.at_css "c"
c.add_next_sibling(b)
puts doc
変換前
<?xml version="1.0"?>
<a>
<b>b</b>
<c>c</c>
</a>
変換後
<?xml version="1.0"?>
<a>
<c>c</c>
<b>b</b>
</a>
・属性の追加
コード
doc = Nokogiri::XML('<a><b>b</b><c>c</c></a>')
puts doc
b = doc.at_css "b"
b['img'] = "bbb.img"
puts doc
変換前
<?xml version="1.0"?>
<a>
<b>b</b>
<c>c</c>
</a>
変換後
<?xml version="1.0"?>
<a>
<b img="bbb.img">b</b>
<c>c</c>
</a>
・ノードの追加
コード
doc = Nokogiri::XML('<a><b>b</b><c>c</c></a>')
puts doc
d = Nokogiri::XML::Node.new "d", doc
d.content = "ddddd"
c = doc.at_css "c"
c.add_next_sibling(d)
puts doc
変換前
<?xml version="1.0"?>
<a>
<b>b</b>
<c>c</c>
</a>
変換後
<?xml version="1.0"?>
<a>
<b>b</b>
<c>c</c>
<d>ddddd</d>
</a>
・ラップする
コード
doc = Nokogiri::XML('<a><b>b</b><c>c</c><d>d</d></a>')
puts doc
nodes = doc.css "b,c"
wrapper = nodes.wrap("<test></test>")
puts doc
変換前
<?xml version="1.0"?>
<a>
<b>b</b>
<c>c</c>
<d>d</d>
</a>
変換後
<?xml version="1.0"?>
<a>
<test>
<b>b</b>
</test>
<test>
<c>c</c>
</test>
<d>d</d>
</a>
こんな感じでいろいろできます。
トラブルシューティング
エラー
libexslt.so.0: cannot open shared object file: No such file or directory
対処法:libxsltをインストールする
sudo yum install libxslt