ほわいとぼーど

ぷろぐらまのメモ帳

Chefでapt/dpkg時のファイル更新確認をskipする

[概要]
apt-get install や dpkg -i でインストールする際にdebパッケージに
含まれるファイルを先に配置しておくと出る更新確認メッセージをChefでスキップする方法。

[答え](正解かどうかは別として、、、)
packageのoptionsで「-o Dpkg::Options::='--force-confold'」を指定する。

参考:https://lists.debian.org/debian-user/2011/04/msg01168.html


[説明](どういう時に使うのか)
debパッケージを使ってインストールした場合、インストール完了後にサービス起動までしてしまう。
この振る舞いが正しいのかどうかはLinux情弱たる自分にはよくわかりませんが、
その後に設定ファイルを更新して再起動みたいなChefレシピを書いていました。

しかし設定更新前にはサービス起動したくない場合もあります。
elasticsearchは起動するとcluster nameが同じ仲間を自動的に探してjoinしてしまうので、
設定ファイルのデフォルト値を変更してから起動するようによく注意喚起されています。

起動しないオプションが無いか調べたのですが無かった(見つからなかった)ので、
じゃぁ、先に設定ファイル置いちゃったらうまいこといかないか?と思って
試したらやり方次第ではできそうだったので調べてみました。


例えば、以下のようなChefレシピ(抜粋)を書きました。

directory '/etc/elasticsearch' do
  mode "0755"
end
template '/etc/elasticsearch/elasticsearch.yml' do
  source 'elasticsearch.yml.erb'
end

execute "apt-key" do
  command "wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | apt-key add -"
end
cookbook_file '/etc/apt/sources.list.d/elasticsearch.list' do
  owner 'root'
  mode '0644'
  source 'elasticsearch.list'
  # see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_apt.html
end
execute "apt-get_update" do
  command "sudo apt-get update"
end
package "elasticsearch" do
  options "-f --force-yes"
  action :upgrade
end

先に設定ファイルを置いてからapt-getしています。
これを実行すると、

  * package[elasticsearch] action upgrade
================================================================================
Error executing action `upgrade` on resource 'package[elasticsearch]'
================================================================================


Chef::Exceptions::Exec
----------------------
apt-get -q -y -f --force-yes install elasticsearch=0.90.10 returned 100, expected 0

こんな感じのエラーが出ます。
エラーメッセージにあるコマンドを実際に実行してみると理由がわかります。

vagrant@guest:~$ sudo apt-get -q -y -f --force-yes install elasticsearch
Reading package lists...
Building dependency tree...
Reading state information...
elasticsearch is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 118 not upgraded.
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up elasticsearch (0.90.10) ...

Configuration file `/etc/elasticsearch/elasticsearch.yml'
 ==> File on system created by you or by a script.
 ==> File also in package provided by package maintainer.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** elasticsearch.yml (Y/I/N/O/D/Z) [default=N] ? 

ファイル更新するか確認のプロンプトが表示されて処理が中断されていますね。

これを回避するためにオプションを指定します。

--force-confdef:デフォルト値採用、
--force-confnew:新しいもので更新、
--force-confold:古いもの優先

参考:https://lists.debian.org/debian-user/2011/04/msg01168.html

以下のように書き換えました。

package "elasticsearch" do
  options "-o Dpkg::Options::='--force-confold' -f --force-yes"
  action :upgrade
end

これにより、デフォルトのcluster nameでは一切起動することなく、
自身の設定したcluster nameで最初から起動できるようになりました。

実際にはこの後にplugin install等もあり、結局再起動は必要となるのですが・・・

なお、elasticsearchには公式のChefレシピがあるのですが、
こちらではtarファイルからinstallしていてcluster nameを起動前に変更できるはず。
自分も初期はtarから入れていたのですが、その頃はまだ公式レシピも無くて、
initファイルを自前で用意面倒とかでdeb/rpmパッケージが用意された際に乗り換えました。
Chefレシピは自前で書く派です(誰も聞いてない

以上、あまり活躍はしなさそうな技術メモでした。