ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

GitLab CI/CD 、tox、 Molecule でCisco ACIのAnsibleコードをテストする

ライター:坂田 玲子
ネットワンアカデミー講師として、約10年マルチベンダ環境における企業やサービスプロバイダのネットワーク構築・運用コース、RedHatコースを担当していたが、Ansibleを利用した自動で演習環境を提供するセルフラボを2016年に開発したことで、講師から自動化推進担当へ、現在はNetOneSystemsUSAで駐在員として日々奮闘中。
イラストが得意で、当社のキャラクター「コアルータン」をデザインした。
CCIE Routing and Switching
CCIE Service Provider

目次


 ネットワンでは公式GitLabを用意して、会社で生み出されたコードを蓄積しお客さまや業務改善に再利用する取り組みを行っています。 再利用できるコードは汎化され公式コードとして登録されています。 公式コードには、常に正しく動くことを保証するためテストコードも準備されており、安心してコードを利用できる状態にしています。
 このブログでは、Cisco ACIのアンダーレイのPhysical Domainを作成するRoleを例にとりテスト手法をご紹介していきます。テスト中心の内容となっておりRoleの中身については詳しくは紹介していません。

ディレクトリ構成

. 
├── defaults
│ └── main.yml
├── molecule
│ └── default
│ ├── cleanup.yml
│ ├── converge.yml
│ ├── inventory
│ │ └── hosts.yml
│ ├── molecule.yml
│ ├── pki
│ │ └── admin_ansible.key
│ └── verify.yml
├── README.md
├── requirements.txt
├── requirements.yml
├── tasks
│ ├── main.yml
│ ├── setup_access_port_policy_group.yml
│ ├── setup_aep_with_physical_domain.yml
│ ├── setup_interface_profile.yml
│ └── setup_switch_profile.yml
└── tox.ini

動作環境

Molecule 3.5.1

Tox 3.24.4

MoleculeでCisco ACIのRoleをテストする

 実際にAnsibleを使って自動化を進めていく場合、単一Playbookで作成していくと運用管理の煩雑化・肥大化や可読性が悪くなるため、Ansibleの実運用ではPlaybookを各々の役割に分割しRole化することがベストプラクティスとなっています。

 Ansible Role Test支援ツールのMoleculeを使うことで、テストを実行するための段取りとテストを効率よく実施することができます。

<テストの段取り>

1. テスト環境の構築

2. 設定投入

3. テスト実行

書き方の正しさテスト(統一された書き方か、構文エラーはないか)

動作の正しさテスト(Roleの実行、意図した通りに動作するか)

結果の正しさテスト(意図した通りの状態か、複数回実行しても同じ結果か)

4.テスト環境のクリーンアップ

 ではインストールしていきます。ここでは、Moleculeの後に紹介するAnsibleの複数のバージョンをテストするためのtox、書き方の正しさをテストするlintACIへの接続に必要なPython Packages(pyopensslなど)も合わせてインストールするためのファイルを用意してインストールしておきます。

requirements.txt

molecule[lint]
ansible-lint
ansible
pyopenssl
tox

インストール

pip install -r requirements.txt

テストで必要なファイルを自動生成するために、Roleに以下のコマンドを実行します。

molecule init scenario -r [role名]
コマンドを実行すると、moleculeディレクトリの配下に今回利用するファイルが以下の通り作成されますので、修正して利用します。
・molecule.yml : moleculeの設定ファイルです。
・converge.yml : テストで実行されるPlaybookです。
・verify.yml : converge.ymlを実行した後に意図した通りの結果になっているか確認する時に実行されるPlaybookです。
・cleanup.yml: converge.ymlを実行した後に設定を削除するPlaybookです。

molecule.yml

---
dependency:
  name: galaxy
  options:
    requirements-file: requirements.yml
lint: |
  set -e
  ansible-lint -vv .
driver:
  name: delegated
platforms:
  - name: apic1
provisioner:
  name: ansible
  inventory:
    links:
      hosts: "./inventory/hosts.yml"
verifier:
  name: ansible

定義名

説明

dependency

Roleをテストする時にRoleを実行する時の依存関係を処理します。本Roleでは cisco.aci コレクションが含まれるrequirements.ymlをインストールします。

lint

lintテストで使用するコマンド(ツール)を指定します。

driver

テスト用の環境を構築するドライバを指定します

コンテナを利用する場合は、docker等を指定しますが、本Roleでは外部に用意されているテスト環境を使う(ACI環境)ため、delegatedを指定します。

platforms

テスト用の環境の設定をします。

provisioner

環境のプロビジョニング処理をします。

ACIに接続するインベントリ情報をhosts.ymlに記載します。

verifier

Roleを実行した後に意図した結果となっているかを確認する処理をします。

converge.yml

---
- name: Converge
  hosts: all
  connection: local
  gather_facts: no
  tasks:
    - name: Include setup_access_policy_with_physical_domain
      include_role:
        name: setup_access_policy_with_phisical_domain

requirements.yml

---
collections:
  - cisco.aci

hosts.yml

all:
  children:
    apic:
      hosts:
        apic1:
          ansible_host: 10.xx.xx.xx

 verify.yml では、特定の設定が正しく入っているかクエリを使い確認しています。

 Roleディレクトリ配下で、molecule test コマンドを実行し正しくテストが通ることを確認してください。

 ここまでで、書き方の正しさテスト、動作の正しさテスト、結果の正しさテストを確認できました。ここからは複数のAnsibleバージョンでも同じ動作が可能かをテストしていきます。

toxCisco ACIMolecule Roleをテストする

 toxPython コードの virtualenv 管理・テスト支援ツールです。 tox は設定ファイル (tox.ini)に従い複数の異なる Python Library 環境 (virtualenv 環境) の作成〜環境内へのパッケージインストール〜環境内でのテスト実行を自動的に行うことが可能です。

 本Roleでは、ptyhon36の環境に、Ansible2.92.10の両方のバージョンでテストを実施しています。

tox.ini

[tox]
envlist = py{36}-ansible{209,210}
    # py36, py37, py38
skipsdist = true
[testenv]
deps =
    -r {toxinidir}/requirements.txt
    ansible209: ansible==2.9.21rc1
    ansible210: ansible==2.10.6
setenv =
    PATH = {toxworkdir}/bin{:}{env:PATH}
commands =
    molecule test

toxのグローバル設定を行う[tox]セクションと、テスト環境の設定を行う[testenv]セクションの2つのセクションを定義しています。

セクション

定義名

説明

tox

envlist

テストする環境をリスト

testenv

deps

テスト実行前にインストールしておきたい依存関係のPythonパッケージ

 

commands

テストとして実行するコマンド

 Roleディレクトリ配下で、toxコマンドを実行し正しくテストが通ることを確認してください。

GitLab CI/CDtoxをテストする

 最後にGitLab上でtoxを実行します。コード変更があった場合にそのコードが正しいかどうかを常にテストできるようにしておきます。

 GitLab において CI/CD を実現するには GitLab Runner と呼ばれるエージェントプログラムを準備する必要があります。CI/CD の処理においては GitLab Runner は定期的に GitLab Server に問い合わせを実施し必要に応じ対象コードの Fetch, 定義されたジョブの実行を行いその実行結果を GitLab Server に返すことでユーザーは GitLab Server の提供する Web UI 上でジョブの実行状態や結果を確認することができます。

 GitLab ではデフォルトで .gitlab-ci.yml と呼ばれる YAML ファイルにパイプラインの処理内容を記述、リポジトリ内に配置することで自動的に Runner によるジョブ処理が実行されます。

gitlab-ci.yml

---
image: test/ci_demo:latest
stages:
  - phisical_domain
lint_role_verify:
  tags:
    - molecule
  stage: phisical_domain
  before_script:
    - pip install tox
  script:
    - echo "$ACI_ACCESS_KEY" > molecule/default/pki/admin_ansible.key
    - tox
  allow_failure: false

定義名

説明

image

パイプライン全体でジョブ実行を行うコンテナイメージ

stages

ジョブ実行の順番や依存関係を定義する ステージ を定義しています。

lint_role_verify

Job定義)

lint_role_verifyでは実際に実行するジョブを定義しています。lint_role_verifyという名称は任意のジョブ名を指定することが可能です。

stage

対象ジョブのステージを定義しています。複数のジョブで同一のステージを指定した場合それらのジョブが平行実行されます。

before_script

コードをfetchしてくる前に実行したい処理を記載します。

script

実際の処理の内容を記述します。本Roleではtoxの実行と、ACIにアクセスするための秘密鍵の呼び出しと書き込みを行っています。公式化された不特定多数がアクセスするGitlab上に鍵を公開することはできないため、GitLabでは事前に環境変数として秘密鍵を登録しておきCI/CD実行時に呼び出すことができます。

実行結果ログ

テストパスしたRoleの表示

 テストパスした結果はRoleのプロジェクトページのホーム(赤部分)に表示され、コードを使ってみようと考える人は安心して使う事ができるようになっています。

まとめ

 ご紹介したとおりネットワンでは、AnsibleRolemoleculeでテスト後、toxで複数バージョンのAnsibleをテストし、最終的にGitLab上でコード変更があった場合に即座にテストできるようにしています。

 こうして安心していつでも使える公式化コードを増やし、IaCを加速させていきます。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND