3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Packer + Ansible で Azure Managed Image (VHDではなく) を作る

Posted at

Packer (1.0.4〜) と AnsibleAzure Managed Image を作る方法です。
旧来の VHD (Storage Account) を作る方法ではありません。

AWS の AMI (Builders >> amazon-ebs) と同じでしょ?と思ってましたが、実際はかなりハマったのでまとめ。

ハマりポイント

Packerビルド方法(Mac版)
# install go.
$ brew install go. # ← ここがMac専用 (あとはLinux共通)
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOPATH/bin

# get packer git repository into "~/go".
$ go get github.com/hashicorp/packer
$ cd $GOPATH/src/github.com/hashicorp/packer

# compile.
$ make
$ go build -o bin/packer .
$ $GOPATH/src/github.com/hashicorp/packer/bin/packer -v
1.0.4

# install.
$ mv $GOPATH/src/github.com/hashicorp/packer/bin/packer /usr/local/bin
$ which packer
/usr/local/bin/packer
  • Builders >> amazon-ebs とは異なり、Deprovision という対応を自分でやらないといけない。これを忘れると Image作成は成功するが、出来たImageからVMが起動できない!!

Packer設定例

Packer公式のガイドはこれです。

実際にImageを作れた時の packer.json 。CentOS7ベースです。

{
  "builders": [
    {
      "type": "azure-arm",

      "client_id": "{アプリケーションID}",
      "client_secret": "{パスワード}",
      "tenant_id": "{テナントID}",
      "subscription_id": "{サブスクリプションID}",

      "managed_image_name": "{登録したいイメージ名}",
      "managed_image_resource_group_name": "{イメージ登録先のリソースグループ}",

      "os_type": "Linux",
      "image_publisher": "OpenLogic",
      "image_offer": "CentOS",
      "image_sku": "7.3",

      "location": "eastasia",
      "vm_size": "Standard_DS2"
    }
  ],
  "provisioners": [
    {
      "type": "ansible",
      "playbook_file": "playbook.yml"
    },
    {
      "type": "shell",
      "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'",
      "inline": [
        "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"
      ],
      "inline_shebang": "/bin/sh -x"
    }
  ]
}

一応 Ansibleplaybook.yml の例も。

---
- hosts: all
  become: true
  tasks:
    - name: you can do anythin in this playbook.
      shell: echo hello world !!

Builders設定

Azure Portalpacker.json に指定するID類を確認&作成していきます。基本↓に書いてあります。

まずはリソースグループを作ります。これは packer.json の "managed_image_resource_group_name" に指定するリソースグループ名です。

Azure Active Directory >> App registrations でアプリを登録します

上部メニューの "+ADD" を押して、アプリIDを発行します。

1-appregistration.png

アプリIDは↓です。これは packer.json の "client_id" に指定するIDです。

2-appid.png

Azure Active Directory >> App registrations >> sampleapp >> API ACCESS:Keys でキー (パスワード) の発行をします。

3-keys.png

"DESCRIPTION", "EXPIRES" を入力して "Save" を押すとキー (パスワード) が発行されます。これは packer.json の "client_secret" に指定します。

4-keys.png

Subscriptions >> {Subscription名} >> Access control (IAM) でアプリにロール (アクセス権) の登録をします。ロールは "Contributor" (日本語では"共同作成者") を指定します。

6-addrole.png

Azure Active Directory >> Properties でテナントID (Directory ID) が見れます。これは packer.json の "tenant_id" に指定します。

5-tenantid.png

Subscriptions で Subscription ID が見れます。これは packer.json の "subscription_id" に指定します。

7-subscription.png

Deprovision処理を忘れるな!

からなず "provisioners" の最後に↓の Deprovision 処理が必要です。これを忘れると Image作成は成功しますが、VMの起動は失敗 します。

{
  "provisioners": [
    {
      "type": "shell",
      "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'",
      "inline": [
        "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"
      ],
      "inline_shebang": "/bin/sh -x"
    }
  ]
}

Windowsマシン用の処理は↑とは違うので Deprovision を参照

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?