そういう機会がたまにあるんだけどその度にレシピ中に binding.pry
を仕込んで探してるのでメモ
シチュエーション
レシピを実行してるユーザのhomeディレクトリを作成したいような場合です
recipe.rb
directory "/home/#{current_user}" do
mode "755"
owner current_user
end
whoami
だと itamae local
の時は問題ないのですが、itamae ssh
だとレシピ適用先のリモートのユーザ ではなく、実行してるローカルのユーザがとれてしまいます。
ローカルとリモートでユーザが同じならそれでもいいのですが一致してない場合もあるので厳密にやるならssh実行中のユーザを取得する必要があります
やり方
こんな感じ(itamae v1.9.9で確認)
recipe.rb
def current_user
case @recipe.runner.backend
when Itamae::Backend::Local
`whoami`.strip
when Itamae::Backend::Ssh
@recipe.runner.backend.instance_variable_get(:@backend).instance_variable_get(:@config)[:ssh_options][:user]
end
end
node[:current_user] = current_user
directory "/home/#{node[:current_user]}" do
mode "755"
owner node[:current_user]
end
一度 node
につっこんでいるのは、directory
リソースのブロック内で current_user
を参照しようとするとそんな変数やメソッドはないよとエラーになるためです。(owner設定しないなら不要)
NameError: undefined local variable or method `current_user' for #<Itamae::Resource::Base::EvalContext:0x007fb53bf609a8>
/myapp/vendor/bundle/ruby/2.3.0/gems/itamae-1.9.9/lib/itamae/resource/base.rb:40:in `method_missing'
/myapp/cookbooks/home_dir/default.rb:18:in `block in load'
追記
書いた後にいろいろ試してみたけど ~/.ssh/config
が設定されてないとうまくとれないっぽい