使用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

请看一下

广告
将在 10 秒后关闭
bannerAds