StupidDog's blog

IT関連の手近な所で、疑問に思った事を調べた記録

「gitを、Ubuntu13.10 Serverへpuppetでインストールする」|ただいまpuppetも修行中です

はじめに

Ruby on Railsを、始めるつもりが環境構築に凝りすぎ随分と横道に進んでいますが続けます。
手動により導入するものが決まり手順をpuppet化する所まで来ました。
全てを一度に解決せず、各手順を順番に解決していこうと思います。
なので、対象環境上でマニフェストファイルを作成して手動で適用と確認です。

以下が参考にしているサイトと書籍です。

本家サイト:Learning Puppet — Manifests — Documentation — Puppet Labs
書籍:「入門puppet」

環境

puppetlabs提供のvagrant向けboxファイルから作成した仮想環境を使用します。

  • Ubuntu13.10 Server
  • puppet v3.4.2

参考としてVagrantfileの中身は次の通りです。

# encoding:utf-8
# vi: ft=ruby

VAGRANT_API_VERSION = "2"

Vagrant.configure(VAGRANT_API_VERSION) do |config|
  config.vm.box = "ubuntu1310"
  config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-1310-i386-virtualbox-puppet.box"
  config.vm.hostname = "z003.local"

  # host 192.168.100.1/24 <-> guest 192.168.100.103/24
  config.vm.network "private_network", ip: "192.168.100.103"
end

作業ディレクトリの作成

仮想環境へSSHでログインした直後は、/home/vagrantがカレントディレクトリになっています。
puppetの練習の為に作業ディレクトリを作成します。
作成したマニフェストファイルをまとめたいだけなので、puppetを使う上で必要なわけではありません。

$ pwd
/home/vagrant
$ mkdir pp
$ cd pp

以後、ここがカレントディレクトリになります。

マニフェストファイルの作成

gitをインストールする為のマニフェストファイルを作業ディレクトリにsample.ppとして作成し、次の一行を追加します。

package { 'git': }

マニフェストファイルを適用する

gitがインストールされていない状態から、puppetによりgitのインストールを行う。

$ git
 The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

gitが無いことを確認して、マニフェストファイルを適用(apply)する。

$ puppet apply -v sample.pp
Notice: Compiled catalog for z003.local in environment production in 0.19 seconds
Info: Applying configuration version '1395330812'
Error: Execution of '/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install git' returned 100: E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

Error: /Stage[main]/Main/Package[git]/ensure: change from absent to present failed: Execution of '/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install git' returned 100: E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

Notice: Finished catalog run in 0.30 seconds

Ubuntu上で実行しているのでapt-getを使用する所まで自動で判定されています。
しかし、apt-getの実行にroot権限を必要とするのでエラーとなりました。

sudoを付けて実行します。

$ sudo puppet apply -v sample.pp
Notice: Compiled catalog for z003.local in environment production in 0.18 seconds
Info: Applying configuration version '1395331185'
Notice: /Stage[main]/Main/Package[git]/ensure: created
Notice: Finished catalog run in 3.11 seconds

$ git --version
git version 1.8.3.2

gitがインストールされました。ここで、マニフェストを、再度適用してみます。

$ sudo puppet apply -v sample.pp
Notice: Compiled catalog for z003.local in environment production in 0.18 seconds
Info: Applying configuration version '1395331530'
Notice: Finished catalog run in 0.11 seconds

「Notice: /Stage[main]/Main/Package[git]/ensure: created」の行が消えてます。
gitがインストール済みなので何もされません。

まとめ

rbenvをgithubからインストールしようと考えていたところ、「入門puppet」の第11章に、execの例としてxbuildをgithubからインストールするマニフェストの作成がありました。
xbuildを、rbenvに読み替えてマニフェストを作成している時、このpackageの一行は何をしているのか気になり調べたところ、Attributesのensureを省略した状態であることが分かりました。

packageのensureを省略すると、installedを指定した状態になります。

本家ドキュメントより、package - attributes - ensureの説明
package-attribute-ensure

What state the package should be in. On packaging systems that can retrieve new packages on their own, you can choose which package to retrieve by specifying a version number or latest as the ensure value. On packaging systems that manage configuration files separately from “normal” system files, you can uninstall config files by specifying purged as the ensure value. This defaults to installed.

取り敢えず最後の部分。

なので、省略しない場合は以下のようになります。

package { 'git':
  ensure => installed,
}