LinuxOSにバンドルされていないパッケージを、OSインストール時に自動インストールする 〜 非構成管理編 〜

# 本記事のターゲット

Linuxで、完全クローズドな環境で楽に追加パッケージをインストールしたいと思われる方をターゲットにしています。

# なぜ書いたのか

構成管理ツールを使用しての自動インストールは当たり前になりつつありますが、お客様環境などによっては

* サーバキッティング会社とソフトウェア組込み会社が分かれており、キッティング会社が初期状態でzabbix-agentをインストールしておかなければいけない。

* システムの重要性から、インターネット接続は納品するまで絶対に行ってはいけない。

という事があります。そうとう少ないですが。

本投稿では、モデルを**zabbix-agent**としています。
私がこれを書いた理由は上記の問題と少し違っていて、元々はデータセンタのIPMI監視をサーバをラッキングして直ぐに始めたいという事があって作りました。
IPMI監視にzabbix-agentは不要なんじゃない？というご意見もあると思いますが、オートディスカバリでzabbix-serverへ自動登録させるのが目的になります。

## Chef, Ansible, Puppetでは駄目なのか？

前途で挙げたような環境ですと、システムに不必要なツール・言語・ポートは使用してはいけないというルールも存在します。勿論22/TCPもこれに該当する可能性はあります。


# 今回作成した構成

- Ubunut server 14.04 isoイメージ
- ISOイメージ作成用Linux(仮想環境でもOKで、上記のisoイメージからインストールしたOS)
- インターネット接続が可能な環境

# 事前準備

ISOイメージを作成する為のOSを事前に用意します。
可能であれば同じisoイメージからインストールされたものが良いですが、同じディストリビューション・バージョンが合っていれば問題は無いと思います。

# カスタムUbuntu作成

- 構築用Ubuntuサーバログイン

```bash
$ ssh -l user 192.168.xxx.xxx
user@ubuntu:~$
```

- isoイメージ展開・コピー

```bash
$ pwd
/home/user
$ mkdir work
$ cd work/
work$ mkdir iso original-iso custom-iso
work$ cd iso/
work/iso$ wget http://releases.ubuntu.com/14.04.3/ubuntu-14.04.3-server-amd64.iso

work/iso$ cd ..
work$ sudo mount -o loop iso/ubuntu-14.04.3-server-amd64.iso ./original-iso/
mount: block device /home/user/work/iso/ubuntu-14.04.3-server-amd64.iso is write-
protected, mounting read-only
work$ sudo cp -r ./original-iso/* ./custom-iso/
work$ sudo cp -r ./original-iso/.disk/ ./custom-iso/
work$ sudo umount ./original-iso
```

- カスタム kickstart(seed) 作成

```bash
$ sudo apt-get update
$ sudo apt-get install system-config-kickstart
$ cd ~/work/custom-iso/isolinux/
$ sudo vi txt.cfg
```

一番上に[default zabbix-custom]　と　一番下に[label zabbix-custom...]を追記する

```text
default zabbix-custom   ## ここ追記
label install
  menu label ^Install Ubuntu Server
  kernel /install/vmlinuz
  append file=/cdrom/preseed/ubuntu-server.seed vga=788 initrd=/install/initrd.gz quiet --
label cloud
  menu label ^Multiple server install with MAAS
  kernel /install/vmlinuz
  append modules=maas-enlist-udeb vga=788 initrd=/install/initrd.gz quiet --
label check
  menu label ^Check disc for defects
  kernel /install/vmlinuz
  append MENU=/bin/cdrom-checker-menu vga=788 initrd=/install/initrd.gz quiet --
label memtest
  menu label Test ^memory
  kernel /install/mt86plus
label hd
  menu label ^Boot from first hard disk
  localboot 0x80
label zabbix-custom ##ここから追記
  menu label ^OCP Custom Install Ubuntu Server
  kernel /install/vmlinuz
  append file=/cdrom/preseed/ubuntu-ocp.seed initrd=/install/initrd.gz quiet --  ##ここまで追記
```

```bash
$ work/custom-iso/isolinux$ cd ..
$ work/custom-iso$ cd preseed/
$ work/custom-iso/preseed$ sudo vi ubuntu-zabbix.seed
```

下記、kickstart用ファイルはインストールしたい言語・キーボード等を環境によって変えてください。
参考URL: https://help.ubuntu.com/community/InstallCDCustomization/PreseedExamples

```text
########################################################################
#### Custom Preseed Amlin Europe using Ubiquity
### By Kelly Crabb テゥ for Amlin Europe
### Tested on Ubuntu Trusty Thral 14.04 LTS
####################################################################
# General
####################################################################
# Once installation is complete, automatically power off.
d-i finish-install/reboot_in_progress note
d-i ubiquity/summary note
ubiquity ubiquity/reboot boolean true
ubiquity ubiquity/poweroff boolean false# Automatically download and install stable updates?
unattended-upgrades unattended-upgrades/enable_auto_updates boolean false
####################################################################
# Installation Sources
####################################################################
# Configure the sources.list
d-i mirror/country string JP
#d-i mirror/http/hostname string archive.ubuntu.com
#d-i mirror/http/directory string /ubuntu/
#d-i apt-setup/use_mirror boolean true
#d-i apt-setup/mirror/error select Change mirror
#d-i apt-setup/multiverse boolean true
#d-i apt-setup/restricted boolean true
#d-i apt-setup/universe boolean true
#d-i apt-setup/partner boolean true
####################################################################
# Networking
####################################################################
# Network Configuration
d-i netcfg/enable boolean true
d-i netcfg/choose_interface select eth0
#d-i netcfg/disable_dhcp boolean false
####################################################################
# Disk Partitioning / Boot loader
####################################################################
### Disk Partitioning ###
# Configure auto partitioner
ubiquity partman-auto/init_automatically_partition select Guided - use entire disk
ubiquity partman-auto/disk string /dev/sda
ubiquity partman-auto/method string regular
ubiquity partman-auto/choose_recipe select All files in one partition (recommended for new
users)
ubiquity partman/confirm_write_new_label boolean true
ubiquity partman/choose_partition select Finish partitioning and write changes to disk
ubiquity partman/confirm boolean true
####################################################################
# Localizations / Timezone
####################################################################
### Keyboard selection ###
d-i keyboard-configuration/layoutcode string us
d-i keyboard-configuration/variantcode string
### Locale ###
d-i debian-installer/locale string en_US
### Timezone ###
d-i time/zone select Asia/Tokyod-i clock-setup/utc boolean true
d-i clock-setup/ntp boolean false
d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string us
#d-i localechooser/supported-locales multiselect nl_NL, nl_BE, fr_BE
### OEM-Config
d-i oem-config/enable boolean true
d-i oem-config/remove boolean true
d-i oem-config/remove_extras boolean false
d-i oem-config/install-language-support boolean true
d-i ubiquity/only-show-installable-languages boolean true
####################################################################
# User Creation
####################################################################
# Root User
d-i passwd/root-login boolean true
# Mortal User
d-i passwd/auto-login boolean true
d-i passwd/root-login boolean true
d-i passwd/make-user boolean false
d-i passwd/root-password password password
d-i passwd/root-password-again password password
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false
####################################################################
# Some extras
####################################################################
tasksel tasksel/force-tasks string server
tasksel tasksel/first multiselect zabbix-custom
# installing languages
# Language pack selection
d-i pkgsel/language-packs multiselect en, jp
# installing services
# d-i pkgsel/include string openssh-server
# Whether to upgrade packages after debootstrap.
# Allowed values: none, safe-upgrade, full-upgrade
d-i pkgsel/upgrade select none
# Policy for applying updates. May be "none" (no automatic updates),
#d-i pkgsel/update-policy select unattended-upgrades
# By default, the system's locate database will be updated after the
# installer has finished installing most packages. This may take a while, so
# if you don't want it, you can set this to "false" to turn it off.
#d-i pkgsel/updatedb boolean true
# This command is run just before the install finishes, but when there is
# still a usable /target directory. You can chroot to /target and use it
# directly, or use the apt-install and in-target commands to easily install
# packages and run commands in the target system.
#d-i preseed/late_command string apt-install zsh; in-target chsh -s /bin/zsh# And now we REALLY run with it!!
# deb install
d-i preseed/late_command string in-target /bin/bash /media/cdrom/pool/extras/custom_install.sh
```

- インストールするdebパッケージの収集
  - ローカルのアーカイブ削除

```bash
$ sudo rm -rf /var/cache/apt/archives/
```

- zabbix-agentリポジトリ登録

```bash
$ wget http://repo.zabbix.com/zabbix/2.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_2.2-1+trusty_all.deb
$ sudo dpkg -i zabbix-release_2.2-1+trusty_all.deb
```

- インストール(debパッケージ収集)

```bash
$ sudo apt-get update
$ sudo apt-get -y install zabbix-agent
```

- debパッケージ格納

```bash
$ cd work/custom-iso/pool/
work/custom-iso/pool$ sudo mkdir extras
work/custom-iso/pool$ sudo cp -rp /var/cache/apt/archives/*.deb ./extras/
work/custom-iso/pool$ sudo vi extras/custom_install.sh
```

zabbix-agentを自動でインストールするスクリプトを作成します。
必要に応じて、Server=XXXX/ServerActive=XXXXを組み替えると良いと思います。

```bash
#!/bin/bash
/usr/bin/dpkg -i /media/cdrom/pool/extras/*.deb
modprobe mei
modprobe dcmi
sed -i".org" \
-e 's/# EnableRemoteCommands=0/EnableRemoteCommands=1/g' \
-e 's/^Server=127.0.0.1/Server=zabbix-server/g' \
-e 's/^ServerActive=127.0.0.1/ServerActive=zabbix-server/g' \
-e 's/^Hostname=/# Hostname=/g' \
-e 's/# HostnameItem=/HostnameItem=/g' \
-e 's/# HostMetadata=/HostMetadata=Agent STARTER/g' \
/etc/zabbix/zabbix_agentd.conf
```

```bash
work/custom-iso/pool$ sudo chmod g+x extras/custom_install.sh
work/custom-iso/pool$ cd ../..
work$ sudo mkdir -p custom-iso/dists/stable/extras/binary-amd64
work/custom-iso/pool$ sudo su -
# cd /home/user/work/
home/user/work/custom-iso# pushd custom-iso
home/user/work/custom-iso# apt-ftparchive packages ./pool/extras/ > dists/stable/extras/binary-amd64/Packages
home/user/work/custom-iso# gzip -c ./dists/stable/extras/binary-amd64/Packages | tee ./dists/stable/extras/binary-amd64/Packages.gz > /dev/null
home/user/work/custom-iso# popd
home/user/work/custom-iso# exit
```

- ISOイメージ作成

```bash
work$ sudo apt-get install mkisofs
work$ sudo mkisofs -J -l -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-
table -z -iso-level 4 -c isolinux/isolinux.cat -o ./ubuntu-zabbix-custom-amd64.iso custom-iso/
work$ ls
custom-iso iso original-iso ubuntu-zabbix-custom-amd64.iso
```

完成した「ubuntu-zabbix-custom-amd64.iso」を使用する事でzabbix-agentが自動インストールされるようになります。

# おまけ

## OCPについて

OCPとは、Open Compute Projectの略称で2011年4月にFacebook社が提唱したプロジェクトです。
データセンター仕様をオープンに公開し、全体のアイデアやスペック等の知的財産を共有しています。
これにより、サーバ・ストレージ・データセンター・ラック・ネットワークスイッチ等の設計が公開される事で高効率なデータセンターが出来上がり、省エネ・コストダウンが図れるとされています。
この記事を書いたきっかけがOCPによるものです。
興味ありましたら下記スライドを参照ください。

http://opencomputejapan.org/wp-content/uploads/2015/04/20150401-OCPJ-overview-16_91.pdf

## cobblerでも出来ます

いちいちisoを作成するのが面倒という思いもあるでしょう。
そういった場合はPXEブートインストールも手段の一つです。
cobblerはPXEインストールに必要な情報を一括で管理する事が可能なので、是非チャレンジしてみて下さい。
http://cobbler.github.io/