Virtual Private Cloudサービスには、仮想マシンを作成するためのオペレーティングシステムの既製イメージの大きなセットがあります。
ただし、多くのユーザーは当社のサービスに含まれていない画像を必要とします。たとえば、必要なオペレーティングシステムの種類やバージョンはそれほど一般的ではありません。
同じタイプのサーバーのクラスターを展開するユーザーなど、既製のイメージでプレインストールされたパッケージまたはシステム構成ファイルのセットを変更することが必要になる場合があります。
サーバーをインストールした後に毎回同じ構成を行わないようにするために、必要な変更を加えたイメージを準備し、この方法で多数の同様の仮想マシンのインストールを高速化できます。 この記事では、これがどのように行われるかを示します。
例として、Ubuntu 16.04のイメージが使用されます:作業環境の準備、必要なパラメーターの設定、クラウドサービスへのイメージのアセンブルとアップロード。
Virtual Private Cloudサービスのすべての追加機能と完全な互換性を持つイメージを準備するために必要な手順も検討されます。
イメージを構築するツールとしてdiskimage-builderを使用します。 これは、OpenStackコミュニティでサポートされているオペレーティングシステム、ファイルシステム、オープンソースRAMディスクのイメージを準備するためのコンポーネントのセットです。
このツールは、最も一般的なGNU / Linuxディストリビューションのイメージングをサポートしています。
- Centos
- Debian
- フェドラ
- Rhel
- Ubuntu
- ジェンツー
- OpenSUSE
デフォルトでは、diskimage-builderはクラウドバージョンのオペレーティングシステムのイメージを準備します。そのため、イメージにはcloud-initおよびcloud-utilsパッケージが含まれます。これらはクラウドでの自動システム構成に必要です。
Ubuntu 16.04イメージの作成
Ubuntu 14.04を実行しているマシンでイメージを準備します。
まず、必要な依存関係を確立します。
sudo apt update sudo apt -y install python-pip curl
次に、diskimage-builderをインストールします。
sudo pip install diskimage-builder
作業用のベースディレクトリを作成しましょう。
mkdir -p ~/diskimage-builder/{images,elements}
diskimage-builderを設定するには、いくつかの追加パラメーターを指定する必要があります。その値はシェル環境変数に直接保存されます(したがって、コマンドラインで指定できます)。
- ARCH = "amd64" -イメージアーキテクチャ。
- BASE_ELEMENTS = "ubuntu bootloader cloud-init-datasources" -ここでは、diskimage-builderで使用される要素を示します。 要素は、イメージを準備および変更するためのすべてのルーチンアクションを実行するbashスクリプトのセットです。 私たちにとって最も重要なのは、ubuntu要素です。これは、標準の公式配布イメージをダウンロードして展開し、 chrootユーティリティを使用して、必要なパッケージをインストールし、システムをイメージ内の現在の状態に更新し、使用可能な状態にすべてを収集します。 ブートローダー要素は、準備中のシステムイメージにブートローダー(この場合はGRUB2)をインストールし、cloud-init-datasourcesはcloud-initユーティリティのデータソースのリストを転送します。これは、起動時のオペレーティングシステムの初期構成に必要です。
- DIB_CLOUD_INIT_DATASOURCES = "ConfigDrive、Ec2"-cloud -init-datasources要素のデータソース。
- DIB_RELEASE = "xenial" -イメージの作成に使用するオペレーティングシステムのバージョン。
- IMAGE_PATH = "〜/ diskimage-builder / images / ubuntu-16.04" -イメージの名前とパス。
イメージは、次のコマンドを使用して構築されます。
disk-image-create vm $BASE_ELEMENTS -t raw -o $IMAGE_PATH
-tスイッチの後に、目的の画像形式を指定します。 サポートされている画像:qcow2、tar、vhd、docker、raw。
画像を直接組み立てる前に、システムで追加設定を行う必要があります。たとえば、次のようになります。
- システムに追加パッケージをインストールします。
- predictable_interface_namingメカニズムを無効にします。これにより、通常のインターフェイス名eth0、eth1、...がenp0s3、ens3などの形式の名前に変更されます。
- ubuntuユーザーの作成を無効にし、SSHを介したrootユーザーへのアクセスを許可します。
- このイメージから作成された各仮想マシンのSSHキーを再生成します。
- プリセットのタイムゾーンを変更します。
これを行うには、〜/ diskimage-builder / elementsディレクトリに追加の要素を作成する必要があります。
ディレクトリを作成します。
mkdir -p ~/diskimage-builder/elements/ubuntu-16-custom/{install.d,post-install.d,finalise.d}
〜/ diskimage-builder / elements / ubuntu-16-customディレクトリ内で、新しい要素の説明を含むREADME.rstファイルを作成します。
================ ubuntu-16-custom ================ Customize Ubuntu 16.04 (Xenial)
〜/ diskimage-builder / elements / ubuntu-16-custom / install.dディレクトリで、50-install-additional-packagesスクリプトを作成します。
#!/bin/bash packages="python2.7 python python-minimal" apt -y install $packages
install.dディレクトリ内のスクリプトは、メインパッケージのインストール中にイメージが構築されるときに実行されます。 作成した50-install-additional-packagesスクリプトは、システムにpythonバージョン2.7をインストールします。これは、多くのアプリケーションが動作するためにまだ必要です。 デフォルトでは、Ubuntu 16.04イメージにはPythonバージョン3.5のみが存在します。
また、必要なパッケージをこのリストに追加して、イメージにインストールする必要があります。
次に、〜/ diskimage-builder / elements / ubuntu-16-custom / post-install.dディレクトリで、システム構成を変更する50-configure-systemスクリプトを作成する必要があります。
#!/bin/bash # Permit password auth via SSH echo 'ssh_pwauth: true' >> /etc/cloud/cloud.cfg.d/50_remote_access.cfg # Generate new keys in first boot echo 'ssh_deletekeys: true' >> /etc/cloud/cloud.cfg.d/50_remote_access.cfg # Don't disable root access via SSH echo 'disable_root: false' >> /etc/cloud/cloud.cfg.d/50_remote_access.cfg # Don't create "ubuntu" user echo 'users: []' >> /etc/cloud/cloud.cfg.d/50_remote_access.cfg # Change default timezone to MSK echo 'timezone: Europe/Moscow' >> /etc/cloud/cloud.cfg.d/50_timezone.cfg # Change PermitRootLogin value to "yes" sed -i 's/PermitRootLogin .*/PermitRootLogin yes/g' /etc/ssh/sshd_config # Set root password to empty passwd -d root
post-install.dディレクトリ内のスクリプトは、install.dディレクトリ内のスクリプトの直後に実行されます。
また、GRUB設定を変更して起動パラメーター「net.ifnames = 0」を追加する必要があります。これにより、インターフェイス名が使い慣れたethN形式で保存されます。
〜/ diskimage-builder / elements / ubuntu-16-custom / finalise.dディレクトリに50-configure-grubスクリプトを追加します。
#!/bin/bash sed -i 's/\(^GRUB_CMDLINE_LINUX.*\)"$/\1 net.ifnames=0"/' /etc/default/grub update-grub
finalise.dディレクトリ内のスクリプトは、イメージを準備するためのすべての基本的なステップの後に実行されます。
説明したスクリプトを作成した後、それらの属性を変更する必要があります。そのために、 chmodコマンドを実行します。
chmod 0755 ~/diskimage-builder/elements/ubuntu-16-custom/*d/*
次に、画像を作成する前に、新しい要素のパスを指定する必要があります。 これは、 ELEMENTS_PATHパラメーターを使用して実行できます。
コマンドラインで毎回パラメーターを直接指定しないようにするには、〜/ diskimage-builder /ディレクトリで、diskimage-builderパラメーターを設定してイメージをビルドするbuild-ubuntu-16.04スクリプトを作成します。
#!/bin/bash export ARCH="amd64" export BASE_ELEMENTS="bootloader cloud-init-datasources ubuntu ubuntu-16-custom" export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, Ec2" export DIB_RELEASE="xenial" export ELEMENTS_PATH="./elements/:/usr/share/diskimage-builder/elements/" export IMAGE_PATH="./images/ubuntu-16.04" disk-image-create vm $BASE_ELEMENTS -t raw -o $IMAGE_PATH
このファイルの属性を変更します。
chmod 0755 ~/diskimage-builder/build-ubuntu-16.04
この後、次のファイル階層を取得する必要があります。
$tree -p ~/diskimage-builder /home/user/diskimage-builder ├── [-rwxr-xr-x] build-ubuntu-16.04 ├── [drwxr-xr-x] elements │ └── [drwxr-xr-x] ubuntu-16-custom │ ├── [drwxr-xr-x] finalise.d │ │ └── [-rwxr-xr-x] 50-configure-grub │ ├── [drwxr-xr-x] install.d │ │ └── [-rwxr-xr-x] 50-install-additional-packages │ ├── [drwxr-xr-x] post-install.d │ │ └── [-rwxr-xr-x] 50-configure-cloud-init │ └── [-rw-r--r--] README.rst └── [drwxr-xr-x] images
build-ubuntu-16.04スクリプトを実行します。
cd ~/diskimage-builder sudo ./build-ubuntu-16.04
sudoを呼び出すときは、パスワードを入力するという提案がイメージ準備プロセスの途中で表示されないように、ユーティリティが必要です。 この動作は、いくつかの事前定義されたdiskimage-builder要素にsudo呼び出し(たとえば、ほとんどのディストリビューションのアセンブリ中に実行される基本要素からの01-ccacheスクリプト)が含まれているという事実によって説明されます。
スクリプトの最後で、新しいイメージは〜/ diskimage-builder / images / ubuntu-16.04.rawディレクトリに配置されます。
Selectel Virtual Private Cloudサービスで作成したイメージを使用するには、 VPCパネルのWebインターフェースまたはglance APIからダウンロードします 。
ルートパスワードはイメージのビルドフェーズ中に削除されたため、SSHを介した仮想マシンへのアクセスは最初はキーによってのみ可能になることに注意してください。 VPCパネルでマシンを作成するときにSSHキーを追加できます。 サーバーへのアクセスは、コントロールパネルのno-VNC仮想コンソールからも可能です。この場合、rootパスワードが設定されていなければ、入力する必要はありません。
rootパスワードは、passwdユーティリティを使用して標準的な方法で設定されます。
Virtual Private Cloud(VPC)サービスで上記の手順を使用して作成されたイメージを使用しようとすると、いくつかの制限が発生します。 次のVPC機能は利用できません。
- VPCサービスによって生成された初期パスワードを設定します。
- VPC Webパネルからルートパスワードを変更します。
- nova APIを使用してルートパスワードを変更します 。
- VPC Webパネルからデフォルトルートのインターフェースを変更する
- サーバーコントロールパネルで変更された場合、システム内のネットワークインターフェイス設定の自動変更。
次のセクションでは、完全に互換性のあるVPCイメージを作成する方法を示します。
Virtual Private Cloudサービスのイメージを作成する
作成されたイメージがVPCサービスと完全に互換性を持つようにするには、アセンブリ段階で、イメージのプロパティに追加のプロパティを追加し、システムに追加のパッケージをインストールする必要があります。
別のubuntu-16-selectel要素を追加します。このために、ディレクトリを作成します。
mkdir -p ~/diskimage-builder/elements/ubuntu-16-selectel/
このディレクトリ内で、README.rstファイルに要素の説明を追加します。
==================== ubuntu-16-selectel ==================== Build ubuntu image for Virtual Private Cloud
新しい要素に必要なディレクトリを作成します。
mkdir -p ~/diskimage-builder/elements/ubuntu-16-selectel/{pre-install.d,install.d,post-install.d}
スクリプトでリポジトリのリストを変更します〜/ diskimage-builder / elements / ubuntu-16-selectel / pre-install.d / 50-add-mirrors:
#!/bin/bash # Add key for Selectel OpenStack repository apt-key adv --fetch-keys http://repo.os.selectel.org/selectel-openstack.key cat <<EOF > /etc/apt/sources.list ## Selectel OpenStack repository deb http://repo.os.selectel.org xenial main ## Selectel mirrors deb http://mirror.selectel.ru/ubuntu xenial main restricted universe multiverse deb http://mirror.selectel.ru/ubuntu xenial-updates main restricted universe multiverse deb http://mirror.selectel.ru/ubuntu xenial-backports main restricted universe multiverse ## Security updates deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse EOF
スクリプト〜/ diskimage-builder / elements / ubuntu-16-selectel / install.d / 50-add-selectel-packagesで追加のパッケージを追加します。
#!/bin/bash packages="crontab-randomizer fstrim-blocks qemu-guest-agent set-root-pw" apt -y install $packages
次のユーティリティがインストールされます。
- crontab-randomizerは、/ etc / crontabの時間間隔をランダム化する単純なスクリプトです。システムの最初の起動時にこのスクリプトへの呼び出しを追加します。
- fstrim-blocks-プリインストールされたfstrimユーティリティのラッパー。短い間隔でブロックごとに高速ディスクでTRIMファイルシステムを実行できます。インストール中にcron.weeklyへの呼び出しが追加されます。
- qemu-guest- agent-システムを仮想マシンに管理するためのQMPコマンドを転送できるユーティリティ。この場合、このユーティリティはVPCパネルとnova APIを介して仮想マシンのパスワードを変更するために必要です。
- set-root-pw -OpenStackメタデータから取得したパスワードの仮想マシンへの初期インストール用のスクリプト。次に、システムの最初の起動時にこのスクリプトへの呼び出しも追加します。
また、イメージのアセンブリ中に、cloud-initパッケージがSelectel OpenStackミラーにあるバージョンに自動的に更新されます。 このバージョンには、仮想マシンとVPCサービス間のネットワーク設定の一貫性を保証するパッチが含まれています。
イメージのアセンブリ中のパッケージの自動更新は、install.dステージ中に事前定義されたスクリプト00-up-to-dateを使用して行われます。
次に、cloud-initに追加の構成ファイルを追加し、〜/ diskimage-builder / elements / ubuntu-16-selectel / post-install.dディレクトリにスクリプト50-configure-cloud-initを作成する必要があります。
#!/bin/bash # Prevent cloud-init to change custom apt mirrors echo 'apt_preserve_sources_list: true' > /etc/cloud/cloud.cfg.d/50_selectel_mirror.cfg echo 'system_info:' >> /etc/cloud/cloud.cfg.d/50_selectel_mirror.cfg echo '- arches: [i386, amd64]' >> /etc/cloud/cloud.cfg.d/50_selectel_mirror.cfg echo 'search:' >> /etc/cloud/cloud.cfg.d/50_selectel_mirror.cfg echo 'primary:' >> /etc/cloud/cloud.cfg.d/50_selectel_mirror.cfg echo '- http://mirror.selectel.ru/ubuntu' >> /etc/cloud/cloud.cfg.d/50_selectel_mirror.cfg echo 'failsafe:' >> /etc/cloud/cloud.cfg.d/50_selectel_mirror.cfg echo '- http://archive.ubuntu.com/ubuntu/' >> /etc/cloud/cloud.cfg.d/50_selectel_mirror.cfg # Prevent cloud-init to disable EC2-style metadata echo 'disable_ec2_metadata: false' > /etc/cloud/cloud.cfg.d/50_enable_ec2.cfg # Perform some commands in boot time # 'runcmd' only runs during the first boot echo 'runcmd:' > /etc/cloud/cloud.cfg.d/50_first_boot_routines.cfg echo '- set-root-pw 2> /dev/null' >> /etc/cloud/cloud.cfg.d/50_first_boot_routines.cfg echo '- crontab-randomizer' >> /etc/cloud/cloud.cfg.d/50_first_boot_routines.cfg
また、fstrim-blocksを使用する場合は、定義済みのスクリプト/etc/cron.weekly/fstrimを削除することをお勧めします。定義済みのバージョンにはブロック起動オプションが含まれていないため、fstrimの起動時にシステムに追加の負荷がかかります。
シンプルなスクリプトでこのファイルを削除してください〜/ diskimage-builder / elements / ubuntu-16-selectel / post-install.d / 51-remove-fstrim-weekly:
#!/bin/bash rm -f /etc/cron.weekly/fstrim
新しいスクリプトの属性を変更します。
chmod 755 ~/diskimage-builder/elements/ubuntu-16-selectel/*d/*
〜/ diskimage-builder / build-ubuntu-16.04スクリプトに新しいubuntu-16-selectel要素を追加します。
#!/bin/bash export ARCH="amd64" export BASE_ELEMENTS="bootloader cloud-init-datasources ubuntu ubuntu-16-custom ubuntu-16-selectel" export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, Ec2" export DIB_RELEASE="xenial" export ELEMENTS_PATH="./elements/:/usr/share/diskimage-builder/elements/" export IMAGE_PATH="./images/ubuntu-16.04" disk-image-create vm $BASE_ELEMENTS -t raw -o $IMAGE_PATH
ファイル階層は次のようになります。
$ tree -p diskimage-builder diskimage-builder ├── [-rw-r--r--] build-ubuntu-16.04 └── [drwxr-xr-x] elements ├── [drwxr-xr-x] ubuntu-16-custom │ ├── [drwxr-xr-x] finalise.d │ │ └── [-rwxr-xr-x] 50-configure-grub │ ├── [drwxr-xr-x] install.d │ │ └── [-rwxr-xr-x] 50-install-additional-packages │ ├── [drwxr-xr-x] post-install.d │ │ └── [-rwxr-xr-x] 50-configure-system │ └── [-rw-r--r--] README.rst └── [drwxr-xr-x] ubuntu-16-selectel ├── [drwxr-xr-x] install.d │ └── [-rwxr-xr-x] 50-add-selectel-packages ├── [drwxr-xr-x] post-install.d │ └── [-rwxr-xr-x] 50-configure-cloud-init ├── [drwxr-xr-x] pre-install.d │ └── [-rwxr-xr-x] 50-add-selectel-openstack-mirror └── [-rw-r--r--] README.rst
イメージアセンブリを実行します。
cd ~/diskimage-builder sudo ./build-ubuntu-16.04
必要なすべてのプロパティを含むイメージをダウンロードするには、プロジェクトにアクセスするためのglanceユーティリティとRCファイルが必要です(コントロールパネルでダウンロードできます。必要なすべての手順はそこに公開されています) https://support.selectel.ru/vpc/access/ 。
ロードするコマンドは次のようになります。
glance image-create --name Ubuntu-16.04-VPC \ --disk-format raw \ --container-format bare \ --property hw_disk_bus=scsi \ --property hw_scsi_model=virtio-scsi \ --property x_sel_image_owner=Selectel \ --property hw_qemu_guest_agent=yes \ --file ~/diskimage-builder/images/ubuntu-16.04.raw \ --progress
ロードすると、次のプロパティが追加されます。
- hw_qemu_guest_agent = yes -VPCパネルまたはnova APIを介してサーバーパスワードを変更するメカニズムをサポートするために必要です。 このプロパティは、qemu-guest-agentユーティリティがバージョン2.3以上である場合にのみ機能します(バージョン2.5はUbuntu 16.04で使用されます)
- x_sel_image_owner = Selectel -VPCパネルでのパスワードの表示をサポートするために必要です。
- hw_disk_bus = scsi 、 hw_scsi_model = virtio-scsi-これらのプロパティにより、より近代的で効率的なvirtio-scsiバスを使用できるようになります。その利点の1つはTRIMを使用できることです。
ダウンロードすると、VPCプロジェクトの[イメージ]タブにUbuntu-16.04-VPCという名前でイメージが表示されます。
サーバーを初めて起動すると、rootユーザーのパスワードが生成され、自動的に設定されます。 「コンソール」タブに表示され、必要に応じて新しいパスワードを生成することもできます。
また、[ポート]タブのコントロールパネルでネットワークインターフェイスを変更した場合、サーバー上のネットワークインターフェイスを手動で構成する必要はありません。 cloud-initでネットワークインターフェイスを再構成するには、電源をオンにしてサーバーを再起動する必要があります。 その後、新しいネットワーク設定を持つ新しいOpenStackメタデータが生成されます。
サーバーがリブートするたびにcloud-initユーティリティーがネットワーク設定を変更しないようにすることができます。 これを行うには、インストールされたシステムで、ファイル/etc/cloud/cloud.cfg.d/99_disable_network_config.cfgを追加します。
network: config: disabled
近い将来、システム構成を編集することなく、VPCパネルWebインターフェースを介した自動ネットワーク再構成を禁止する機能を追加します。
おわりに
この記事では、diskimage-builderの基本機能を調べ、独自のスクリプトを追加してイメージ構成を変更する方法、アセンブリのメインステージ、完成したイメージをクラウド環境にロードする例を学びました。
このツールを使用する主な方法についてまだ質問がある場合、またはVPCサービスでイメージと仮想マシンを管理する点について理解していない場合は、コメントでそれを示してください。
diskimage-builderを使用する独自の方法を共有していただければ幸いです。