kitchenCI (kitchen-azurerm) を用いたAzure vm環境でのplaybook開発

#kitchenCIを用いてAzure vm環境を構成(備忘)

#環境
- macOS 10.14.5
- Chef Workstation: 0.3.2  

以下、Chef Workstation付属
- test-kitchen: 1.25.0
- kitchen-azurerm (0.14.8)

その他 
- ansible 2.7.6
- kitchen-ansiblepush (0.9.1)
など

#Azure環境

##サブスクリプション ID
アカウントおよびサブスクリプションを作成する
「無料試用版」サブスクリプションを使用した。
使用するサブスクリプションに対応するサブスクリプションのIDを以下より確認

Azureのポータル(https://portal.azure.com/#home)より、
→ 左のリスクから「すべてのサービス」
→ 右から「サブスクリプション」
ここで使用する「サブスクリプション名」に対応する「サブスクリプション ID」を記録しておく

##tenant_id, client_id

[方法:リソースにアクセスできる Azure AD アプリケーションとサービス プリンシパルをポータルで作成する](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal)
に従い、

- [Azure Active Directory アプリケーションを作成する](
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal#create-an-azure-active-directory-application
)
より適当な名前でアプリケーションを作成

- [アプリケーションをロールに割り当てる](
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal#assign-the-application-to-a-role
)
より、「サブスクリプション」を選択後に上で作成したアプリケーションに、適当なロールを割り振る。
(kitchen-azurerm は、自動的にリソース・グループを作成/削除するので、ロールはサブスクリプションに関連付けるべき。)
ここでは、以下で追加している。
役割: 共同作成者
アクセスの割り当て先: Azuru ADのユーザー、グループ、サービス プリンシパル
選択: 上で作成したアプリケーション


- [サインインするための値を取得する](
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal#get-values-for-signing-in
)
より、
ディレクトリ (テナント) ID と アプリケーション ID を記録



##client_secret

[証明書とシークレット](
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal#certificates-and-secrets)
よりclient_secretを確認する。
ここでは、
[新しいアプリケーション シークレットを作成する](
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal#create-a-new-application-secret)
を用いて新たなクライアント シークレットの値を作成し記録

#~/.azure/credentials

~/.azure/credentials に、設定or確認した、サブスクリプション ID, tenant_id, client_id, client_secret を設定

```:~/.azure/credentials
[abcd1234-YOUR-SUBSCRIPTION-ID-HERE-abcdef123456]
client_id = "48b9bba3-YOUR-GUID-HERE-90f0b68ce8ba"
client_secret = "your-client-secret-here"
tenant_id = "9c117323-YOUR-GUID-HERE-9ee430723ba3"
```


#kitchen環境構成
```bash

$ mkdir kitchen-azurerm
$ cd kitchen-azurerm
$ vi .kitchen.yml
```

他に以下を設定して使用。 

- Ansible Playbook として ./site.yml
- InSpecテストとして ./test/integration/default/default_test.rb

```yaml:.kitchen.yml
---
driver:
  name: azurerm
  subscription_id: abcd1234-YOUR-SUBSCRIPTION-ID-HERE-abcdef123456
  location: japaneast
  machine_size: Standard_D2_v3
  image_urn: RedHat:RHEL:7-RAW:latest
  vm_name: node1
  vm_tags:
    ostype: linux
    distro: rhel

transport:
  ssh_key: "~/.ssh/id_rsa"

provisioner:
  name: ansible_push
  chef_bootstrap_url: nil
  become: true
  playbook: "./site.yml"

verifier:
  name: inspec

platforms:
- name: centos-7

suites:
- name: default
  verifier:
    inspec_tests:
    - test/integration/default
```

image_urnは、一旦ポータルからVMを作成し、そのARMテンプレートにおける以下から作成した

```json
                    "imageReference": {
                        "publisher": "RedHat",
                        "offer": "RHEL",
                        "sku": "7-RAW",
                        "version": "latest"
                    },
```

#kitchen test -d never

```

$ kitchen test -d never
-----> Starting Kitchen (v1.25.0)
WARN: Unresolved specs during Gem::Specification.reset:
      bundler (>= 1.10)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
-----> Cleaning up any prior instances of <default-centos-7>
-----> Destroying <default-centos-7>...
       Finished destroying <default-centos-7> (0m0.00s).
-----> Testing <default-centos-7>
-----> Creating <default-centos-7>...
       Creating Resource Group: kitchen-default-centos-7-20190728T165044
       Creating deployment: deploy-3ec6486f3533aeed
       Adding public key from /Users/foobar/.ssh/id_rsa.pub to the deployment.
       Resource Microsoft.Compute/virtualMachines 'node1' provisioning status is Running
       Resource Microsoft.Compute/virtualMachines 'node1' provisioning status is Running
       Resource Microsoft.Compute/virtualMachines 'node1' provisioning status is Running
       Resource Microsoft.Compute/virtualMachines 'node1' provisioning status is Running
       Resource Microsoft.Compute/virtualMachines 'node1' provisioning status is Running
       Resource Microsoft.Compute/virtualMachines 'node1' provisioning status is Running
       Resource Microsoft.Compute/virtualMachines 'node1' provisioning status is Running
       Resource Template deployment reached end state of 'Succeeded'.
       IP Address is: 13.73.17.184 [kitchen-3ec6486f3533aeed.japaneast.cloudapp.azure.com]
       Finished creating <default-centos-7> (1m38.85s).
-----> Converging <default-centos-7>...
       Preparing files for transfer
       *************** AnsiblePush install_command ***************
       Ansible push config validated
       Transferring files to <default-centos-7>
       *************** AnsiblePush run ***************

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [centos-7]

TASK [include_role : ../../kitchen-azurerm] ************************************************************************************

PLAY RECAP *********************************************************************************************************************
centos-7                : ok=1    changed=0    unreachable=0    failed=0   

       *************** AnsiblePush end run *******************
       Downloading files from <default-centos-7>
       Finished converging <default-centos-7> (0m9.81s).
-----> Setting up <default-centos-7>...
       Finished setting up <default-centos-7> (0m0.00s).
-----> Verifying <default-centos-7>...
       Loaded tests from {:path=>".Users.foobar.repo.repo-test.cookbooks.kitchen-azurerm.test.integration.default"} 

Profile: tests from {:path=>"/Users/foobar/repo/repo-test/cookbooks/kitchen-azurerm/test/integration/default"} (tests from {:path=>".Users.foobar.repo.repo-test.cookbooks.kitchen-azurerm.test.integration.default"})
Version: (not specified)
Target:  ssh://azure@13.73.17.184:22

  User root
     ↺  
  Port 80
     ↺  

Test Summary: 0 successful, 0 failures, 2 skipped
       Finished verifying <default-centos-7> (0m2.16s).
       Finished testing <default-centos-7> (1m50.84s).
-----> Kitchen is finished. (2m8.23s)



$ kitchen login 
WARN: Unresolved specs during Gem::Specification.reset:
      bundler (>= 1.10)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
Last login: Sun Jul 28 16:52:32 2019 from ne1477lan1.rev.em-net.ne.jp


[azure@node1 ~]$ id
uid=1000(azure) gid=1000(azure) groups=1000(azure) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023


[azure@node1 ~]$ sudo su -


[root@node1 ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.6 (Maipo)


[root@node1 ~]# logout


[azure@node1 ~]$ ログアウト
Connection to 13.73.17.184 closed.


$ kitchen list 
WARN: Unresolved specs during Gem::Specification.reset:
      bundler (>= 1.10)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
Instance             Driver   Provisioner  Verifier  Transport  Last Action  Last Error
default-centos-7  Azurerm  AnsiblePush  Inspec    Ssh        Verified     <None>


$ kitchen destroy
-----> Starting Kitchen (v1.25.0)
WARN: Unresolved specs during Gem::Specification.reset:
      bundler (>= 1.10)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
-----> Destroying <default-centos-7>...
       Azure environment: Azure
       Destroying Resource Group: kitchen-default-centos-7-20190728T165044
       Destroy operation accepted and will continue in the background.
       Finished destroying <default-centos-7> (0m3.70s).
-----> Kitchen is finished. (0m16.89s)
```