ssh + su環境でServerspec/Specinfraを利用するためのバックエンドを書いた

こんにちは。業務都合上、サーバー運用ではsudoが使えずsuでrootになって作業を行わなければならないhayajoです。

Specinfraのsshバックエンドはsudoでのコマンド実行を前提としているため、suでrootになって運用しているサーバーに対してSpecinfra/Serverspecを実行するには少々手間がかかります。(Specinfra.configuration.disable_sudo + run_commandでexpect実行とか)

そこでSSH + suでのコマンド実行を行うSpecinfraバックエンドを書きました。

Specinfraでの使用例はこんな感じです。

require 'specinfra'
require 'specinfra/helper/set'
require 'specinfra/backend/extension/ssh_su'
require 'highline/import'

include Specinfra::Helper::Set
include Specinfra::Helper::Os

host = ARGV[0]

set :host, host
set :backend, :ssh_su

options = Net::SSH::Config.for(host)
options[:user] = ask("Enter ssh user: ")
options[:password] = ask("Enter ssh password: ") { |q| q.echo = false }
set :ssh_options, options

set :su_password, ask("Enter su password: ") { |q| q.echo = false }

puts Specinfra::Runner::run_command('whoami').stdout
puts Specinfra::Runner::run_command('cat /etc/passwd | grep `whoami`').stdout

set :os, os
if Specinfra.configuration.os[:family] == 'redhat'
  puts Specinfra::Runner::install_package('epel-release').stdout
end

puts Specinfra::Runner::install_package('nginx').stdout

モジュールをrequireし、バックエンドにssh_suを指定して使います。Serverspecで使用する場合も同様です。

configurationはsshバックエンドとほぼ同様で、sudo*のものをsu*に置き換えてください。

suのパスワードプロンプトはデフォルトで"Password: "を想定していますが、ロケールを変更した場合など、対象サーバーのプロンプトと異なる場合はsu_promptを設定して調整してください。

suで運用する環境は減ってきていると思うので需要はあまりないとは思いますが、そのようなホストに対してSpecinfra/Serverspecを実行したい場合は使ってみてはいかがでしょうか。

不具合がありましたらGihubのIssuやプルリクエストをお願いします。

Mojolicious::Plugin::Web::Auth 0.05 をリリースしました

OAuth 1.0(A) 関連の実装を修正しました。

これで TwitterDropbox の認証が Hypnotoad の他に Starman や Starlet でも動作するようになったはずです。

ご確認ください。

Mojolicious-Plugin-Web-Auth-0.05

Thanks id:kechiya

Mojolicious::Plugin::Web::Authの使い方を教えてください - 鈍足ランナーのIT日記

Mojolicious 4.42 に Form Validation が(試験的に)実装されたようなので使ってみた

ドキュメントはこちら

試験的ということなのでインターフェースが変わってしまうかもしれませんね。

M::P::TagHelpers側である程度よしなにしてくれるのはお手軽でいいですね。

Mojolicious::Validator と Mojolicious::Validator::Validation の関係がいまいちわかりづらい感じがする...

Scala入学式でScalaについて学んできました。あとだれかGo教えて。

ひさしぶりのブログです。

先日長岡市で行われた第33回勉強会 Scala入学式に行ってきました。

「ScalaってJavaVMで動く関数型っぽい言語」という程度の認識です。そもそもJavaなんてJDK5の知識が少々ある程度なのです。

Java書いてた頃のことは個人的に思い出したくもないのですが、流行り(?)の言語なので、さわりだけでも学んでみようと思い参加した次第です。

入学試験

事前準備としてScalaとIntelliJ IDEA、SBTのインストールを行いました。

IDEなんて使うの数年ぶりなので、プラグインのインストール、設定などは「これ何やってんの??」状態でした。

個人的にはIDEありきの開発はあまり好きではないのですが、コード補完はやはり便利です。時としてこだわりは捨てたほうが良いですね。

ちなみにVimmerな方はこちらで紹介されているIdeaVimマジオススメ。

「Better Java としての Scala」

"Hello World" からはじまり、クラス、継承、traitをひと通り。

素のJava書くよりすっきりしてて良いですね。

サクサクとtraitを追加して型チェックできるのはとても参考になった。

写経しながらGo言語で同じの書こうとしたけどスッキリ書けなくてやめてしまった

Go言語でオブジェクト指向的に書こうとするとなかなかキビシイものがあるような気がするけど趣味の範囲でしかさわってないので経験不足なだけだと。とくにinterfaceまわりの理解が怪しい。精進せな。

「もっとScala!」

リスト、パターンマッチ、Option型などもりだくさん。

正直パターンマッチ以後なんとなく理解...できたかなぁ。

Futureモナドのところで「Goではチャネルを返して云々...」などと脳内でゴニョゴニョやってるから理解できんのだよ。

「NullPoGaBot」

ここまで出来るとは思いませんでした。

ScalaはJavaの資産をそのまま使えるのでTwitter4Jを使ってサクっとbotを実装。このへんはありがたいんだろうな。

写経でいっぱいいっぱいだったけど、コード見返して復習しよう。

LT

LTでは東京勢の面白さに圧倒されましたw

電流とかTGS 2013 in 長岡とかw

懇親会

有名人なmoznionくんとお話できてとても嬉しかったです。Perlについてゆっくりと話を聞きたかったけど、ピーエイチピーについて熱く語っていたようなのでそっとしておいたw

オッサンには刺激の強い子だった。(すごく良い意味で)

dictavさんとはgolangの話で盛り上がったので、いずれ何かしらやるかもしれません。(じじ(じ)?回にGo言語勉強会やるかも)

というわけで

ボスがScalaの人になって帰ってきたけどNiigata.pmのことも気にしているようですし、近く西区飲みでそのあたりを詰めていければと考えています。

あとモンハンしながらGo言語教えてくれる人募集中です(いない)

Vagrant 1.1+ でスナップショット

Vagrantでスナップショットと言えばsahara1.1+対応版)が大人気のようですが、1.1+で同等の機能が欲しいのであればvagrant-vbox-snapshotがいいんじゃないでしょうか。

サクッとインストールできますしね。

$ vagrant plugin install vagrant-vbox-snapshot

使い方はこんな感じ。

$ vagrant up

$ vagrant snapshot take init # initという名前でスナップショットを作成

なんか作業とかする

$ vagrant snapshot back # 最新のスナップショットにロールバック

なんか作業とかする

$ vagrant snapshot take fix # fixという名前でスナップショットを作成

なんか作業とかするも気に入らない

$ vagrant snapshot go init # initスナップショットに戻る

...そして作業は続く...

ラベルを指定してスナップショット作成、ロールバックできるのは便利ですね。

sahara対応したようですし、shanaraつかったほうが情報多くて良いかと

sudo sudo #{cmd} で失敗

確かにsudoersにrootがなかった。

こんな環境はじめて。

Millaで特定のOSのみサポートするモジュールを作る

Dist::Millaで特定のOSのみ(or 以外を)サポートするようなモジュールをつくりたいときはDist::Zilla::Plugin::AssertOSを使ってdist.iniをこんな感じに定義します。

[@Milla]

[AssertOS]
; MSWin32 or CygwinをNGとする
os = -MicrosoftWindows

[Prereqs / ConfigureRequires]
; configure_requiresに追加するためのおまじない
Devel::AssertOS = 0

[MetaNoIndex]
; Dist::Zilla::Plugin::AssertOSでno_indexが上書きされるので再定義
directory = t
directory = xt
directory = inc
directory = share
directory = eg
directory = examples

で、Dist::Zilla::Plugin::AssertOSをインストールします。(既にインストールされている場合は不要です)

$ milla authordeps | cpanm

上記dist.iniでこんな感じのBuild.PLが生成されます。

use lib 'inc';
use Devel::AssertOS qw[-MicrosoftWindows];
use 5.008005;
use Module::Build::Tiny 0.019;
Build_PL();

お手軽ですね。