【備忘録】プロビジョニングしたAzureVM環境をpackerでイメージにする 前編

■はじめに

前回の続きです。
本日の登場人物はpackerさんです。

www.packer.io

packerのあらましについては、以下のページがとても分かりやすくて参考になると思います。

thinkit.co.jp

では早速行ってみましょう。

■packer準備

packerはpacker.json(ファイル名は任意)を準備して

packer build packer.json

で実行すればイメージをパッキングしてくれます。

早速packer.jsonを見てみましょう。

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

    "client_id": "xxxxx",
    "client_secret": "xxxxx",
    "tenant_id": "xxxxx",
    "subscription_id": "xxxxx",

    "managed_image_resource_group_name": "リソースグループ名",
    "managed_image_name": "イメージ名",

    "os_type": "Linux",
    "image_publisher": "Canonical",
    "image_offer": "UbuntuServer",
    "image_sku": "18.04-LTS",

    "azure_tags": {
        "dept": "Engineering",
        "task": "Image deployment"
    },

    "location": "eastus",
    "vm_size": "Standard_F2"
  }],
  "provisioners":[
    {
      "type": "ansible",
      "playbook_file": "playbook.yml",
      "inventory_file": "inventory.ini"
    }
  ]
}

この辺の記述は以下のページをほぼ参考にしています。

docs.microsoft.com


builderの部分は基本的に保存するイメージ情報です。
provisionersには、以前作成したAnsibleをそのまま使います。
実は以前のエントリの流れがここで活用されるわけですねー。


実行します。

 % packer build packer.json
azure-arm: output will be in this color.

==> azure-arm: Running builder ...
==> azure-arm: Getting tokens using client secret
==> azure-arm: Getting tokens using client secret
    azure-arm: Creating Azure Resource Manager (ARM) client ...
==> azure-arm: WARNING: Zone resiliency may not be supported in eastus, checkout the docs at https://docs.microsoft.com/en-us/azure/availability-zones/
==> azure-arm: Creating resource group ...
(中略)
==> azure-arm: Waiting for SSH to become available...
==> azure-arm: Connected to SSH!
==> azure-arm: Provisioning with Ansible...
    azure-arm: Setting up proxy adapter for Ansible....
==> azure-arm: Executing Ansible: ansible-playbook -e packer_build_name=azure-arm -e packer_builder_type=azure-arm -e ansible_ssh_private_key_file=/path/to/ --ssh-extra-args -o IdentitiesOnly=yes -i inventory.ini /path/to/playbook.yml
    azure-arm:
    azure-arm: PLAY [test] *************************************************************
    azure-arm:
    azure-arm: TASK [Gathering Facts] *********************************************************
    azure-arm: fatal: [FQDN]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ユーザ名@FQDN: Permission denied (publickey).", "unreachable": true}
    azure-arm:
    azure-arm: PLAY RECAP *********************************************************************
    azure-arm: FQDN : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0
    azure-arm:
==> azure-arm: Provisioning step had errors: Running the cleanup provisioner, if present...
==> azure-arm: Removing the created Deployment object: 'xxxxx'
==> azure-arm: 
==> azure-arm: Cleanup requested, deleting resource group ...
Cancelling build after receiving interrupt

あれ?? permission denied!?
念のためVMから作り直して、もう一度素のAnsibleを実行してみる。
おかしいな、上手くいくなー。。

(そして今日もエントリ投稿の日が変わってしまったorz )

何だろーSSH公開鍵が読み込めてないのかしら。。
よくわからなかったのでログを出力してみる。

  "provisioners":[
    {
      "type": "ansible",
      "playbook_file": "playbook.yml",
     "inventory_file": "inventory.ini"
      "extra_arguments": [ "-vvvv" ]
    }
  ]

ここでいつものボクの気まぐれが発動。

(そういえばazure-armでansibleを実行する時はinventoryは無視されるんだよなー。。)
www.packer.io
うん、消しとくか。 (ここで"inventory_file": "inventory.ini"の記述を削除)

軽い気持ちでログ見るつもりで上記を仕込んで実行したところで奇跡が。

% packer build packer.json
azure-arm: output will be in this color.

==> azure-arm: Running builder ...
(中略)
    azure-arm:
    azure-arm: PLAY [test] *************************************************************
    azure-arm:
    azure-arm: TASK [Gathering Facts] *********************************************************
    azure-arm: task path: /path/to/playbook.yml:5
    azure-arm: <127.0.0.1> ESTABLISH SSH CONNECTION FOR USER: ユーザ名
    azure-arm: <127.0.0.1> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=52470 -o 'IdentityFile="/path/to/"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="ユーザ名"' -o ConnectTimeout=10 -o IdentitiesOnly=yes -o ControlPath=/path/to 127.0.0.1 '/bin/sh -c '"'"'echo ~ユーザ名 && sleep 0'"'"''


ん??

    azure-arm: by setting deprecation_warnings=False in ansible.cfg.
    azure-arm:
    azure-arm: TASK [アーカイブキー取得] ***************************************************************
    azure-arm: task path: /path/to/playbook.yml:21
(中略)
    azure-arm:
    azure-arm: TASK [非公式リポジトリ取得] **************************************************************

うっ動いてるー!!(ガッツポーズ)


つまりinventory.iniが完全に邪魔だったわけですね。
packerのAnsible-remoteはDynamic Inventoryが機能するのは調べていてわかっていたのですが、何となく動いている気配があったのでinventory.iniの記述を放置していました。
これが原因だったのかー。

さて、ログが流石に流すぎて邪魔なので、-vvvvの設定を消して再度実行してみます。

% packer build packer.json
azure-arm: output will be in this color.

==> azure-arm: Running builder ...
(中略)
    azure-arm: TASK [アーカイブキー取得] ***************************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [非公式リポジトリ取得] **************************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [ダウンロード] ******************************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [推奨インストール] ****************************************************************
    azure-arm: [WARNING]: Updating cache and auto-installing missing dependency: python-apt
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [Upgrade] *****************************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [基本インストール] ****************************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [タイムゾーンを日本時間に変更] **********************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [docker関連の削除] *************************************************************
    azure-arm: ok: [default]
    azure-arm:
    azure-arm: TASK [docker取得] ****************************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [リポジトリの追加] ****************************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [docker再インストール] ***********************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [docker-composeダウンロード] ****************************************************
    azure-arm: changed: [default]
    azure-arm:
    azure-arm: TASK [docker-composeの権限変更] *****************************************************
    azure-arm: fatal: [default]: FAILED! => {"changed": false, "gid": 0, "group": "root", "mode": "0655", "msg": "chown failed: failed to look up user ユーザ名", "owner": "root", "path": "/usr/local/bin/docker-compose", "size": 17176256, "state": "file", "uid": 0}
    azure-arm:
    azure-arm: PLAY RECAP *********************************************************************
    azure-arm: default                    : ok=13   changed=11   unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
    azure-arm:
==> azure-arm: Provisioning step had errors: Running the cleanup provisioner, if present...
==> azure-arm: Removing the created Deployment object: 'xxxxx'
==> azure-arm: 
==> azure-arm: Cleanup requested, deleting resource group ...
==> azure-arm: Resource group has been deleted.
Build 'azure-arm' errored: Error executing Ansible: Non-zero exit status: exit status 2

==> Some builds didn't complete successfully and had errors:
--> azure-arm: Error executing Ansible: Non-zero exit status: exit status 2

==> Builds finished but no artifacts were created.

docker-composeの権限変更でコケて、アーティファクトが出力されていません。
一旦今回はここまで。

次回に続きます。(次回で終わるのかなぁ)

ではでは。