最近は昼食にマルちゃん正麺ばかり食べている 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」の項目を見てください。
上記の四角で囲った部分をクリックします。すると下の図のように展開されます。
重要なのは四角で囲まれた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で自動化しておけば、あなたの深い悩みは少しずつ晴れていくことでしょう。