Ansible Playbook検証環境構築 (2019版)


#2019版

#要件
Ansibleの開発環境をできるだけ簡単に構築する。
(MAC環境を想定)

Windows10の場合、Windows Subsystem for Linux上でLinuxベースの導入を行えば動作する様です。


なお、Ansible controllerもDockerコンテナにした版も記述しました。
[Ansible Playbook検証環境構築2 (2019版)](https://qiita.com/hiroyuki_onodera/items/e915c873340cf059dae0)

#ソリューション

##環境制御にはKitchenCIを使用

KitchenCIは、一連の流れとして以下を行うCIツール。

1. 検証環境としてVirtualBox上VMやDockerコンテナを立ち上げる
2. 立ち上げた環境にChefやAnsibleなどの構成管理ツールを適用
3. 立ち上げた環境に対してテストを実行(オプション)
4. 立ち上げた環境を削除(オプション) 

参照:
- [Welcome to Kitchen - KitchenCI](https://kitchen.ci)

導入設定は、前提となるRubyなどを含め、Chef Workstationのインストールで対応。

##Ansibleはローカルに導入

立ち上げるテスト環境だけでなく、外部のノードも同じAnsibleで管理出来るようにする。

##テスト環境としてのVirtualBox上VMとDockerコンテナの比較


- VirtualBox上VM

起動は数分程度
ほぼ全てのOS機能が使用可能

- Dockerコンテナ

イメージがキャッシュされていれば起動は数十秒程度
一部OS関連の機能は検証不可



#環境
- macOS 10.14.5


#環境構築


##Ansible導入
Homebrewを導入
[Mac の開発を便利にするパッケージ管理ソフト Homebrew のインストール手順](https://weblabo.oscasierra.net/homebrew-1/)

その後

```bash
$ brew install ansible

...
```
ローカル環境で動作するので、~/.ansible.cfgなどでAnsibleのパラメーター指定が可能。


##VirtualBox導入(オプション)

Dockerを使用する場合には不要

以下から Mac用の導入イメージをダウンロードし実行


- Virtualbox: https://www.virtualbox.org/wiki/Downloads
- Vagrant: https://www.vagrantup.com/downloads.html
    - VirtualBox管理用




##Docker Desktop for Mac導入(オプション)

VirtualBoxを使用する場合には不要

以下から Mac用の導入イメージをダウンロードし実行

- [Docker Desktop for Mac and Windows | Docker](https://www.docker.com/products/docker-desktop)

手順:

- [https://morikiyo.work/2019/05/05/docker-desktop-for-mac-をダウンロードする/](https://morikiyo.work/2019/05/05/docker-desktop-for-mac-をダウンロードする/)




##Chef Workstation導入/設定

以下から Mac用の導入イメージをダウンロードし実行

https://downloads.chef.io/chef-workstation/

導入手順:

- [Installing, Upgrading and Removing](https://www.chef.sh/docs/chef-workstation/install/)

設定手順:

~/.bash_profile に環境変数設定のエントリーを追記し反映

- [Configuring the ChefDK](https://docs.chef.io/chefdk_setup.html)

```bash
$ echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
$ . ~/.bash_profile
```





##KitchenCIプラグイン導入




###Ansible対応

- kitchen-ansiblepushプラグイン
 - ローカルのAnsibleをそのまま使用する

他に、今回は使用しないが、対象ホストにAnsibleを導入し、playbookなどを送り込んでローカルモードで適用する、kitchen-ansibleプラグインがある。

参照: 
- [kitchen-ansiblepushを利用したAnsible roleのテスト環境構築](https://dev.classmethod.jp/server-side/ansible/kitchen-ansiblepush/)


```

$ gem install kitchen-ansiblepush
...
```


###Docker対応(オプション)


- kitchen-dockerプラグイン

virtualboxを使用する場合には不要



```
$ gem install kitchen-docker # オプション
...
```


##Playbookディレクトリー構成作成

```
$ mkdir playbooks1
$ cd playbooks1
$ mkdir roles host_vars group_vars vars
```





##テンプレートkitchen.yml作成 (以降の例は基本的にDockerとする)

KitchenCIの設定ファイルは、 .kitchen.yml もしくは kitchen.yml
テンプレートとなるファイルを作成後、必要な修正、追記を行う。

```
$ kitchen init --driver=kitchen-docker --provisioner=ansible_push
      create  kitchen.yml
      create  chefignore
      create  test/integration/default
```
なお、単にkitchen.ymlのテンプレートを作成しているだけであり、直接、最終形のkitchen.ymlを配置しても良い。



##テンプレートとして作成されたkitchen.yml (Dockerの例)
```yaml:kitchen.yml(編集前)
---
driver:
  name: docker

provisioner:
  name: ansible_push

platforms:
  - name: ubuntu-16.04
  - name: centos-7

suites:
  - name: default
    run_list:
    attributes:
```

#設定

##編集後kitchen.yml
```yaml:kitchen.yml(編集後)
---
driver:
  name: docker
  #name: vagrant                   # VirtualBoxを使用する場合     

provisioner:
  name: ansible_push
  chef_bootstrap_url: false        # Chefクライアントを導入しない
  playbook: ./site.yml             # playbook指定
  #mygroup: group1                 # 対象ノードが属するグループ

verifier:                          # inspecによるテスト(オプション)
  name: inspec                      
  inspec_tests:
    - test/integration/default     # inspecテストのディレクトリー

platforms:
  #- name: ubuntu-16.04             # 使用しない環境ならコメントアウト
  - name: centos-7

suites:
  - name: default
    run_list:
    attributes:
```
- [github: kitchen-docker](https://github.com/test-kitchen/kitchen-docker)
Docker関連のパラメーター指定が必要な場合、README.md を参照して kitchen.ymlに設定を追記

- [github: kitchen-ansiblepush](https://github.com/ahelal/kitchen-ansiblepush)
Ansible関連のtagやgroup指定などが必要な場合、README.md を参照して kitchen.ymlに設定を追記

##playbook本体例

treeコマンドを導入してみる

```yaml:site.yml
---
- hosts: all
  #gather_facts: false
  become: true
  #vars:
  #vars_files:
  tasks:
    - name: install tree command
      package:
        name: tree
```
##InSpecテスト例(オプション)
```ruby:test/integration/default/default_test.rb
# encoding: utf-8

describe package('tree') do
  it { should be_installed }
end
```


#環境の作成、Ansibleによる収束、InSpecによるテスト
```
$ kitchen test -d never
-----> Starting Kitchen (v1.25.0)
-----> 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>...
       Sending build context to Docker daemon  37.89kB
       Step 1/17 : FROM centos:centos7
        ---> 1e1148e4cc2c
       Step 2/17 : ENV container docker
        ---> Using cache
        ---> d69647403b44
       Step 3/17 : RUN yum clean all
        ---> Using cache
        ---> 68405856fe30
       Step 4/17 : RUN yum install -y sudo openssh-server openssh-clients which curl
        ---> Using cache
        ---> 797f42008c72
       Step 5/17 : RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
        ---> Using cache
        ---> a6036be76703
       Step 6/17 : RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
        ---> Using cache
        ---> ece9cbc7b147
       Step 7/17 : RUN if ! getent passwd kitchen; then                 useradd -d /home/kitchen -m -s /bin/bash -p '*' kitchen;               fi
        ---> Using cache
        ---> d7206367b91e
       Step 8/17 : RUN echo "kitchen ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
        ---> Using cache
        ---> d975788e9185
       Step 9/17 : RUN echo "Defaults !requiretty" >> /etc/sudoers
        ---> Using cache
        ---> 59846ab4db2d
       Step 10/17 : RUN mkdir -p /home/kitchen/.ssh
        ---> Using cache
        ---> 120caf615677
       Step 11/17 : RUN chown -R kitchen /home/kitchen/.ssh
        ---> Using cache
        ---> 5b08f6495d65
       Step 12/17 : RUN chmod 0700 /home/kitchen/.ssh
        ---> Using cache
        ---> 3e2097cabd1e
       Step 13/17 : RUN touch /home/kitchen/.ssh/authorized_keys
        ---> Using cache
        ---> 28b369378683
       Step 14/17 : RUN chown kitchen /home/kitchen/.ssh/authorized_keys
        ---> Using cache
        ---> 0dbcdafd6765
       Step 15/17 : RUN chmod 0600 /home/kitchen/.ssh/authorized_keys
        ---> Using cache
        ---> 83be9ea85caa
       Step 16/17 : RUN mkdir -p /run/sshd
        ---> Using cache
        ---> d9c48bb3b097
       Step 17/17 : RUN echo ssh-rsa\ AAAAB3NzaC1yc2EAAAADAQABAAABAQDOpdM/v1dEnD/MBUqcD0\+iYBf28B0S5AhA4weEe5hsc4uVIZgGoSEPV7qiceNiZhBMl7oKK1q6boV8wMiMJEyFXAKSAhrMIdUwgc1rL/Z6KP/WqeE1UWRNABR4SvOiQQ3ClpSkhOr8MXlPJ8\+FBVrAMuoyhiERT/epCnINlxN7LL23twUocYjszeDRTzHfdWeDNzQ8ppCNmhb3MiWS0k3LODfMuisA0XsMlm/y7Owd4V8D5/4IcdhhMGLfCRHx3dqkmVbfayPUJeFNSIWbW0ftlCCDJX9muASGuUn32z3ZP4rSNFzEtTa7JwJnxaEJKe\+XPpkqvn0rRR7m1JHM80MJ\ kitchen_docker_key >> /home/kitchen/.ssh/authorized_keys
        ---> Using cache
        ---> ca9f41e1e1ac
       Successfully built ca9f41e1e1ac
       565aaea2bb356eb108f806e0b54c039a077808624e58c3c6272093dbb8aa9764
       0.0.0.0:32777
       [SSH] Established
       Finished creating <default-centos-7> (0m1.77s).
-----> 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 [install tree command] ****************************************************************************************************
changed: [centos-7]

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

       *************** AnsiblePush end run *******************
       Downloading files from <default-centos-7>
       Finished converging <default-centos-7> (0m14.34s).
-----> Setting up <default-centos-7>...
       Finished setting up <default-centos-7> (0m0.00s).
-----> Verifying <default-centos-7>...
       Loaded tests from {:path=>".Users.xxxx.yyyy.zzzz.playbooks1.test.integration.default"} 

Profile: tests from {:path=>"/Users/xxxx/yyyy/zzzz/playbooks1/test/integration/default"} (tests from {:path=>".Users.xxxx.yyyy.zzzz.playbooks1.test.integration.default"})
Version: (not specified)
Target:  ssh://kitchen@localhost:32777

  System Package tree
     ✔  should be installed

Test Summary: 1 successful, 0 failures, 0 skipped
       Finished verifying <default-centos-7> (0m0.65s).
       Finished testing <default-centos-7> (0m16.78s).
-----> Kitchen is finished. (0m23.23s)
```

##作成された環境の状態

```
$ kitchen list 
Instance          Driver  Provisioner  Verifier  Transport  Last Action  Last Error
default-centos-7  Docker  AnsiblePush  Inspec    Ssh        Verified     <None>
```
##作成された環境へのログイン

```
$ kitchen login 
Last login: Thu Jun  6 06:04:16 2019 from 172.17.0.1
[kitchen@565aaea2bb35 ~]$ which tree
/usr/bin/tree
[kitchen@565aaea2bb35 ~]$ id
uid=1000(kitchen) gid=1000(kitchen) groups=1000(kitchen)
[kitchen@565aaea2bb35 ~]$ sudo su -
[root@565aaea2bb35 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@565aaea2bb35 ~]# logout
[kitchen@565aaea2bb35 ~]$ logout
Connection to localhost closed.
```


##Ansibleの再適用

適用時にエラーだった場合など、playbookを修正して再適用が可能。

```
$ kitchen converge
-----> Starting Kitchen (v1.25.0)
-----> 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 [install tree command] ****************************************************************************************************
ok: [centos-7]

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> (0m7.54s).
-----> Kitchen is finished. (0m14.35s)

```

##検証の再実行
```
$ kitchen verify
-----> Starting Kitchen (v1.25.0)
-----> Setting up <default-centos-7>...
       Finished setting up <default-centos-7> (0m0.00s).
-----> Verifying <default-centos-7>...
       Loaded tests from {:path=>".Users.aa220269.repo.repo-test.cookbooks.playbooks1.test.integration.default"} 

Profile: tests from {:path=>"/Users/aa220269/repo/repo-test/cookbooks/playbooks1/test/integration/default"} (tests from {:path=>".Users.aa220269.repo.repo-test.cookbooks.playbooks1.test.integration.default"})
Version: (not specified)
Target:  ssh://kitchen@localhost:32778

  System Package tree
     ✔  should be installed

Test Summary: 1 successful, 0 failures, 0 skipped
       Finished verifying <default-centos-7> (0m0.54s).
-----> Kitchen is finished. (0m6.49s)

```


##環境の消去

```
$ kitchen destroy
-----> Starting Kitchen (v1.25.0)
-----> Destroying <default-centos-7>...
       PID                 USER                TIME                COMMAND
       37236               root                0:00                /usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o PasswordAuthentication=yes -o UsePrivilegeSeparation=no -o PidFile=/tmp/sshd.pid
       565aaea2bb356eb108f806e0b54c039a077808624e58c3c6272093dbb8aa9764
       565aaea2bb356eb108f806e0b54c039a077808624e58c3c6272093dbb8aa9764
       Finished destroying <default-centos-7> (0m1.01s).
-----> Kitchen is finished. (0m7.27s)
```

なお、その他の環境消去方法としては、kitchen test -d never時に、-d neverをつけなければ、毎回環境の削除まで行われる。



##環境消去の確認
```

$ kitchen list 
Instance          Driver  Provisioner  Verifier  Transport  Last Action    Last Error
default-centos-7  Docker  AnsiblePush  Inspec    Ssh        <Not Created>  <None>
```



#ansiblepush使用における考慮点


- テスト環境ホストを持つインベントリーが自動的に作成され使用される
- グループを指定するには、kitchen.ymlにその設定を記載する。
    - mygroup: などを利用
- host変数やgroup変数は、インベントリー以外に記載。
    - ./host_vars/\<hostname>.yml
    - ./group_vars/\<groupname>.yml
    - ./vars/<...>.yml

#他ノードにansible-playbookにて反映させる例

```
$ ansible-playbook -i targethostname, site.yml
```
targethostnameの後に,が必要であることに注意。




#Chef Cookbookの開発

Chef Cookbookの開発も可能な状態となっているので、簡単に手順を記す。

##cookbook雛形作成

book1という名前でcookbookを作成する

```
$ chef generate cookbook book1 
Generating cookbook book1
- Ensuring correct cookbook file content
- Committing cookbook files to git
- Ensuring delivery configuration
- Ensuring correct delivery build cookbook content
- Adding delivery configuration to feature branch
- Adding build cookbook to feature branch
- Merging delivery content feature branch to master

Your cookbook is ready. Type `cd book1` to enter it.

There are several commands you can run to get started locally developing and testing your cookbook.
Type `delivery local --help` to see a full list.

Why not start by writing a test? Tests for the default recipe are stored at:

test/integration/default/default_test.rb

If you'd prefer to dive right in, the default recipe can be found at:

recipes/default.rb

$ cd book1
```


作成される.kitchen.yml


```
$ cat .kitchen.yml
---
driver:
  name: vagrant

provisioner:
  name: chef_zero
  # You may wish to disable always updating cookbooks in CI or other testing environments.
  # For example:
  #   always_update_cookbooks: <%= !ENV['CI'] %>
  always_update_cookbooks: true

verifier:
  name: inspec

platforms:
  - name: ubuntu-16.04
  - name: centos-7

suites:
  - name: default
    run_list:
      - recipe[book1::default]
    verifier:
      inspec_tests:
        - test/integration/default
    attributes:
```

この場合、kitchen test -d neverにて、以下が実行される

1. virtualBoxでVMが起動
2. VMにrecipes/default.rbレシピが適用される
3. VMにInSpecのtest/integration/default/default_test.rbテストが適用される(内容はサンプル)
4. 環境は削除されない(-d neverオプションの為)

##.kitchen.ymlの編集

必要に応じて.kitchen.ymlを編集

- Dockerを使用するには、driver: の name: vagrant を name: docker に変更 
- ubuntuをコメントアウト

など


##レシピの編集

たとえばtreeコマンドの導入をさせてみる。

```
$ echo 'package "tree"' >> recipes/default.rb
```


##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>...
       PID                 USER                TIME                COMMAND
       89060               root                0:00                /usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o PasswordAuthentication=yes -o UsePrivilegeSeparation=no -o PidFile=/tmp/sshd.pid
       7144930dec9511cbaba8011382668df2904e47fd2936dfb923715274a0a13e7f
       7144930dec9511cbaba8011382668df2904e47fd2936dfb923715274a0a13e7f
       Finished destroying <default-centos-7> (0m1.82s).
-----> Testing <default-centos-7>
-----> Creating <default-centos-7>...
       Sending build context to Docker daemon  206.8kB
       Step 1/17 : FROM centos:centos7
        ---> 1e1148e4cc2c
       Step 2/17 : ENV container docker
        ---> Using cache
        ---> d69647403b44
       Step 3/17 : RUN yum clean all
        ---> Using cache
        ---> 68405856fe30
       Step 4/17 : RUN yum install -y sudo openssh-server openssh-clients which curl
        ---> Using cache
        ---> 797f42008c72
       Step 5/17 : RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
        ---> Using cache
        ---> a6036be76703
       Step 6/17 : RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
        ---> Using cache
        ---> ece9cbc7b147
       Step 7/17 : RUN if ! getent passwd kitchen; then                 useradd -d /home/kitchen -m -s /bin/bash -p '*' kitchen;               fi
        ---> Using cache
        ---> d7206367b91e
       Step 8/17 : RUN echo "kitchen ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
        ---> Using cache
        ---> d975788e9185
       Step 9/17 : RUN echo "Defaults !requiretty" >> /etc/sudoers
        ---> Using cache
        ---> 59846ab4db2d
       Step 10/17 : RUN mkdir -p /home/kitchen/.ssh
        ---> Using cache
        ---> 120caf615677
       Step 11/17 : RUN chown -R kitchen /home/kitchen/.ssh
        ---> Using cache
        ---> 5b08f6495d65
       Step 12/17 : RUN chmod 0700 /home/kitchen/.ssh
        ---> Using cache
        ---> 3e2097cabd1e
       Step 13/17 : RUN touch /home/kitchen/.ssh/authorized_keys
        ---> Using cache
        ---> 28b369378683
       Step 14/17 : RUN chown kitchen /home/kitchen/.ssh/authorized_keys
        ---> Using cache
        ---> 0dbcdafd6765
       Step 15/17 : RUN chmod 0600 /home/kitchen/.ssh/authorized_keys
        ---> Using cache
        ---> 83be9ea85caa
       Step 16/17 : RUN mkdir -p /run/sshd
        ---> Using cache
        ---> d9c48bb3b097
       Step 17/17 : RUN echo ssh-rsa\ AAAAB3NzaC1yc2EAAAADAQABAAABAQDCK2s5z4v1EfZ689ISCSftYi4jJBvq32wWmuLHTjpyT5acL\+0b/1v2PLjjj7dTiceNRohNTwXsgMWa6I5qw6MDQR28USOSUmIHMYX\+DZzbtxI0\+BwLFuiOJAvXTzX6jaNXeuepPceUDXzcyLBhsaXVu51I/OrT/iq0gtYZw5O2syMpzdG8k\+nH4/J2mLCEzz2B9C4brhmgWNnpEYbzS\+3G8/7/HQhpbLohvwEZ2XDXQGf50AkAQZe7EYwB35WNAHgLvGfBeISZd\+5XuP6WwMyAk6hPOdbolcip6A0ZYfWgE851syIKV6sQTZ/2DD2/Gr8E7FrvcFCZ3KCbvqOPlkdT\ kitchen_docker_key >> /home/kitchen/.ssh/authorized_keys
        ---> Using cache
        ---> 2764f90516e7
       Successfully built 2764f90516e7
       ddeff25e32cabb62f4eef738102e18cd8f5ccdb15a7707582056296e52e01783
       0.0.0.0:32782
       [SSH] Established
       Finished creating <default-centos-7> (0m1.97s).
-----> Converging <default-centos-7>...
       Preparing files for transfer
       Preparing dna.json
       Resolving cookbook dependencies with Berkshelf 7.0.8...
       Removing non-cookbook files before transfer
       Preparing validation.pem
       Preparing client.rb
-----> Installing Chef install only if missing package
       Downloading https://omnitruck.chef.io/install.sh to file /tmp/install.sh
       Trying curl...
       Download complete.
       el 7 x86_64
       Getting information for chef stable  for el...
       downloading https://omnitruck.chef.io/stable/chef/metadata?v=&p=el&pv=7&m=x86_64
         to file /tmp/install.sh.43/metadata.txt
       trying curl...
       sha1	bcb835748819813842b664d7bdb1cf509eb71c09
       sha256	85365d0a4c68a3445743d18e70055d762648bf673fc95f1e0e17194701f64d5f
       url	https://packages.chef.io/files/stable/chef/15.0.300/el/7/chef-15.0.300-1.el7.x86_64.rpm
       version	15.0.300
       downloaded metadata file looks valid...
       downloading https://packages.chef.io/files/stable/chef/15.0.300/el/7/chef-15.0.300-1.el7.x86_64.rpm
         to file /tmp/install.sh.43/chef-15.0.300-1.el7.x86_64.rpm
       trying curl...
       Comparing checksum with sha256sum...
       
       WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
       
       You are installing an omnibus package without a version pin.  If you are installing
       on production servers via an automated process this is DANGEROUS and you will
       be upgraded without warning on new releases, even to new major releases.
       Letting the version float is only appropriate in desktop, test, development or
       CI/CD environments.
       
       WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
       
       Installing chef 
       installing with rpm...
       warning: /tmp/install.sh.43/chef-15.0.300-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
       Preparing...                          ################################# [100%]
       Updating / installing...
          1:chef-15.0.300-1.el7              ################################# [100%]
       Thank you for installing Chef Infra Client! For help getting started visit https://learn.chef.io
       Transferring files to <default-centos-7>
       +---------------------------------------------+
       ✔ 2 product licenses accepted.
       +---------------------------------------------+
       Starting Chef Infra Client, version 15.0.300
       [2019-06-07T01:57:09+00:00] WARN: Plugin Network: unable to detect ipaddress
       Creating a new client identity for default-centos-7 using the validator key.
       resolving cookbooks for run list: ["book1::default"]
       Synchronizing Cookbooks:
         - book1 (0.1.0)
       Installing Cookbook Gems:
       Compiling Cookbooks...
       Converging 1 resources
       Recipe: book1::default
         * yum_package[tree] action install
           - install version 0:1.6.0-10.el7.x86_64 of package tree
       
       Running handlers:
       Running handlers complete
       Chef Infra Client finished, 1/1 resources updated in 16 seconds
       Downloading files from <default-centos-7>
       Finished converging <default-centos-7> (1m13.92s).
-----> Setting up <default-centos-7>...
       Finished setting up <default-centos-7> (0m0.00s).
-----> Verifying <default-centos-7>...
       Loaded tests from {:path=>".Users.xxxx.yyyy.zzzz.book1.test.integration.default"} 

Profile: tests from {:path=>"/Users/xxxx/yyyy/zzzz/book1/test/integration/default"} (tests from {:path=>".Users.xxxx.yyyy.zzzz.book1.test.integration.default"})
Version: (not specified)
Target:  ssh://kitchen@localhost:32782

  User root
     ↺  
  Port 80
     ↺  

Test Summary: 0 successful, 0 failures, 2 skipped
       Finished verifying <default-centos-7> (0m0.87s).
       Finished testing <default-centos-7> (1m18.61s).
-----> Kitchen is finished. (1m26.88s)
```