五条の比較的自由な日記

ツイッターだと短くて書けないようなことを書くためのブログ

chefでのサーバ設定確認に使えそうなメソッド

Chefでサーバの設定を行うのはいいとして、正常にファイルが配置されたかとか、ファイルの権限・所有者が正しいかとか確認するのもchefで行いたいよね。

というわけでChefで使える(かも知れない)メソッドを自分で書いてみました。いちいちクラスにする必要があるのか無いのかは置いておいて、これで最終確認用のChefレシピを使ってみましょう。

自分で動確していないものとかも幾つかあるのと、Ruby歴20時間くらいの私の書くコードなのであまり信用しないでください。あと、ブログに貼付け時にタブが落ちてしまいましたがそのままで行きます。引数を配列で返すところの変換周り、きっともっといい方法があると思いますが、私のRuby歴は20時かn(略)

require 'date'
require 'etc'
require 'fileutils'
require 'socket'

###########################
# クラス作成
class Std_class
def initialize()
end

######################################
# cpとchmod
def chprev(src,dest,user,group,prev)
if File.exist?(src)==false
return false
end
if File::ftype(src) == "directory" then
FileUtils.chmod_R(prev,src)
FileUtils.chown_R(Etc.getpwnam(user).uid , Etc.getgrnam(group).gid , src)
else
FileUtils.chmod(prev,src)
FileUtils.chown(Etc.getpwnam(user).uid , Etc.getgrnam(group).gid , src)
end
return true
end

######################################
# chmod
def chmod_r(src,prev)
FileUtils.chmod_R(prev,src)
end

######################################
# ファイルの存在確認
def file_exist (src)
return File.exist?(src)
end

######################################
# ファイルの存在確認
def dir_exist (src)
return Dir.exist?(src)
end

######################################
# ひとつ上のディレクトリがあるか確認し、なければ作成
def create_pdir (src)
src.gsub!(/\/$/,'')
data = src.split('/')
path = '/'
for i in 1..(data.length-2) do
path += data[i] + '/'
end
if File.exist?(path) == false
FileUtils.mkdir_p(path)
end
end

######################################
# preにバックアップ(存在していれば)
def back_pre (src)
if File.exist?(src)
create_pdir("#{$pre_root}#{src}")
FileUtils.cp("#{src}","#{$pre_root}#{src}")
end
end

######################################
# posにバックアップ
def back_pos (src)
# posにバックアップ
create_pdir("#{$pos_root}#{src}")
FileUtils.cp("#{src}","#{$pos_root}#{src}")
end


######################################
# 適用
def back_apply (src,user,group,prev)
FileUtils.cp("#{$chef_tmp}#{src}","#{src}")
# srcのオーナーとグループ変更
File.chown(Etc.getpwnam(user).uid , Etc.getgrnam(group).gid , src)
# srcの権限変更
FileUtils.chmod(prev,src)
end

######################################
# preにバックアップ。適用。posにバックアップ
def bak_apply (src,user,group,prev)
back_pre(src)
back_apply(src,user,group,prev)
back_pos(src)
end

######################################
# ポート番号チェック
# proはサーバ名
# 返り値は配列で返す
def port_check_net(pro)
com="sudo netstat -anp --tcp |grep #{pro}"
res=`#{com}`
headers, *scores = res.lines.map { |line| line.chomp.split(' ') }
j=0
port =Array.new()
for i in 1..(scores.length-1) do
@te1=scores[i][3].split(':')
if @te1.length >= 2
port[j] = @te1[@te1.length-1]
j += 1
end
end
port.sort!
port.uniq!
return port
end

######################################
# コマンド実行。
# 返り値は配列で、
# ['out'] 通常の返り値
# ['rtn'] 終了コード(boolでtrueが正常。falseが異常)
# ['arr'] 返り値を行で分割で返す。
def command(com)
com = com + ' ; echo $?'
res=`#{com}`
te1=res.split("\n")
kaeri={'out'=>'','err'=>'','arr'=>Array.new()}
if te1[te1.length-1] != '0' then
kaeri['err'] = te1[te1.length-1]
kaeri['out'] = false
return
end
for i in 0..(te1.length-2) do
kaeri['out'] += te1[i] + "\n"
kaeri['arr'][i] = te1[i]
kaeri['rtn'] = true
end
return kaeri
end

######################################
# ファイルが存在するか確認。
def exist (input)
return File.exist?(input)
end

######################################
# 日付を返す。
def date ()
day = Time.now
return day.strftime("%Y%m%d_%H%M%S")
end
# hostname
def hostname ()
return Socket.gethostname
end
end

 Rubyの所感として、

  • ループ周りがC言語臭くなくてやりにくいのと、i++が使えない(多分)で、やりにくかった。
  • 変数の$と@と@@があるとかかなりアレな言語だと思わざるを得ない。Perlのように「強引に拡張しましたァ」なら許せるが、普通にpublicとかstaticでいいのでは無いでしょうか。
  • bashpythonとかみたいにクセのある書き方の言語ですね。私はforがものすごく好きで、ほとんどループはforなんだけど、rubyのforは使いたくないと思った。なんでChefはrubyを採用したんだ、pythonでいいじゃないか。
  • やっぱりインタプリタ界最強の言語はphpだと確信できた。(書きやすさ的な意味で。javaは除く)

rubyがuid、gidでしか使用できないのを見てクラス化したのですが少しは役に立つと嬉しいです。

オススメのchef

どうも五条です。chefを使いたいという人がいたらknife-soloはいかがでしょうか?私はいろいろ調べた結果chefはknife-soloで運用しています。インストールはこれを見れば迷わないと予想される。

  • chefの大雑把な説明

chefとは①ローカルでサーバの設定ファイルを作成して、②リモートのサーバに変更を行い、③それら設定ファイルや変更事項がリポジトリ管理されていて、④誰が何回行っても同様の設定結果が行われ、⑤事前に変更内容を上司や同僚などに確認させて判子を押させてから実行することができ、⑥複数台に同様の変更・設定を加えるときに、手間が減るようにするためのアプリ。種類が沢山あるが、vagrantを使うまでも無いと私は考えているので、chefの一種であるknife-soloにする。

  • 使用上の注意

実行ユーザが鍵認証でリモートのホストへパスワード無しでログインでき、リモートでsudo -sでパスワード無しでrootになれることが必要。

  • knife-soloのインストール

# rubyのインストール。ruby-develはchefのコンパイルに必要。
yum install ruby ruby-deve

# gemでknife-soloをインストール(gemはruby専用のyumみたなもの)
gem install knife-solo

  • chefホームの設定

# chef用ディレクトリを作成し、chefホームにする。ここでは~/chefをchefのホームに設定する。(どこでもいいがユーザのホームディレクトリ内が正しい気がする)
mkdir ~/chef && cd ~/chef

# knife-soloに使用するファイルの展開。カレントに展開。
knife solo init .

# 初期設定。全部ディフォルトで良い。
knife configure

# 必要なら変更する。おそらく鍵の部分は変更になるかもしれない。
vim ~/.chef/knife.rb

# cookbookの作成
cookbook=test

#testというクックブックを作成。これで~/chef/bookcooks/testが作成される。
knife cookbook create $cookbook -o cookbooks 

# $hostにchef-solo(knife-soloを動作させるファイル郡の配置)
host=centlocal
knife solo prepare $host

  • rubyをインストール場合

vim cookbooks/$test/recipes/default.rb

yum_package 'ruby' do
 action :install
end

# run_list設定。recipeの中のtestはdefaultの場合はtestだけで良い。それ以外の場合は、「test::ファイル名」と書く。

vim nodes/$host.json # 先頭の方のみ追記

"run_list":[
  "recipe[test]"
],

# 実際にレシピを実行
knife solo cook $host

# 結果確認
ssh $host "rpm -q ruby"

  • ファイルコピーの場合の例

#ファイルコピーという名前でクックブックを作成
cookbook=filecopy
knife cookbook create $cookbook -o cookbooks

# レシピ作成
vim cookbooks/$test/recipes/default.rb

cookbook_file '/etc/hosts' do
source "etc.hosts"
owner "root"
group "root"
mode "0644"
end

vim nodes/$host.json # 先頭の方のみ追記

"run_list":[
 "recipe[filecopy]"
],

# knife-solo実行
knife solo cook $host

 # 結果確認
ssh $host "cat /etc/hosts"

cookbook=bash
knife cookbook create $cookbook -o cookbooks

vim cookbooks/$cookbook/recipes/default.rb

script "copy file" do
interpreter "bash"
code <<-EOH
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 sleep 1
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 sleep 1
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 sleep 1
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 sleep 1
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 EOH
end

# 先頭の方のみ追記
vim nodes/$host.json 

"run_list":[
"recipe[bash]"
],

# knife-solo実行
knife solo cook $host

# 結果確認
ssh $host "ls -l /etc/hosts*"

-rw-r--r-- 1 root root 183 7月 22 19:52 2016 /etc/hosts
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201205
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201206
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201207
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201208
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201209
-rw-r--r--. 1 root root 378 4月 19 22:10 2015 /etc/hosts.allow
-rw-r--r--. 1 root root 460 1月 12 22:28 2010 /etc/hosts.deny

  • 小技というか実際の使い方。

私に言わせれば使い方は二種類ある。①対象のホスト毎にクックブックを 作成する方法と、②サーバプログラム毎にクックブックを作成する方法。

  1. おそらくこのソフトを作った人は①を想定しているが、毎回同じ設定を必ず同じサーバプログラムに適用するというケースは考えにくいし、実際そうはならずに点在したファイルを追っかける羽目に何度もなった。提出時の可読性も下がる。よって現実的には②の使用方法でホスト毎にクックブックを作成するのが正解では無いだろうか。
  2. インフラエンジニアにいきなりrubyかつchefの記述をいきなり読めって言うのは酷である。chef独自の便利機能は多いが、実際問題はchefの中で使用するのはほぼbashのみになる。事前に設定済みのconfファイルを用意しておけば、bashだけでほぼ行けるし、今までもそれでやった。

onedrive-dのインストール方法

はい。五条です。onedrive-dのインストール方法です。onedrive-dはlinuxでonedriveを使うためのソフトです。非常に軽快に動きます。ちなみにwineではwindoiwsのonedriveは動作しないらしいです。

注意点はあまり無いのですが、公式のインストール方法が若干間違っているようなので記します。環境はlinux7のfedoraを想定していますが、他のLinuxでも同様だと思われます。ユーザ名はgojoで、ホームは/home/gojoだと想定します。

・別にどこでもいいが、私はココにソースを展開する。

$ cd /usr/local/src/

・ソースをクローン
$ git clone https://github.com/xybu92/onedrive-d.git

・ソースに移動
$ cd onedrive-d.git

(pip3がインストールされる。)

・インストール
$ sudo python3 setup.py install

・一時ファイルを削除
$ sudo python3 setup.py clean

・onedrive用設定ディレクト
$ mkdir ~/.onedrive

・設定ファイルの雛形をコピー
$ cp ./onedrive_d/res/default_ignore.ini ~/.onedrive/ignore_v2.ini

・ログを作成複数ユーザの場合はグループで設定したほうがいいと思う。
$ sudo chown gojo /var/log/onedrive_d.log

・初期設定を起動。このあといろいろ聞かれるので答えていく。最後にurlがポップアップして、移行した後のurlを端末に貼り付ける。
$ onedrive-pref

デバッグモードで実行。変なエラーが出ていなければ良しとする。
$ onedrive-d start --debug

・一旦終了
$ onedrive-d stop

・本当に開始
$ onedrive-d start

・onedriveディレクトリを確認。同期されていれば良しとする。

$ ls -l ~/OneDrive/

・実際に起動
$ onedrive -d start

 ・じつはrootユーザで実行できないらしい。そこで詰まった。要するに最初からrootになっておくのではなく、onedriveの実行ユーザでインストールを実行したほうが良い。

・/etc/init.d/起動スクリプトを書こうと思ったが、どうやらrootからのsudo -u gojoでの実行はできないようだ(探そうとしたが根が深い)。なので、/usr/local/bin/の中に起動用のスクリプト軍を作って、起動時に一回動かしてるのは私だけは無いだろう。こんな感じで

#/bin/sh
onedrive-d start
setxkbmap -rules evdev -model jp106 -layout jp

というわけで皆さん良いonedriveライフを!

 

フォレスト・ガンプを見た

アマゾンプライムビデオで無料だったのでフォレスト・ガンプを見た。

確か友人がオススメと言っていたが、どの辺りがオススメなのかはよくわからないと言っていたので気になっていた。

話を要約すると、主人公は頭が悪くて足にギブスをつけないと歩けない少年だったが、足はなぜだか回復し、頭の悪さは身体能力の高さと偶然出会った場所・人が補い、最後は超リッチになる。最初に出てきた幼なじみと出会ったり別れたりするけど、最後は添い遂げる。

と書くと非常に順風満帆だが、実はそうではないというところが面白い。つーかほぼ全部苦労と努力した後の偶然でうまくいく。主人公のフォレスト・ガンプになって一生を終えた気持ちが味わえる良作品。

LINUXでしかできないことを考えてみた

LINUXでしかできないことを考えてみた。結果、無い

  • LINUX専用ソフトがない。WINDOWS専用ソフトとかMAC専用ソフトはあるけど、LINUX専用ソフトは無い。特にゲーム。
  • LINUXでできることは、他のUNIX系OSのSoralisやBSDでもできる。
  • コマンド使いたければcygwin使えばいい。

だが、メリットはある。

  • ネット上で資料が多い。
  • VPSを借りるとき、LINUXは必ず入っている。
  • LINUX使ってる、と自慢できる。(重要!)
  • 他のUNIX系OSよりもドライバ対応が良い(WINDOWSとかMACには圧倒的に劣る)
  • WINDOWSとかMACよりメモリ消費が少ない。(OS使うためにパソコン使ってるんじゃねーし)

私は普段LINUX使ってるけど、どのOS使ってても全然変わらんと思うし、OS戦争とかは無意味だと思っている。実はWINDOWSマイクロカーネルだけど、モノリシックカーネルと全然使い心地は変わらない。ただ、OFFICEだけはLINUX版出して欲しいと思っている。

あと言っておくと、ドライバに関して「このサーバではLINUXのドライバが完備されています!」ってハードウェアを買うのが普通なので大して問題ではないが、「このWindowsノートパソコンにLINUXを入れる!」となると苦労する場合がある。

moto360レビュー

写真は無い。3ヶ月くらい使った感想。

 

■目的

  • androidウェアがどんなのか試すため。
  • 心拍計が付いているので。
  • 時計が欲しかったので。
  • 道に迷いやすいので、googleマップ使いたい。

■長所

  • 安かった(2.5万円)。
  • 通知が便利。特に着信に気づかないことがほとんど無くなった。
  • 充電が便利。置くだけ。
  • かっこいい(個人的意見)。
  • 話のネタになる。
  • 一日の運動時間が自動で出る。
  • つけごごちが良い。話によるとandroidウェアの中で最軽量の部類に入るらしい。同タイプの普通の時計と同じくらいの重さらしい。

■短所

  • 電池が1日で50%減る。3日くらい持って欲しかった。
  • googleマップ使いたかったのに、ほとんど役に立たない。
  • 音声認識がクソ悪い。ipadのsiriのほうがかなり上。
  • 心拍計の制度が最悪で、実用レベルではない。
  • 3回に1回くらい見るポジションにしても、時計が表示されない。

概ね気に入っています。まぁ3年くらいは使いたいな。

ギャルゲー且つソシャゲの「スクールガール・ストライク」をやってみた話

スクエニが作ったスクールガールストライクというアイフォンゲーをプレイした感想です。(私はipadでプレイしてたけど)

 

私はスクエニの社員ではなく、むしろスクエニの面接落ちたのでステマ的要素は一切含まれていない自由なレビューであることを約束されています。

 

インストールのきっかけはCMで花澤香菜の声がしたから。私はそんなに声優が好きではないが、ナンバーワン声優は結構好きだ。「スクストで検索!」とか言ってたけど、まちがって「ガルストで検索」してしまったので実は苦労した(私が入社していたらそのようなことは無かっただろうに)。

 

初めにムービーとか会話シーンとか流れるけど、そういうのは私は全部飛ばすタイプの幽波紋なので、飛ばそうとしたけど、これはギャルゲーだということを思い出して踏みとどまった。ギャルゲーというジャンルの定義は、

 

「ゲームシステムは非常につまらなくても、登場してくる女のことを好きになる設計に成っているので、実際のゲームの部分はジャンケンでもマルペケでも、最悪ゲームと呼べる部分が存在しなくてもいいというジャンル」

 

だと私は思っている。なのでよく「ドラクエVはギャルゲー」という人がいるけど、別にビアンカとフローラの件が核というわけではないので、あれはギャルゲーではない。艦これはゲーム部分がゴミなのでギャルゲー。

 

話をスクストに戻す。学園()の司令官みたいなキャラが自キャラで、自分の姿は一切見えないのが主人公。学園()の5人いる女生徒が自分の手下で、そいつらが次元の間に居る敵を倒す。というのだけ覚えておけばこのゲームはなんとかなる。

 

以下細かく言う。

・メモカ()というアイテムでパワーアップ。女生徒一人につき2個装備できる

・課金()でガチャ()を引いて強いメモカも手に入る

・最初は学園()の手下の女生徒は5人だが、メモカと同時に女生徒もドロップするので、いっぱいいる女生徒の中から自分の選りすぐりの5人を選ぶ

・次元の狭間の敵を探索(というかクリック)するのにスタミナ()を消費する

・敵には基本負けることが無いので、ひたすら探索するというゲーム

うまく行けば1分位でスタミナを全部使い切る

・戦闘はサカつくみたいに自動で行われる。スキップ可能

・戦闘は次元の狭間と対戦の二種類。対戦で勝つためにいいメモカが欲しい

・対戦モードに入ると対戦相手を10人くらいから選べるんだけど、相手の攻撃力とHPの両方が優っていれば10割方勝てるので、弱い相手をカモる行為が対戦だと言える

カモ対戦に勝つとアクセサリのガチャ()を引けるポイントがもらえて、自分の女生徒にアクセを付けれる

・携帯ゲーにしては結構ポリゴンとかモーションがいいので見ているだけでも意外と楽しい

・まだ未体験だが、このゲーム「告白される」ということがあるようだ。告白され方がどうなるか非常に楽しみ。

 

以上です。とりあえず告白されるまではプレイしようと思います。私がスクエニの面接落ちたのは気にせずに、スクールガールストライク楽しむといいよ。