読者です 読者をやめる 読者になる 読者になる

ハウテレビジョン開発者ブログ

『外資就活ドットコム』を日夜開発している技術陣がプログラミングネタ・業務改善ネタ・よしなしごとについて記していきます。

UbuntuのパッケージリポジトリをChefで追加する方法

最近は昼食にマルちゃん正麺ばかり食べている artifactsauce です。

今回はUbuntuのパッケージリポジトリをChefで追加する方法を解説します。

私が最近ハマったので、皆さんは同じ轍を踏まないように。

背景

Ubuntuは公式のパッケージリポジトリの他にも、外部リポジトリを追加して公式と同様に利用することができる仕組みがあります。

Ubuntuの開発基盤であるLaunchpadは、個人やチームがパッケージを配布できるよう、リポジトリのホストを行っています。

それがPersonal Package Archive (PPA) です。

パッケージリポジトリの追加についてはコマンドラインで行う情報が多いのですが、最近はサーバーの構築/管理をChefで行っているという都合上、リポジトリの追加もChefでできるようにしたいものです。

そこで、Chefでリポジトリを追加する方法を調査しました。

設定

Cookbook apt のインストール

リポジトリの追加には、Chef社が公式に作成しているcookbook apt を利用することができます。

bashリソースを使って自前で実装するのも良いですが、なるべく既存のものを利用したいものです。

apt は往々にして依存関係ですでにインストールされていることが多いのですが、ここは明示的にインストールすることにしましょう。

Berksfile に下記の記述を追加します。

# Berksfile
cookbook "apt"

追加したら Berksfile の存在するディレクトリでインストールコマンドを実行しましょう。

また、該当のChefリポジトリに取り込んでおきます。

$ bundle exec berks install
$ rm -rf cookbooks/
$ bundle exec berks vendor cookbooks/

Cookbook apt のLWRPとPPAの紹介ページ

公式のドキュメントにLWRPを用いた追加方法が記載されています。

Resources/Providersの項目を参照しましょう。

ここでは例として nginx-php のリポジトリを加えるための記述が挙げられています。

apt_repository 'nginx-php' do
  uri          'http://ppa.launchpad.net/nginx/php5/ubuntu'
  distribution node['lsb']['codename']
  components   ['main']
  keyserver    'keyserver.ubuntu.com'
  key          'C300EE8C'
  deb_src      true
end

それではここで記載している情報はどこで取得することができるのでしょうか?

ここで本当は nginx-php のページを参照したいのですが、残念ながら現在は存在しないようです。

そこで代わりにNginxの公式サイトで紹介されている NGINX Stable のページを参照します。

しかしPPAのサイトでnginxを検索すると膨大な数のレコードが返ってきてしまい、どれが該当のページなのかすぐにはわかりません。そこでリポジトリのURLから紹介ページを類推します。

Nginxの公式サイトで指定されているPPAのアドレスは下記のものです。

http://ppa.launchpad.net/nginx/stable/ubuntu - (1)

実は(1)は変数で表すと(2)のような構成になっています。

http://ppa.launchpad.net/$USERNAME/$PACKAGE_TYPE/ubuntu - (2)

これを(3)のように変換すればPPAの紹介ページに辿り着くことができます。

https://launchpad.net/~$USERNAME/+archive/ubuntu/$PACKAGE_TYPE - (3)

つまり、(1)を変換すると(4)になります。

https://launchpad.net/~nginx/+archive/ubuntu/stable - (4)

それでは(4)のページを見てみましょう。辿りつけましたか?

Cookbook nginx-stable の作成

まずはカスタムのcookbookを作成しましょう。ここでは最新の安定版nginxをインストールするcookbookを作ることを前提にしています。

$ bundle exec knife cookbook create nginx-stable -o site-cookbooks

細かいことは置いておいて、今回はデフォルトのレシピに書き込みます。

皆さんは目的に応じて適切なレシピに記載してください。

前項の apt-repository リソースに記載する値を取得しましょう。

(4)のページで「Adding this PPA to your system」の項目を見てください。

f:id:artifactsauce:20150304231435p:plain

上記の四角で囲った部分をクリックします。すると下の図のように展開されます。

f:id:artifactsauce:20150304231527p:plain

重要なのは四角で囲まれたAとBです。

Aは属性値 uri に対応します。Bは key の値に対応します。

Signing keyという項目なのでこの値全部が必要のように見えますが、実際は / の前の部分は必要ありません

destribution の値には trusty など、バージョンの別名を指定します。その他は特に変更する必要はありません。

結果として下記のような記述になります。

# site-cookbooks/nginx-stable/recipes/default.rb 
include_recipe "apt"

apt_repository 'nginx-stable' do
  url 'http://ppa.launchpad.net/nginx/stable/ubuntu'
  distribution 'trusty'
  components   ['main']
  keyserver    'keyserver.ubuntu.com'
  key          'C300EE8C'
end

終わりに

PPAには便利なパッケージもそれなりにありまして、これらを利用することでサーバー管理の手間を省くことが可能です。

さらに管理自体をChefで自動化しておけば、あなたの深い悩みは少しずつ晴れていくことでしょう。

参照