概要
いつの間にか cloudstack builder が support されていたので IDCFクラウドに仮想マシンテンプレートを作成。
環境
- Packer v1.0.0
IDCFクラウド側の事前準備
- エンドポイント URL, API_KEY, SECRET_KEY 取得
- ソースのパブリック IP アドレス ID を取得※
- Keypair 登録
※packer にて temporary で public IP address を取得可能ですが、IDCFクラウドにおいては以下のエラーが出るため、デフォルトでついてくるソース IP アドレスを利用
==> cloudstack: Failed to associate public IP address: CloudStack API error 431 (CSExceptionErrorCode: 4350): Unable to figure out zone to assign ip to
template 作成
template.json
{
"variables": {
"api_url": "https://compute.jp-east.idcfcloud.com/client/api",
"api_key": "YOUR_API_KEY",
"secret_key": "YOUR_SECRET_KEY",
"ip_address_id" : "SOURCE_IP_ADDRESS_ID"
},
"builders": [
{
"type": "cloudstack",
"communicator": "ssh",
"api_url": "{{user `api_url`}}",
"api_key": "{{user `api_key`}}",
"secret_key": "{{user `secret_key`}}",
"http_get_only": true,
"public_ip_address": "{{user `ip_address_id`}}",
"use_local_ip_address": false,
"cidr_list": ["0.0.0.0/0"],
"hypervisor": "VMware",
"network": "newton-network1",
"service_offering": "light.S1",
"source_template": "CentOS 7.3 64-bit",
"zone": "newton",
"keypair": "YOUR_KEYPAIR_NAME",
"ssh_username": "root",
"ssh_private_key_file": "/path/to/private_key_file",
"ssh_timeout": "15m",
"template_name": "Template-{{isotime \"2006-01-02\"}}",
"template_display_text": "{{isotime \"2006-01-02\"}}",
"template_featured": true,
"template_password_enabled": false,
"template_scalable": true,
"template_os": "Other CentOS (64-bit)"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"sudo yum -y install epel-release",
"sudo yum -y install gcc openssl-devel libffi-devel python-devel python-crypto python-pip",
"sudo yum -y update",
"sudo pip install ansible",
"sudo pip install -U pip",
"sudo pip install -U setuptools"
]
},
{
"type": "file",
"source": "playbook/files",
"destination": "/tmp/packer-provisioner-ansible-local/"
},
{
"type": "file",
"source": "playbook/templates",
"destination": "/tmp/packer-provisioner-ansible-local/"
},
{
"type": "ansible-local",
"playbook_file": "playbook/provision.yml"
}
]
}
構築環境
- region: 東日本リージョン
- zone: newton
- OS: CentOS 7.3 64-bit
- マシンタイプ: light.S1
構築内容
provisioner で Ansible インストールまでして、その他諸々は ansible-local でプロビジョニングする。
ディレクトリ構成
root/
├ template.json
└ playbook/
├ provision.yml
├ files/
└ templates/
仮想マシンテンプレート作成
ビルド実行
$ packer build template.json
実行結果
==> cloudstack: Preparing config...
==> cloudstack: Creating instance...
==> cloudstack: Setup networking...
==> cloudstack: Waiting for SSH to become available...
==> cloudstack: Connected to SSH!
==> cloudstack: Provisioning with shell script: /tmp/packer-shell086017542
==> cloudstack: Uploading playbook/files => /tmp/packer-provisioner-ansible-local/
==> cloudstack: Uploading playbook/templates => /tmp/packer-provisioner-ansible-local/
==> cloudstack: Provisioning with Ansible...
==> cloudstack: Shutting down instance...
==> cloudstack: Creating template: Template-2017-05-15
==> cloudstack: Cleanup networking...
==> cloudstack: Deleting instance...
Build 'cloudstack' finished.
==> Builds finished. The artifacts of successful builds are:
--> cloudstack: A template was created: Template-2017-05-15