使用Molecule在Ansible中瞬间搭建本地测试环境
分子是什么意思?
-
- Ansibleのテスト環境の準備からテスト環境へのPlaybook実行、testinfraやinspec、Ansibleでのテスト実行、テスト環境の破棄を全てやってくれるテストフレームワーク。詳細は公式サイトにくわしい。
- 2020/2/21時点の最新はv3.1、サポートするAnsibleのバージョンは最新の2メジャーバージョン。(v2.9が最新の場合はv2.8まで)
前提条件 tí
-
- docker daemonが起動している。
moleculeはバージョン3.0.1を使用。
Ansibleはバージョン2.9.5を使用。
安装
用pip进行安装。
$ pip install 'molecule[docker]'
将测试场景添加到现有角色中
进入角色目录并执行。
$ cd roles/nginx
$ moleculer init scenario
moleculeディレクトリが作成される。
デフォルトのオプションは以下
シナリオ名: default
driver: docker
provisioner: Ansible
Verifier: Ansible
roles/nginx/molecule
└── default
├── converge.yml
├── INSTALL.rst
├── molecule.yml
└── verify.yml
进行考试
molecule testを実行するだけ。デフォルトではシナリオ名defaultが実行される。個別にシナリオ指定することも可能。
$ molecule test
test では以下全ての工程が実行される。
❯ molecule test --help
Usage: molecule test [OPTIONS]
Test (lint, cleanup, destroy, dependency, syntax, create, prepare,
converge, idempotence, side_effect, verify, cleanup, destroy).
今回作成したシナリオでは以下。
dockerイメージ取得
dockerコンテナ作成、起動
ansible-lintでPlaybookのチェック
playbook実行
ansibleでテスト実行
dockerコンテナ破棄
これらの工程を個別に指定して実行することも可能。
convergeではコンテナ作成、Playbook実行、テスト実行、コンテナ破棄までやってくれる。
$ molecule converge
如果只是在本地进行测试,以上内容就已经完成了。
小插曲
执行有依存关系的角色。
如果有依赖关系,例如在nginx角色上使用yum install,但在之前在common角色上使用yum的config配置,则仅执行nginx角色会出错。
可以将有依赖关系的操作写在prepare.yml中,以便提前执行。
- name: prepare.yml
hosts: all
tasks:
- name: "execute common role"
include_role:
name: "common"
跳过lint
在 molecule.yml 文件中添加选项
lint: |
yamllint .
ansible-lint -x 701,703
flake8
使用环境变量
可以像使用bash一样使用。可以使用${var:-hoge}或者${var%/}之类的(不知道名字)也是可用的。
platforms:
- name: instance
image: ${DOCKER_IMAGE:-registry.example.com:5000/centos:7}
我想在容器中启动systemd。
platforms:
# ~snip~
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
- /sys/fs/cgroup:/sys/fs/cgroup:ro
command: /sbin/init
capabilities:
- SYS_ADMIN
使用Ansible的host_vars和group_vars
provisioner:
# ~snip~
inventory:
links:
#hosts: ../../../inventory/hosts
group_vars: ../../../..//group_vars/
host_vars: ../../../../host_vars/
设立测试标志位
provisioner:
name: ansible
ansible_args:
- "-e molecule_test=true"
如果在playbook中加上when: not molecule_test,就可以跳过测试。
将 “verifier” 更改为 “testinfra”。
个人对使用Ansible来测试通过Ansible进行配置的服务器感到怀疑。在开发者之间似乎有相当多的讨论。
https://github.com/ansible-community/molecule/issues/2013
如果学习Testinfra和Inspec的成本不成问题的话,根据个人的意见,应该将测试工具分开。
verifier:
name: testinfra
分子.yml自定义实例
---
dependency:
name: galaxy
driver:
name: docker
lint: |
yamllint .
ansible-lint -x 701,703
flake8
platforms:
- name: instance
image: ${DOCKER_IMAGE:-registry.example.com:5000/centos:7}
pull: true
pre_build_image: true
privileged: true
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
- /sys/fs/cgroup:/sys/fs/cgroup:ro
command: /sbin/init
capabilities:
- SYS_ADMIN
provisioner:
name: ansible
ansible_args:
- "-e molecule_test=true"
inventory:
links:
#hosts: ../../../inventory/hosts
group_vars: ../../../..//group_vars/
host_vars: ../../../../host_vars/
verifier:
name: ansible