さて、前回の続きです。
普段、windowsマシンを使う時には、次のような運用方針にしているんですが、このための設定をchefのレシピでなんとかしてみましょう。
- C:\WORK を作成して、必要なファイル類はそこへ置く
- bitbucketに置いてあるドットファイルをC:\WORK\unix_homeにcloneしてくる。
- 環境変数 HOME にC:\WORK\unix_homeを設定
- sshの鍵を作成
cookbookの作成
まずは、knifeを使って新しいcookbookを作ります。*1
> knife cookbook create windows_initial_settings -z WARNING: No knife configuration file found ** Creating cookbook windows_initial_settings in C:/Users/n_so5/SkyDrive/chef-repo/cookbooks ** Creating README for cookbook: windows_initial_settings ** Creating CHANGELOG for cookbook: windows_initial_settings ** Creating metadata for cookbook: windows_initial_settings
無事にできたら、次のような感じのディレクトリが生成されているはずです。
>ls -R cookbooks\windows_initial_settings cookbooks\windows_initial_settings: CHANGELOG.md README.md attributes definitions files libraries metadata.rb providers recipes resources templates cookbooks\windows_initial_settings/attributes: cookbooks\windows_initial_settings/definitions: cookbooks\windows_initial_settings/files: default cookbooks\windows_initial_settings/files/default: cookbooks\windows_initial_settings/libraries: cookbooks\windows_initial_settings/providers: cookbooks\windows_initial_settings/recipes: default.rb cookbooks\windows_initial_settings/resources: cookbooks\windows_initial_settings/templates: default cookbooks\windows_initial_settings/templates/default:
このうちの、recipes/default.rbにつらつらとレシピを書いていきます。
ディレクトリの作成
まず、最初のC:\WORKの作成ですが、これはその名もずばりの"directory"というリソースがあるので、これを使います。
https://docs.chef.io/resource_directory.html
directory "C:\WORK" do action :create end
gitでドットファイルを持ってくる
こちらも"git"というリソースがあるので、これを使います。
https://docs.chef.io/resource_git.html
home_dir="C:\\WORK\\unix_home" git "#{home_dir}" do repository "https://n_so5@bitbucket.org/XXXX.git" enable_submodules true action :sync end
.vimの下にいくつかsubmoduleとしてvimプラグインのリポジトリを入れているので、"enable_submodule true"を指定しています。あと、sshの鍵を未だ登録していない環境からのアクセスを想定しているので、http経由でのアクセスにしています。
環境変数のHOMEを設定
これまた"env"というリソースがあるので、これを使います。
https://docs.chef.io/resource_env.html
env "HOME" do value "#{home_dir}" action :create end
sshの鍵作成
これまた、chefのリソースでと思いきや、あんまりこういう用途は想定していないのかうまく使えそうな手がありません。とりあえず、executeを使って、ssh-keygenを呼び出すことにします。
key_filename="C:\WORK\unix_home\.ssh\id_rsa" execute "ssh-keygen" do command "ssh-keygen -f #{key_filename} -t rsa " not_if {::File.exists?(key_filename)} end
既に鍵を作成した環境で実行した時に、上書きを避けるため、not_ifで条件を指定しています。
実際に適用してみる
ここまでをまとめてdefault.rbに書いた上で、windows以外の環境では実行されないように
if platform_family?('windows') ... end
で囲っておきます。
レシピの適用前はこんな状況ですが
> ls C:\WORK ls: C:\WORK: No such file or directory > echo %HOME% C:\Users\n_so5
実際に適用すると
> chef-client -z [2015-03-19T19:15:33+09:00] WARN: No config file found or specified on command line, using command line options. Starting Chef Client, version 12.0.3 resolving cookbooks for run list: ["firefox", "windows", "windows_initial_settings"] Synchronizing Cookbooks: - firefox - windows - windows_initial_settings - chef_handler Compiling Cookbooks... Recipe: windows::default * chef_gem[win32-api] action install (up to date) * chef_gem[win32-service] action install (up to date) * chef_gem[windows-api] action install (up to date) * chef_gem[windows-pr] action install (up to date) * chef_gem[win32-dir] action install (up to date) * chef_gem[win32-event] action install (up to date) * chef_gem[win32-mutex] action install (up to date) Converging 13 resources Recipe: firefox::default * windows_package[Mozilla Firefox 36.0.1 en-US] action install Recipe: <Dynamically Defined Resource> * remote_file[C:\Users\n_so5\.chef\local-mode-cache\cache/Firefox Setup 36.0.1.exe] action create (up to date) Recipe: windows::default * chef_gem[win32-api] action install (up to date) * chef_gem[win32-service] action install (up to date) * chef_gem[windows-api] action install (up to date) * chef_gem[windows-pr] action install (up to date) * chef_gem[win32-dir] action install (up to date) * chef_gem[win32-event] action install (up to date) * chef_gem[win32-mutex] action install (up to date) Recipe: windows_initial_settings::default * directory[C:WORK] action create - create new directory C:WORK * git[C:\WORK\unix_home] action syncPassword for 'https://n_so5@bitbucket.org': Password for 'https://n_so5@bitbucket.org': - clone from https://n_so5@bitbucket.org/XXXXX into C:\WORK\unix_home - checkout ref 26ea7cf8d79fb68b4273bc133c6165c636248b08 branch HEAD * directory[C:\WORK\unix_home\.ssh] action create - create new directory * execute[ssh-keygen] action runEnter passphrase (empty for no passphrase): Enter same passphrase again: - execute ssh-keygen -f C:\WORK\unix_home\.ssh\id_rsa -t rsa Running handlers: Running handlers complete
といった具合に適用されます。gitでアクセスしている時にはbitbucketのパスワードを聞かれるので、入力してください。あと、ssh-keygenのレシピを適用している時も普通にssh-keygenした時と同じようにパスフレーズの入力を求められます。
でもって、どういう状態になったかと言うと
>ls C:\WORK unix_home > ls C:\WORK\unix_home\.ssh\ id_rsa id_rsa.pub > echo %HOME% C:\Users\n_so5
あら?環境変数の変更が反映されていない・・・と思ったけどこれは単にコマンドプロンプトを再起動すれば反映されます。コマンドプロンプトを立ち上げ直すと、無事に反映されています。あと、.vim/bundleの下に色々と入っているのも確認。
> echo %HOME% C:\WORK\unix_home >ls %HOME%/.vim/bundle/* C:\WORK\unix_home/.vim\bundle/indentLine: README.md after doc C:\WORK\unix_home/.vim\bundle/pydiction: README README.md after complete-dict pydiction.py C:\WORK\unix_home/.vim\bundle/syntastic: CONTRIBUTING.md LICENCE README.markdown _assets autoload doc plugin syntax_checkers
ついでに、この状態から再実行するとどうなるか試してみました。
> cdhef-client -z [2015-03-19T19:29:26+09:00] WARN: No config file found or specified on command line, using command line options. Starting Chef Client, version 12.0.3 resolving cookbooks for run list: ["firefox", "windows", "windows_initial_settings"] Synchronizing Cookbooks: - firefox - windows - windows_initial_settings - chef_handler Compiling Cookbooks... Recipe: windows::default * chef_gem[win32-api] action install (up to date) * chef_gem[win32-service] action install (up to date) * chef_gem[windows-api] action install (up to date) * chef_gem[windows-pr] action install (up to date) * chef_gem[win32-dir] action install (up to date) * chef_gem[win32-event] action install (up to date) * chef_gem[win32-mutex] action install (up to date) Converging 13 resources Recipe: firefox::default * windows_package[Mozilla Firefox 36.0.1 en-US] action install Recipe: <Dynamically Defined Resource> * remote_file[C:\WORK\unix_home\.chef\local-mode-cache\cache/Firefox Setup 36.0.1.exe] action create - create new file C:\WORK\unix_home\.chef\local-mode-cache\cache/Firefox Setup 36.0.1.exe - update content in file C:\WORK\unix_home\.chef\local-mode-cache\cache/Firefox Setup 36.0.1.exe from none to ad32ad (file sizes exceed 10000000 bytes, diff output suppressed) Recipe: windows::default * chef_gem[win32-api] action install (up to date) * chef_gem[win32-service] action install (up to date) * chef_gem[windows-api] action install (up to date) * chef_gem[windows-pr] action install (up to date) * chef_gem[win32-dir] action install (up to date) * chef_gem[win32-event] action install (up to date) * chef_gem[win32-mutex] action install (up to date) Recipe: windows_initial_settings::default * directory[C:WORK] action create (up to date) * git[C:\WORK\unix_home] action syncPassword for 'https://n_so5@bitbucket.org': (up to date) * env[HOME] action create (up to date) * directory[C:\WORK\unix_home\.ssh] action create (up to date) * execute[ssh-keygen] action run (skipped due to not_if) Running handlers: Running handlers complete Chef Client finished, 2/20 resources updated in 417.811231 seconds
%HOME%を設定した影響で、firefoxのアーカイブをキャッシュしてる場所が変わるので、アーカイブを再ダウンロードしていますが、他は(up to date)と表示されて、するすると終わっていきます。
とりあえず今日のとこはこれで終わり。
*1:このメタファー破綻してないか・・・?