Packerは、Windows、Linux、macOSなどの主要なオペレーティングシステム用のイメージを並行して作成するために使用される軽量のオープンソースツールです。このトピックでは、Packerを使用してオンプレミスイメージを作成し、Alibaba Cloudにアップロードする方法について説明します。このトピックでは、Ubuntu 16.04を実行しているオンプレミスサーバーでCentOS 6.9イメージが作成されます。
前提条件
AccessKey IDとAccessKey Secretで構成されるAccessKeyペアを取得済みであること。詳細については、「AccessKeyペアを取得する」をご参照ください。
説明Alibaba CloudアカウントのAccessKeyペアの漏洩を防ぐために、Resource Access Management (RAM) ユーザーを作成し、RAMユーザーの認証情報を使用してAccessKeyペアを作成することをお勧めします。RAMユーザーの作成方法については、「RAMユーザーを作成する」をご参照ください。
RAMユーザーのAccessKey Secretは、RAMユーザーのAccessKeyペアを作成するときにのみ表示されます。AccessKeyペアの作成後、AccessKey Secretを照会することはできません。AccessKey Secretを記録し、機密性を保持してください。
Object Storage Service (OSS) が有効化されており、OSSバケットが作成済みであること。詳細については、「OSSを有効にする」をご参照ください。
説明イメージのディスクサイズは5 GBより大きくすることはできません。詳細については、「PutObject」をご参照ください。
背景情報
Packerは、ビルダー、プロビジョナー、ポストプロセッサなど、さまざまなコンポーネントで構成されています。Packerは、Hashicorp Configuration Language (HCL) またはJSON形式のテンプレートを使用して、カスタムイメージの作成プロセスを簡素化します。さらに、Packerはイメージ作成プロセスを標準化および自動化し、クラウド移行を容易にするためにイメージをコードとして定義できるようにします。Packerの詳細については、Packer公式ドキュメントをご参照ください。
手順
この例では、次のソフトウェアバージョンが使用されています。操作は、ソフトウェアのバージョンによって異なる場合があります。
オンプレミスサーバーのオペレーティングシステム:Ubuntu 16.04
イメージを作成するオペレーティングシステム:CentOS 6.9
手順 1:Kernel-based Virtual Machine (KVM) をインストールする
次のコマンドを実行して、オンプレミスサーバーがKVMをサポートしているかどうかを確認します。この例では、ソースサーバーはUbuntu 16.04を実行しています。
egrep "(svm|vmx)" /proc/cpuinfo
次のコマンド出力例は、ソースサーバーがKVMをサポートしていることを示しています。
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
オンプレミスサーバーがKVMをサポートしている場合は、次のコマンドを実行してKVMと関連コントロールをインストールします。
sudo apt-get update sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin bridge-utils
KVMが想定どおりにインストールされているかどうかを確認します。
KVMカーネルモジュールがロードされているかどうかを確認します。
sudo lsmod | grep kvm
KVMカーネルモジュールがロードされている場合、
kvm
とkvm_intel
、または kvm とkvm_amd
を含むコマンド出力が返されます。libvirtがインストールされているかどうかを確認します。
sudo dpkg -l libvirt-bin
libvirtがインストールされている場合、
libvirt-bin
を含むコマンド出力が返されます。QEMUがインストールされているかどうかを確認します。
sudo dpkg -l qemu-kvm
QEMUがインストールされている場合、
qemu-kvm
を含むコマンド出力が返されます。
コマンド出力が想定どおりであれば、KVMはインストールされています。コマンド出力のいずれかが想定どおりでない場合は、KVMを再インストールする必要がある場合があります。
手順 2:Packerをインストールする
オンプレミスサーバーにPackerをインストールします。詳細については、「Packerを使用してカスタムイメージを作成する」トピックの「手順 1:Packerをインストールする」セクションをご参照ください。
手順 3:Packerテンプレートを定義する
この例では、CentOS 6.9イメージが作成されます。他のオペレーティングシステムのイメージを作成するには、ニーズに合わせてPackerテンプレート構成ファイル centos.json を変更します。詳細については、「Packerテンプレートを作成する」をご参照ください。
ソースサーバーで次のコマンドを実行して、作業ディレクトリを /usr/local ディレクトリに変更します。
cd /usr/local
Alibaba Cloudが提供する centos.json 構成ファイルをダウンロードします。
sudo wget https://raw.githubusercontent.com/hashicorp/packer-plugin-alicloud/main/builder/examples/local/centos.json
Alibaba Cloudが提供する ks.cfg 構成ファイルをダウンロードします。
sudo wget https://raw.githubusercontent.com/hashicorp/packer-plugin-alicloud/main/builder/examples/local/http/centos-6.8/ks.cfg
ディレクトリを作成します。この例では、http/centos-6.9 ディレクトリが作成されます。
sudo mkdir -p http/centos-6.9
ks.cfg 構成ファイルを http/centos-6.9 ディレクトリに移動します。
sudo mv ks.cfg http/centos-6.9/
手順 4:Packerを使用してオンプレミスイメージを作成し、イメージをインポートする
オンプレミスサーバーで次のコマンドを実行して、AccessKey IDをインポートします。
export ALICLOUD_ACCESS_KEY=<AccessKey ID>
上記のコマンドで、
<AccessKey ID>
を実際のAccessKey IDに置き換えます。AccessKey Secretをインポートします。
export ALICLOUD_SECRET_KEY=<AccessKey Secret>
上記のコマンドで、
<AccessKey Secret>
を実際のAccessKey Secretに置き換えます。オンプレミスイメージを作成し、Alibaba Cloudにインポートします。
sudo packer build centos.json
次のコマンド出力例は、オンプレミスイメージがカスタムイメージとして中国 (北京) リージョンにインポートされたことを示しています。
qemu output will be in this color. ==> qemu: Downloading or copying ISO qemu: Downloading or copying: http://mirrors.aliyun.com/centos/6.9/isos/x86_64/CentOS-6.9-x86_64-minimal.iso ................................................ ==> qemu: Running post-processor: alicloud-import qemu (alicloud-import): Deleting import source https://oss-cn-beijing.aliyuncs.com/packer/centos_x86_64 Build 'qemu' finished. ==> Builds finished. The artifacts of successful builds are: --> qemu: Alicloud images were created: cn-beijing: XXXXXXXX
ECS コンソール - イメージ に移動します。
上部ナビゲーションバーの左上隅で、centos.json 構成ファイルが配置されているリージョンを選択します。この例では、中国 (北京) が選択されています。
[カスタムイメージ] タブで、CentOS 6.9イメージを表示します。
Packerテンプレートを作成する
次のJSONコードは、CentOS 6.9イメージを作成するために使用されるPackerテンプレートの作成方法を示しています。別のオペレーティングシステムのイメージを作成するには、ニーズに合わせてコードを変更します。
{"variables": {
"box_basename": "centos-6.9",
"build_timestamp": "{{isotime \"20060102150405\"}}",
"cpus": "1",
"disk_size": "4096",
"git_revision": "__unknown_git_revision__",
"headless": "",
"http_proxy": "{{env `http_proxy`}}",
"https_proxy": "{{env `https_proxy`}}",
"iso_checksum_type": "md5",
"iso_checksum": "af4axxxxxxxxxxxxxxxxx192a2", // ISOファイルのチェックサム
"iso_name": "CentOS-6.9-x86_64-minimal.iso",
"ks_path": "centos-6.9/ks.cfg",
"memory": "512",
"metadata": "floppy/dummy_metadata.json",
"mirror": "http://mirrors.aliyun.com/centos",
"mirror_directory": "6.9/isos/x86_64",
"name": "centos-6.9",
"no_proxy": "{{env `no_proxy`}}",
"template": "centos-6.9-x86_64",
"version": "2.1.TIMESTAMP"
},
"builders":[
{
"boot_command": [
"<tab> text ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{user `ks_path`}}<enter><wait>"
],
"boot_wait": "10s",
"disk_size": "{{user `disk_size`}}",
"headless": "{{ user `headless` }}",
"http_directory": "http",
"iso_checksum": "{{user `iso_checksum`}}",
"iso_checksum_type": "{{user `iso_checksum_type`}}",
"iso_url": "{{user `mirror`}}/{{user `mirror_directory`}}/{{user `iso_name`}}",
"output_directory": "packer-{{user `template`}}-qemu",
"shutdown_command": "echo 'vagrant'|sudo -S /sbin/halt -h -p",
"ssh_password": "vagrant",
"ssh_port": 22,
"ssh_username": "root",
"ssh_wait_timeout": "10000s",
"type": "qemu",
"vm_name": "{{ user `template` }}.raw",
"net_device": "virtio-net",
"disk_interface": "virtio",
"format": "raw"
}
],
"provisioners": [{
"type": "shell",
"inline": [
"sleep 30",
"yum install cloud-util cloud-init -y" // cloud-util と cloud-init をインストールする
]
}],
"post-processors":[
{
"type":"alicloud-import",
"oss_bucket_name": "packer",
"image_name": "packer_import",
"image_os_type": "linux",
"image_platform": "CentOS",
"image_architecture": "x86_64",
"image_system_size": "40",
"region":"cn-beijing"
}
]
}
QEMU Packerビルダーの必須パラメーター
QEMU Packerビルダーは、KVM仮想マシンイメージを作成するために使用されます。次の表に、ビルダーの必須パラメーターを示します。オプションパラメーターについては、QEMUビルダーをご参照ください。
必須パラメーター | タイプ | 説明 |
iso_checksum | 文字列 | オペレーティングシステムのISOファイルのチェックサム。Packerは、ISOファイルがアタッチされている仮想マシンが起動する前に、このパラメーターを確認します。iso_checksum と iso_checksum_url パラメーターの少なくともいずれかを指定してください。iso_checksum パラメーターを指定すると、iso_checksum_url の値は自動的に無視されます。 |
iso_checksum_type | 文字列 | 指定されたオペレーティングシステムのISOファイルのチェックサムタイプ。有効な値:
|
iso_checksum_url | 文字列 | オペレーティングシステムのISOファイルのチェックサムを含むGNUまたはBSDスタイルのチェックサムファイルを指すURL。iso_checksum と iso_checksum_url パラメーターの少なくともいずれかを指定してください。iso_checksum パラメーターを指定すると、iso_checksum_url の値は自動的に無視されます。 |
iso_url | 文字列 | イメージを含むISOファイルを指すURL。URLは、HTTP URLまたはファイルパスです。
|
headless | ブール値 | デフォルトでは、PackerはGUIを使用してQEMU仮想マシンを構築します。headless を True に設定すると、コンソールを持たない仮想マシンが起動します。 |
Packerプロビジョナーの必須パラメーター
Packerプロビジョナーには、オンプレミスイメージのAlibaba Cloudへの自動アップロードを可能にするポストプロセッサモジュールが含まれています。次の表に、Packerプロビジョナーの必須パラメーターを示します。オプションパラメーターについては、ポストプロセッサをご参照ください。
必須パラメーター | タイプ | 説明 |
access_key | 文字列 | オンプレミスイメージのインポートに使用するAccessKey ID。RAMユーザーのAccessKey IDの取得方法については、「RAMユーザーのAccessKeyペアに関する情報を表示する」をご参照ください。 |
secret_key | 文字列 | オンプレミスイメージのインポートに使用するAccessKey Secret。RAMユーザーのAccessKey Secretは、RAMユーザーのAccessKeyペアを作成するときにのみ表示されます。AccessKeyペアの作成後、AccessKey Secretを照会することはできません。詳細については、「AccessKeyペアを取得する」をご参照ください。 |
region | 文字列 | オンプレミスイメージをアップロードするリージョンのID。この例では、 |
image_name | 文字列 | アップロードするオンプレミスイメージの名前。
|
oss_bucket_name | 文字列 | オンプレミスイメージのアップロード先のOSSバケットの名前。指定されたOSSバケットが存在しない場合、Packerはイメージのアップロード時に指定された名前でOSSバケットを自動的に作成します。 |
image_os_type | 文字列 | オンプレミスイメージのタイプ。有効な値:
|
image_platform | 文字列 | オンプレミスイメージのディストリビューション。この例では、CentOSが使用されています。 |
image_architecture | 文字列 | オンプレミスイメージのアーキテクチャ。有効な値:
|
format | 文字列 | オンプレミスイメージのフォーマット。有効な値:
|