仮想プライベートクラウド:イメージの準備

VPCイメージの構築



Virtual Private Cloudサービスには、仮想マシンを作成するためのオペレーティングシステムの既製イメージの大きなセットがあります。







ただし、多くのユーザーは当社のサービスに含まれていない画像を必要とします。たとえば、必要なオペレーティングシステムの種類やバージョンはそれほど一般的ではありません。







同じタイプのサーバーのクラスターを展開するユーザーなど、既製のイメージでプレインストールされたパッケージまたはシステム構成ファイルのセットを変更することが必要になる場合があります。







サーバーをインストールした後に毎回同じ構成を行わないようにするために、必要な変更を加えたイメージを準備し、この方法で多数の同様の仮想マシンのインストールを高速化できます。 この記事では、これがどのように行われるかを示します。







例として、Ubuntu 16.04のイメージが使用されます:作業環境の準備、必要なパラメーターの設定、クラウドサービスへのイメージのアセンブルとアップロード。







Virtual Private Cloudサービスのすべての追加機能と完全な互換性を持つイメージを準備するために必要な手順も検討されます。







イメージを構築するツールとしてdiskimage-builderを使用します。 これは、OpenStackコミュニティでサポートされているオペレーティングシステム、ファイルシステム、オープンソースRAMディスクのイメージを準備するためのコンポーネントのセットです。







このツールは、最も一般的なGNU / Linuxディストリビューションのイメージングをサポートしています。









デフォルトでは、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を設定するには、いくつかの追加パラメーターを指定する必要があります。その値はシェル環境変数に直接保存されます(したがって、コマンドラインで指定できます)。









イメージは、次のコマンドを使用して構築されます。







 disk-image-create vm $BASE_ELEMENTS -t raw -o $IMAGE_PATH
      
      





-tスイッチの後に、目的の画像形式を指定します。 サポートされている画像:qcow2、tar、vhd、docker、raw。







画像を直接組み立てる前に、システムで追加設定を行う必要があります。たとえば、次のようになります。









これを行うには、〜/ 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イメージを作成する方法を示します。







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
      
      





次のユーティリティがインストールされます。









また、イメージのアセンブリ中に、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
      
      





ロードすると、次のプロパティが追加されます。









ダウンロードすると、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を使用する独自の方法を共有していただければ幸いです。








All Articles