kumak1’s blog

kumak1のイラストや技術ログ

capistranoでデプロイ先にユーザ指定してwheneverを適用させたい

この記事は Pepabo Advent Calendar 2015 - Qiita の19日目の記事です。

capistranoRuby で簡潔によしなにしてデプロイしてくれるので大変便利ですね。拡張ライブラリも豊富ですし Ruby の経験がほとんどなくてもそれとなく記述できて素晴らしいです。(ぺちぱーなもので・・) whenever も cron を Ruby で書けるっていいですね。バージョン管理できるし、レビューも受けやすいし、なにより crontab -r がもう怖くないw 基本的にすんなりと設定できるのですが、掲題の「capistranoでデプロイ先にユーザ指定してwheneverを適用」の時にちょっと詰まったので、備忘録がてらに記事にします。

なんでユーザ指定したいの

ユーザを分ける事自体に疑問を持つ方は、こちらの記事を読むと良さそう。 用は、デプロイする人はデプロイするだけ、バッチ実行する人はバッチ実行するだけと分けたいのです。 セキュリティ的にも、あとで調査等々する場合にも役に立ちます。 www.atmarkit.co.jp

前提

デプロイ先に以下が導入済みだとします。

  • rbenv 導入済み
  • .ruby-version ファイルで Ruby のバージョンを記録
  • バッチ実行用ユーザ(batch)がいる

やりたいこと

  1. capistrano でデプロイし、以下を実行
  2. デプロイ先で、bundle install
  3. デプロイ先で、whenever 実行

具体的には

whenever を素で実行する際の -u オプションを、capistrano でデプロイ時に適用したいわけです。

% bundle exec whenever --help
Usage: whenever [options]
    -i [identifier],                 Default: full path to schedule.rb file
        --update-crontab
    -w, --write-crontab [identifier] Default: full path to schedule.rb file
    -c, --clear-crontab [identifier]
    -s, --set [variables]            Example: --set 'environment=staging&path=/my/sweet/path'
    -f, --load-file [schedule file]  Default: config/schedule.rb
    -u, --user [user]                Default: current user
    -k, --cut [lines]                Cut lines from the top of the cronfile
    -r, --roles [role1,role2]        Comma-separated list of server roles to generate cron jobs for
    -v, --version

では capistrano の設定結果から。

Capfile.rb

# Include tasks from other gems included in your Gemfile
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'whenever/capistrano'

rbenv, bundler, whenever の gem を追加

deploy.rb

# rbenv の設定
set :rbenv_ruby, File.read('.ruby-version').strip # rbenvが.ruby-versonのRubyを使うようになる
set :rbenv_path, '/usr/local/rbenv'               # デプロイ先のrbenvのpathを指定

# bundler の設定
set :bundle_path, -> { release_path.join('vendor/bundle') } # sharedよりもreleaseのパス指定の方が、切り戻しが必要な際に楽

# whenever の設定
set :whenever_update_flags, ->{ "--update-crontab #{fetch :whenever_identifier} --set #{fetch :whenever_variables} --user batch" }

わけわからないのは多分 whenever の設定だけかと思います。 ライブラリのソースコードを見てみると、whenever の実行オプションを指定している箇所があります。 whenever/whenever.rake at 334cfa01f373006cc032e23907b1777a8ea3f3b0 · javan/whenever · GitHub

これに --user batch を付け加えているだけです、簡単だー。 バッチユーザがデプロイユーザと同じグループに所属しているならばこれでOKですね。 もしダメな場合、以下のような荒技を使えば大丈夫・・ デプロイユーザにsudoer権限が必要になりますが、これでなんとかなってしまいます。

set :whenever_command, ->{ [:sudo, "#{fetch(:rbenv_path)}/bin/rbenv", :exec, :bundle, :exec, :whenever] }

ぷらすあるふぁ

実はこれをいじっていた当初は whenever をユーザ指定して実行がなかなかできず、task を半ば自前で作ってしまっていました。 (調度 set :whenever_update_flags のところで。tsushikazu 先輩の優しいアドバイスで解決)

「やりたいことができそうなのにできない」時は、コードリーディングをすると大体のことは解決できるので、怖がらず・面倒くさがらずにGitHubを覗くのが近道みたいです。 綺麗なコードを読むのはエンジニアの成長には欠かせませんしね。 まだまだ若手感を出して頑張っていこう。

vagrantの共有フォルダのマウントオプションについて

最近、趣味で Laravel を使い始めて気付いたのでメモ。

私はvagrantで開発する際、アプリのコードはマウントして作業しています。 Laravel ではちょうど以下のようなディレクトリ構造ですね。

work
├─ application
│   ├─ app
│   │   ├─ strage
│   │    ...
│   │   
│   ├─ bootstrap
│   └─ public
└─ vagrant
     ├─ Vagrantfile
      ...

Laravel を動作させるには、work/application/app/strage ディレクトリの権限を緩めに(777とか)する必要があります。 ココでつまりました。

緩めに設定したはずなのに、動作させたときに生成されるファイル(セッションとかログとか)がいちいち書き込み禁止で生成・エラーになってしまうのです。。

Vagrantfile のマウントの記述は以下でした。

config.vm.synced_folder "../application", "/var/www/application"

解決方法

マウントオプションを設定して、ここから権限を緩める必要があったようです。

config.vm.synced_folder "../application", "/var/www/application", mount_options: ['dmode=777','fmode=777']

ネット上ではあまりこれに言及したTipsがなかったので、誰かの役に立てば・・ (基本的な事過ぎなのかもしれなくて恥ずかしいですが

vagrantのprivate_networkとforwarded_portのメモ

Vagrantfile を書いていると、ipとportの関係をうっかり間違えてしまうことがあるので備忘メモ

config.vm.network :private_network, ip: "192.168.0.10"
config.vm.network :forwarded_port, guest: 3306, host: 13306

上記のように、ipとportをVMで割り当てると、 localhost でアクセスする場合はフォワードしたポートを利用し、 private_network でアクセスする場合は本来のポートでアクセスする。

イメージとしてはこんな感じ f:id:kumak1:20150525230248p:plain

Webエンジニアの「金の弾丸」について

「金で解決できることは、ある」

汚い大人になってしまった感がモリモリありますが、割と大事。

Web開発って基本的に、フリーのOS、フリーのミドルウェア、フリーのツール、を使って開発をする、いわゆるOSSの文化が一般的。

が、なんかどうも個人的にもにょっとするところがあるのです。

続きを読む

css spriteを簡単に作れるPhotoshopスクリプト「Psprite」を作成・公開しました。

こんばんは。

最近はプログラムにかまけて、絵をほとんど描いていない人です。描きたいんですけどね、8月末の引っ越しが終わったらね。

さて、本エントリはタイトルの通り、Photoshopスクリプトを作ってみました。

写真でも、絵でも、Web制作でも大活躍なアプリケーションですが、個人的にcss spriteを作る時にいまいち使いにくい。「スライス」とかよくわかんないw。スクリプト自体は他の方も、というかLIGさんが作っていたりしますがいまいち使いにくい。喧嘩を売っていくスタイル。

そこで、「レイヤー毎」or「グループ毎」に css sprite のサンプルページを書き出すスクリプトを書きました。以下のメリットがあるかなと思います。

  • サンプルが確認しやすい
  • 表示されてるレイヤー or グループだけcss spriteを生成する
  • グループの中のレイヤーも全部対象で一括処理

続きを読む

これから作るものとかの構想

言い訳したくないですが、社会人一年目って覚える事が多いですね!見事に一年弱の放置をしてしまうとは・・・・。絵自体も、時間をかけたものは久しく描いていなかったのですが、ようやくこの生活に慣れてきたのでなんとか活動を再開できそうです。

さて、作りたいものの候補は3つあります。一つ目が前回にも書いた「低空少女活劇もの」。二つ目が「少女イラスト集」。三つ目が「絵描きからみたweb技術」となります。1・2は説明はいらないと思いますが、3つ目が長いスパンでつくって行きたいと思っているものです。

「絵描きからみたweb技術」というのはなにかというと、要はHTMLなどの絵描き向けHowToですね。仕事でweb系に携わってることもあり、それを生かしたものを作りたいと思っています。HTMLの単純な組み方なんかはweb検索したらいくらでも出てきますが、リファレンスだとか書き方ばかりです。HTMLの考え方、CSSJavascript、ライブラリって何なのかとかは現状、絵描きを中心とした「自分をうまくプロデュースしたい人」にはわかり辛いものとなっています。これをどうにかしたいと思っているのです。

さぁ、徐々にがんばっていこうかな

ここ最近の動向

こんにちは、くまきです。

社会人になったら、想像以上に「時間」やら「スケジュール」やら「タスク」なんて言葉に翻弄される毎日です。そんな中、細々と絵の活動も続けておりますとも。

続きを読む