Moleculeに入門してみたよ(v3差分確認編)

# Molecule v3がリリースされました

- :congratulations: 2020/02/20 Molecule v3 リリース
    - https://github.com/ansible-community/molecule/releases/tag/3.0.0
- [この記事](https://qiita.com/answer_d/items/0119669f2e6151a86fc3)でMolecule v2に入門したが
    - バージョンアップでなんか色々と変わったのですごくざっくり差分を確認する

# 差分確認

[Changelog](https://molecule.readthedocs.io/en/latest/changelog.html#id2)  

重要っぽい変更点

- ドライバ:Azure, EC2, DigitalOcean, GCE, HetznerCloud, Linode, LXD, OpenStack, Vagrantが削除された
- goss verifierが削除された
- `playbook.yml` という名前は廃止して `converge.yml` へ
- デフォルトのverifierがAnsibleになった
- Testinfraはデフォルトでインストールされなくなった
- lintの設定がリファクタされた
- Dockerfileテンプレートがmolecule組み込みになった

# v2との差分チェック

## 作業環境

|品目|バージョン|
|:--|:--|
|OS|macOS Catalina 10.15.3|
|シェル|fish, version 3.1.0|
|Python|3.8.0|
|Ansible|2.9.5|
|Molecule|3.0.2|

## `molecule init`でロールの雛形を作成する

- ロール置き場を作って移動

```console
$ mkdir roles
$ cd roles
```

```console
$ molecule init role apache_vhost
--> Initializing new role apache_vhost...
Initialized role in /Users/answer_d/repos/molecule_test/roles/apache_vhost successfully.
$ cd apache_vhost
```

- こんなかんじのディレクトリが生成される

```console
apache_vhost/
├── .travis.yml
├── .yamllint
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── INSTALL.rst
│       ├── converge.yml
│       ├── molecule.yml
│       └── verify.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
```

- v2と違うポイント
    - Travis CI用のファイルが生成される？！
        - はえ〜、時代はCI/CD
    - lintはデフォルトで動作しないようになりました
        - 使用したければmolecule.ymlでlintをenableしましょう
    - README.mdが生成されてる
    - Dockerfile.j2無い
        - Dockerfileはv3からMolecule組み込みになったらしい
            - ソース上は[ここ](https://github.com/ansible-community/molecule/blob/76858f20cee3376fbeedb2e167d7f717a67c8b4e/molecule/data/Dockerfile.j2)
        - シナリオのディレクトリに `Dockerfile.j2` を用意するとそっちを見に行くっぽい

### molecule.yml

```yaml
---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: instance
    image: docker.io/pycontribs/centos:7
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible
```

- ちょっと変わってんね(lintが消えてるとか)

### converge.yml

```yaml
---
- name: Converge
  hosts: all
  tasks:
    - name: "Include apache_vhost"
      include_role:
        name: "apache_vhost"
```

- rolesモジュールじゃなくてinclude_roleを使うようになってる

## テスト実行してみる

```console
molecule test
```

```console
--> Test matrix
    
└── default
    ├── dependency
    ├── lint
    ├── cleanup
    ├── destroy
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    ├── cleanup
    └── destroy
```

- `lint` と `dependency` が入れ替わってる、他はv2と一緒
    - 実はChangelogに書いてあった

### lint

```console
--> Action: 'lint'
--> Lint is disabled.
```

- lintはデフォルトDisableに変更、Changelog通り

### これ以降の処理はv2から変わらん！

## ドライバがいろいろなくなったのどうするのか問題

- ec2ドライバ作ろうとしても、v2通りやろうとするとec2ドライバ無いよって怒られる

```console
$ molecule init scenario -d ec2
Usage: molecule init scenario [OPTIONS] [SCENARIO_NAME]
Try "molecule init scenario --help" for help.

Error: Invalid value for "--driver-name" / "-d": invalid choice: ec2. (choose from delegated, docker, podman)
```

- ec2ドライバをインストールする

```console
pip install molecule-ec2
```

- で再実行したらできた

```console
$ molecule init scenario -d ec2
--> Initializing new scenario default...
Initialized scenario in /Users/answer_d/mac_os_setup_playbook/molecule/default successfully.
```

- ちなみにドライバは絶賛開発中みたい(全然コミット無い)
    - <https://github.com/ansible-community/molecule-ec2>

- 他のドライバもあるのでインストールしたら使えると思う

```console
$ pip search molecule
molecule (3.0.2)                           - Molecule aids in the development and testing of Ansible roles
  INSTALLED: 3.0.2 (latest)
pytest-molecule (1.2.5)                    - PyTest Molecule Plugin :: discover and run molecule tests
molecule-containers (0.1.dev0)             - Molecule Containers Driver :: run molecule tests on containers
molecule-openstack (0.1)                   - Molecule OpenStack Plugin :: run molecule tests on openstack
molecule-libvirt (0.0.2)                   - libvirt Molecule Plugin :: run molecule tests on libvirt
molecule-digitalocean (0.1)                - digitalocean Molecule Plugin :: run molecule tests on digitalocean
molecule-azure (0.1)                       - Azure Molecule Plugin :: run molecule tests on Azure
molecule-vagrant (0.2)                     - Vagrant Molecule Plugin :: run molecule tests using Vagrant
molecule-inspec (1.0)                      - Inspec Molecule Plugin :: run molecule tests with inspec as verifier
molecule-goss (1.0)                        - Goss Molecule Plugin :: run molecule tests with Goss as verifier
molecule-gce (0.1)                         - Molecule GCE Plugin :: run molecule tests on Google Cloud Engine
molecule-ec2 (0.2)                         - EC2 Molecule Plugin :: run molecule tests using AWS EC2
```