こちら の続きでインフラで使うインストーラの作り方について扱っています。既に階層構造とインストーラプログラム作成まで説明しました。今回はその続きです。
バイナリデータをプログラムに埋め込む
ここがキモとなる部分です。「最初にインストールする階層をつくる」で作った階層をまず zip 圧縮します。
$ zip -r dummy.zip aaa bbb ccc
この後この zip ファイルをプログラムに追加します。
$ cat dummy.zip >> installer.sh
$ rm -f dummy.zip aaa bbb ccc
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ここでリダイレクトは <span style="color:#e6db74">">"</span> で行なってしまうとせっかく作ったプログラムが上書きされてしまいますので気をつけてください。
この状態で installer.sh は「プログラム+データファイル」の 2つのタイプを持ったファイルとなりました。
再度このプログラムを見てみると以下のようになっています。
<img alt<span style="color:#f92672">=</span><span style="color:#e6db74">"バイナリデータ追加後のインストーラ"</span> class<span style="color:#f92672">=</span><span style="color:#e6db74">"alignnone size-medium wp-image-1157"</span> height<span style="color:#f92672">=</span><span style="color:#e6db74">"481"</span> src<span style="color:#f92672">=</span><span style="color:#e6db74">"/img/2016/original_installer1.jpg"</span> title<span style="color:#f92672">=</span><span style="color:#e6db74">"バイナリデータ追加後のインストーラ"</span> width<span style="color:#f92672">=</span><span style="color:#e6db74">"440"</span> />
exit 以降にバイナリデータが追加されており、その次の行は <span style="color:#e6db74">"PK"</span> で始まっています。<span style="color:#e6db74">"PK"</span> で始まるのは zip フォーマットの特徴ですね。
このプログラムは <span style="color:#e6db74">"exit 0"</span> で終了になる為、それより下の行(バイナリデータ)に処理が移ることはありません。その為、この <span style="color:#e6db74">"exit 0"</span> の行は必須です(ないと何が起こるか分かりません)。
<span style="color:#75715e">#### 実行してみる</span>
では最後に出来上がったインストーラを実行してみましょう。
<div class<span style="color:#f92672">=</span><span style="color:#e6db74">"highlight"</span>><pre style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"</span>><code class<span style="color:#f92672">=</span><span style="color:#e6db74">"language-bash"</span> data-lang<span style="color:#f92672">=</span><span style="color:#e6db74">"bash"</span>>$ mkdir -p work
$ ./test.sh
準備はいいですか?<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#f92672"</span>><span style="color:#f92672">(</span></span>N/y<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#f92672"</span>><span style="color:#f92672">)</span></span>
y
unziping …
Archive: temporary.zip
creating: aaa/
extracting: aaa/date.txt
creating: bbb/
creating: bbb/eee/
creating: bbb/eee/fff/
inflating: bbb/eee/top.txt
creating: ccc/
creating: ccc/ddd/
inflating: ccc/ddd/df_h.txt
exit …
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>aaa<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/aaa&#39;</span></span>
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>aaa/date.txt<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/aaa/date.txt&#39;</span></span>
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>bbb<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/bbb&#39;</span></span>
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>bbb/eee<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/bbb/eee&#39;</span></span>
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>bbb/eee/fff<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/bbb/eee/fff&#39;</span></span>
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>bbb/eee/top.txt<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/bbb/eee/top.txt&#39;</span></span>
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>ccc<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/ccc&#39;</span></span>
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>ccc/ddd<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/ccc/ddd&#39;</span></span>
<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>><span style="color:#e6db74">`</span></span>ccc/ddd/df_h.txt<span style<span style="color:#f92672">=</span><span style="color:#e6db74">"color:#e6db74"</span>>&<span style="color:#75715e">#39; -&gt; `work/ccc/ddd/df_h.txt&#39;</span></code></pre></div></span>
この後、work ディレクトリを覗いてみます。aaa bbb ccc というディレクトリが作成され aaa/date.txt も bbb/eee/top.txt 等もありました。これで完成です!
このような方法でプログラムとデータを一つにまとめてしまえばデプロイも非常に楽に行うことが可能です。機会があればつくってみてください。</code></pre></div>