長生村本郷Engineers'Blog

千葉県長生村本郷育ちのエンジニアが書いているブログ

Jenkins が起動しない - Unable to read /var/lib/jenkins/config.xml -

f:id:kenzo0107:20161209135407p:plain

とある午後、Jenkins を再起動したときに出たエラー

hudson.util.HudsonFailedToLoad: org.jvnet.hudson.reactor.ReactorException: java.io.IOException: Unable to read /var/lib/jenkins/config.xml
    at hudson.WebAppMain$3.run(WebAppMain.java:234)
Caused by: org.jvnet.hudson.reactor.ReactorException: java.io.IOException: Unable to read /var/lib/jenkins/config.xml
    at org.jvnet.hudson.reactor.Reactor.execute(Reactor.java:269)
    at jenkins.InitReactorRunner.run(InitReactorRunner.java:44)
    at jenkins.model.Jenkins.executeReactor(Jenkins.java:912)
    at jenkins.model.Jenkins.<init>(Jenkins.java:811)
    at hudson.model.Hudson.<init>(Hudson.java:82)
    at hudson.model.Hudson.<init>(Hudson.java:78)
    at hudson.WebAppMain$3.run(WebAppMain.java:222)

/var/lib/jenkins/config.xml が読み込めない というエラー

/var/lib/jenkins/config.xml の所有者は jenkins:jenkins だけど、なぜ?

と権限周りを諸々試験して直していくと
pluginsディレクトリごと所有者変更すると直りました汗

$ sudo chown -R jenkins:jenkins /var/lib/jenkins/plugins

plugin の挙動で何か所有者変更され得るものがあったのか解明せず。

同様の事象の記事を見つけたので参照

#764711 - jenkins: Fails on "Unable to read /var/lib/jenkins/config.xml" - Debian Bug report logs

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

「会員登録完了メールが迷惑メールに入っちゃいます」対策

f:id:kenzo0107:20161202122453p:plain

概要

サイト作りにありがちな設定忘れ
「会員登録完了メールが迷惑メールに入っちゃいます」

SPFレコード設定とDNSの逆引き設定が必要です。

まず DNS 正引きとは

ドメイン --- 問合せ ---> IPアドレス

以下のようなメールアドレスがあるとします。

info@hogehoge.jp

この hogehoge.jp から IPアドレス を問い合わせるのが 正引き

DNS 逆引きとは

IP アドレス --- 問合せ ---> ドメイン

IPアドレス から hogehoge.jp を問い合わせるのが 逆引き

SPFレコード

SPF = Sender Policy Framework

メールを送る側のポリシーを設定したフレームワークです。

何故こんなフレームワークがあるの?

送信元偽装なんて簡単にできるから!

$ echo "TEST" | sendmail -f aiueo@xxxx.jp -t kenzo.xxxxxx.0107@gmail.com

Imgur

SPFレコードを設定することの意味

SPFレコード設定する、ということは
送信元の IPアドレス, ドメイン を指定することで
受信先が 送信元メールアドレスとSPFレコード情報に設定している IP, ドメイン情報と一致しているか
わかるようになります。

逆引き設定することの意味

送信元のIPアドレスから割り出したドメイン
逆引き設定されたIPに紐づくドメインとを照合し
異なる場合は偽装と判断することができる為です。

Gmail などではこのフィルターが設定されていて 逆引き設定されていないと迷惑メールBOXに入っちゃいます。

SPF レコード設定確認

$ dig -t TXT <メールドメイン>
$ dig -t TXT gmail.com

gmail.com.              300     IN      TXT     "v=spf1 redirect=_spf.google.com"
  • 例) yahoo.co.jp
$ dig -t TXT yahoo.co.jp

yahoo.co.jp.            6       IN      TXT     "v=spf1 include:spf.yahoo.co.jp ~all"

GmailSPFレコード設定確認

f:id:kenzo0107:20161202121710p:plain

  • SPF: NEUTRAL の場合、SPFレコードが正しく設定されていません。

f:id:kenzo0107:20161202121724p:plain

  • SPF: PASS の場合、SPFレコードが正しく設定されています。

f:id:kenzo0107:20161202122051p:plain

以上です。

CentOS 5系 Neobundle 対応 vim をインストール

概要

CentOS 5 に vim をソースからビルドしようとした所
.configure 実行時にエラー発生

no terminal library found
checking for tgetent()... configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.

terminal library がないと怒られている。

ちなみにこんな流れで vim をソースからダウンロードしビルドしようとしました。

$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
$ tar xvf vim-7.4.tar.bz2
$ cd vim74
$ ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix='/usr/local/vim-7.4'
$ sudo make install 
$ sudo ln -s /usr/local/vim-7.4/bin/vim /usr/bin/vim
  • ncurses-devel インストールし再度実行
$ sudo yum install -y ncurses-devel

通りました (;~_~)

yum でインストールする vim だと Neobundle が利用不可バージョンだった為
ソースからビルドする選択にしました。

程よい rpm があれば教えてください!

zsh vcs_info が使えない問題解決

f:id:kenzo0107:20161130152308p:plain

概要

CentOS5系で yum でインストールした zsh で以下エラー発生

precmd: vcs_info: function definition file not found

Version 4.3.6 以上でないと vcs_info は利用できないそう

vcs_info is available since zsh-beta, version 4.3.6-dev-0+20080929-1 or later
  • バージョン確認
$ /bin/zsh --version

zsh 4.2.6 (x86_64-redhat-linux-gnu)

なので zsh バージョンアップデートする必要があります。

zsh 5.2 ダウンロード ビルド

$ cd /usr/local/src
$ wget https://sourceforge.net/projects/zsh/files/zsh/5.2/zsh-5.2.tar.gz/download
$ tar xvjf zsh-5.2.tar.gz
$ cd zsh-5.2
$ ./configure && make && sudo make install

インストールされた zsh バージョン確認

$ /usr/local/bin/zsh --version

zsh 5.2 (x86_64-unknown-linux-gnu)

新たにダウンロードした zsh にシェル変更

$ echo "/usr/local/bin/zsh" | sudo tee -a /etc/shells
$ chsh -s /usr/local/bin/zsh

それでも、まだ出てくるこのエラー。。

precmd: vcs_info: function definition file not found

.zcompdump を削除し zsh を実行し直す

$ rm ~/.zcompdump
$ exec zsh

.zscompdump はコマンドやその補間関数の定義一覧が記載されているファイルです。

無事エラーが消えました。

Python ローカルとリモートサーバ上のファイル差分抽出ツール

概要

これまで数社経験してきましたが
必ずといっていいほど存在する、
現状のステータスがわからないサーバ。。

Git 上の master とも差分が激しく生じている状態。。

そんなサーバとローカルの workspace との差分を確認すべく
ツールを作成しました。

github.com

今後

今の所、
リモートからファイルをダウンロードする度に SSH のコネクションを張ってしまいパフォーマンス悪い(>_<)

はじめ pysftp で ssh コネクション張ってた方がパフォーマンスよかった気がする。
でも、手軽さを考えたら hostname 指定の方が良かったので
hostname 指定の方向でパフォーマンスを上げていくことを考えます。

ところが
pysftp で実装してみましたが 多段 ssh アクセスの場合がうまくいかず。。
随時解消させていきます。

golang で並行処理を試してパフォーマンスを上げるのも検討します。

Golang 簡易パフォーマンス測定

概要

簡易的なパフォーマンス測定覚書です。
よく使うので備忘録的に保存。

package main

import (
    "fmt"
    "runtime"
    "time"
)

func main() {
    // CPU数
    cpus := runtime.NumCPU()

    // 開始時メモリ
    var startMemory runtime.MemStats
    runtime.ReadMemStats(&startMemory)

    // 開始時間
    start := time.Now()


    // do something


    // 経過時間
    elapsed := time.Since(start)

    // 終了時メモリ
    var endMemory runtime.MemStats
    runtime.ReadMemStats(&endMemory)

    fmt.Printf("実行時間: %f 秒 \n", elapsed.Seconds())
    fmt.Printf("CPU: %d \n", cpus)
    fmt.Printf("Memory All: %f MB \n", float64(endMemory.Alloc-startMemory.Alloc)/float64(1024*1024))
}

Let's encrypt SSL 証明書自動更新

f:id:kenzo0107:20161114141731p:plain

概要

Let's encrypt SSL は開発環境で本番環境と同等に
https 通信プロトコルを利用したい為に利用しています。

バーチャルホストで複数ドメインを利用している場合等でも
マルチドメイン SSL 証明書が取得でき便利です。

オレオレSSL証明書ではブラウザによっては
「このページは保護されていません」
と表示されるケースがあり
非エンジニアの方によっては不信感が募ることもあります。

f:id:kenzo0107:20161114141627p:plain

β版

β版時代の Let's Encrypt SSL証明書管理スクリプトです。
今回作成したSSL自動更新スクリプトはこちらではありません。

github.com

SSL自動更新スクリプト

今回作成した Let's Encrypt 自動更新(Apache)スクリプトです。
更新判定しSlack通知します。

有効期限が 30 日を切った場合に SSL証明書を更新し httpd を再起動します。

gist.github.com

cron設定

  • 毎月第一土曜日 AM6:00 設定

開発環境なら土曜日に実行気づいて最低でも日曜日には治せる為。
現運用ではこれは功を奏してます。

00 6 1-7 * * 6 root /root/letsencrypt.sh/refresh_cert.sh

Slack通知

f:id:kenzo0107:20161114141352p:plain

強制更新したい場合

2016年5月07日より certbot-auto に名称変更され
certbot-auto による自動更新を以下スクリプトになります。

本番環境以外でクライアント様への確認用等でなければ
こちらを利用しても良いかと思います。

--force-renewal をオプション指定することで強制的に更新します。

gist.github.com

そもそも通知いらないという場合

こちらも certbot-auto

  • cron で直接コマンド設定
  • 毎月第一土曜日実行
  • 一応ログには残しておく
00 6 1-7 * * 6 root /root/certbot/certbot-auto renew --force-renewal && service httpd graceful > /root/certbot/renewal.log

以上です。