ライトウェルブログ

2021/06/10インフラCI/CDを学ぶ-molecule編

こんにちは、ライトウェルAnsibleチームの増田です。

今回のブログはインフラCI/CDのmolecule編になります!
moleculeと連携することで、Roleの開発支援とテストを自動化することができるようになります✨

検証に使用するツールの説明や検証環境の概要については、前回のブログをご確認ください。

 

<今回の検証内容イメージ>

  1. GitLabにプロジェクト(apache_install)を作成する
  2. 作成したプロジェクトとGitLab Runnerを連携させる
  3. GitLabRunnerサーバにmolecule及びDockerをインストールする
  4. apache_installのrole作成
  5. .gitlab-ci.ymlの作成
  6. molecule関連ファイル及び.gitlab-ci.ymlをプロジェクトにプッシュする
  7. CI/CDのジョブを確認してみる

 

検証スタート

1.GitLabにプロジェクト(apache_install)を作成する

  • プロジェクトの手順は前回のブログと変わりなし。
  • GitLabにログイン>Projects>New projectをクリックし、「apache_install」を作成する。

 

2.作成したプロジェクトとGitLab Runnerを連携させる

  • 前回のブログと同じ手順でプロジェクト(apache_install)とGitLab Runnerを連携させる。
  • Projects>Runnerを登録したプロジェクトを選択>Setting>CI/CD>RunnersでGitLabRunnerが登録されていることを確認する。

 

3.GitLabRunnerサーバにmolecule及びDockerをインストールする

  • GitLab Runnerサーバに下記のコマンドを実行しmoleculeをインストールする。
pip3 install molecule
  • Docker上のコンテナを使用してroleテストを行いたいため、Dockerをインストールしていく。
    はじめに、古いバージョンのDockerがインストール済みの場合は、
    関連するパッケージと一緒にアンインストールする。
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  • 今回はリポジトリを使用してDockerインストールするため、リポジトリの設定を行う。
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • DockerEngineをインストールする
yum install docker-ce docker-ce-cli containerd.io
  • Dockerを起動する。合わせて、自動起動の設定を行う。
systemctl start docker
systemctl enable docker
  • Proxy環境下の場合、DockerのProxy設定を行う。
    Docker クライアント上において、コンテナーを起動するユーザーのホームディレクトリ内に~/.docker/config.jsonを作成、または編集し下記のようにProxy情報を記載する。
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://<Proxyサーバアドレス>:<ポート>",
     "httpsProxy": "http://<Proxyサーバアドレス>:<ポート>",
     "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8" #Proxyを介したくないホストがある場合に、カンマ区切りで情報を記載する
   }
 }
}
  • CentOS8のイメージを取得する。
[root@localhost ~]# docker run -it -d --name centos8 centos:centos8 #コンテナに「centos8」という名前をつけてCentOS8のイメージを作成する
d9900580f02a1686bc0747b2eca379f4198a713705dc2ce5d17d5d257b2c78cd
[root@localhost ~]# docker ps #コンテナ(centos8)が作成され起動していることを確認
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
d9900580f02a        centos:centos8          "/bin/bash"         22 seconds ago      Up 21 seconds                           centos8
[root@localhost ~]# docker exec -it centos8 bash #centos8に入る
[root@d9900580f02a /]# cat /etc/redhat-release #OSバージョンの確認
CentOS Linux release 8.3.2011
[root@d9900580f02a /]# exit #centos8から抜ける
exit
[root@localhost ~]# docker stop centos8 #コンテナ(centos8)を停止する
centos8
  • molecule-dockerドライバーをインストールする
pip3 install molecule-docker

 

4.apache_installのrole作成

  • 作業用ディレクトリに移動し、下記コマンドを実行してroleの雛形を作成する。
molecule init role <role名>

role名=GitLabに作成したプロジェクト名となるように、今回は下記のように実行した。

[root@localhost masuda]# molecule init role  apache_install
INFO     Initializing new role apache_install...
No config file found; using defaults
- Role apache_install was created successfully
INFO     Initialized role in /home/masuda/apache_install successfully.
  • 作成したrole配下には以下のようなディレクトリやファイルが作成される。
[root@localhost  apache_install_02]# tree --charset=C
.
|-- README.md
|-- defaults
|   `-- main.yml
|-- files
|-- handlers
|   `-- main.yml
|-- meta
|   `-- main.yml
|-- molecule
|   `-- default
|       |-- INSTALL.rst
|       |-- converge.yml
|       |-- create.yml
|       |-- destroy.yml
|       |-- molecule.yml
|       `-- verify.yml
|-- tasks
|   `-- main.yml
|-- templates
|-- tests
|   |-- inventory
|   `-- test.yml
`-- vars
    `-- main.yml
  • molecule/default/molecule.ymlを編集する。
    <8行目>:DockerでCentOS8のイメージを使うように指定。
    <15行目>:verifier(テスト)はansibleを使うように指定。
---
dependency:
  name: galaxy
driver:
  name: docker
platforms:
  - name: instance
    image: centos:8
    command: /sbin/init
    privileged: true
provisioner:
  name: ansible
  lint: ansible-lint
verifier:
  name: ansible
  lint: flake8
  • テストコード作成のためmolecule/default/verify.ymlを編集する。
---
# This is an example playbook to execute Ansible tests.

- name: Verify
  hosts: all
  gather_facts: false
  tasks:
  - name: get httpd status
    service_facts:

  - name: test http enabled and started
    assert:
      that:
        - ansible_facts.services['httpd.service'].state == "running"
        - ansible_facts.services['httpd.service'].status == "enabled"
  • tasks/main.ymlを編集する。
---
- name: install httpd
  yum:
    name: httpd
    state: present

- name: start & enabled httpd
  service:
    name: httpd
    state: started
    enabled: yes
  • 今回は、Dockerコンテナを使用してテストを実行するため、
    create.ymlとdestroy.ymlは使用しないことや、create.ymlとdestroy.ymlが存在したままmolecule testを実行するとテストが上手く動作しないという記事を発見したため、他のディレクトリへ移動した。
    create.ymlとdestroy.ymlは名前の通り、インスタンスの作成時や削除時に必要になるため、状況に応じて判断が必要となる。
[root@localhost apache_install_03]# tree --charset=C
.
|-- 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

 

5..gitlab-ci.ymlの作成

  • .gitlab-ci.ymlを作成する。
    <9行目>:最新のファイルを参照してテストが行われるよう、GitLabのプロジェクト(apache_install)をGitクローンするようために記載
    <10行目>:moleculeでテストを実行するためのコマンド
stages:
  - test

test-job:
  stage: test
  script:
    - date
    - hostname
    - git clone http://<GitLabのユーザ名>:<GitLabのパスワード>@172.16.186.208:50000/Masuda/apache_install.git
    - molecule test

 

6.apache_install用role及び.gitlab-ci.ymlをプロジェクトにプッシュする

  • GitLabに作成したプロジェクトの「既存のフォルダをプッシュ」を参考に
    手順④⑤で作成したファイルをGitLab上のプロジェクト(apache_install)にプッシュする。

  • プロジェクトに反映されていることを確認する。

 

7.CI/CDのジョブを確認してみる

  • .gitlab-ci.ymlを含めてプッシュしたため、GitLabRunnerがリポジトリの更新を検知しCI/CDのジョブが実行される。

  • CI/CD>ジョブを確認すると.gitlab-ci.ymlで指定したtest-jobが実行されている。

  • molecule testが実行されはじめた。
  • molecule testを実行すると下記の①~⑬の処理が実行されていく。
    dependency 依存関係チェック
    lint yamllint,Flake8,ansible-lintの実行
    cleanup 変更の破棄
    destroy インスタンス削除
    syntax 構文チェック
    create インスタンス作成
    prepare role実行に必要な設定を行う
    converge インスタンスに対してroleの実行を行う
    idempotance 冪等性チェック
    side_effect HAフェイルオーバテスト(デフォルトでは無効)
    verify テスト実行
    cleanup 変更の破棄
    destroy インスタンス削除
  • 順調に処理が進みcreateが実行され、インスタンスの作成が成功した。
  • createのステップ完了後「docekr ps」コマンドを実行し、centosのイメージが起動してきているか確認。
    molecule/default/molecule.ymlで指定したように、instanceという名前のコンテナが起動していた。
    instanceの中に入ってOSバージョンを確認すると、CentOS8となっている。
    手順③で導入したCentOS8のイメージが使用されていた。
[root@localhost default]# docker ps
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES
e43db54d5953        molecule_local/centos:8   "/sbin/init"        19 seconds ago      Up 18 seconds                           instance
[root@localhost default]# docker exec -it instance bash
[root@instance /]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
  • convergeでroleが実行される。インスタンスにapacheのインストール及び起動が成功している。
  • convergeのステップ完了後、idempotenceで冪等性確認のため再度roleが実行される。
    冪等性が担保され、okとなっているのでidempotenceは成功となっている。
  • verifyではインスタンスがverify.ymlに記載した状態になっているかのテストが行われる。
    今回、verify.ymlにはansible-factsでhttpdのステータス状況を取得し、
    httpdサービスがrunningになっていること、enableになっていることを合格の基準とした。
    前の処理でapacheのインストール・起動に成功しており、インスタンスはverify.ymlに記載した状態を満たしており、成功となった。
  • 最後にdestroyが流れ、インスタンスが削除されtest-job自体が成功となり終了となる。
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]#

 

GitLab×GitLab Runner×moleculeを使ってみての感想

今回のブログテーマであるmoleculeについて一通り検証が完了したので
moleculeを使ってみての感想を簡単にまとめます。

<大変だったところ>

  • molecule関連の情報が少ない
     今回、moleculeを検証するに当たりmolecule関連の記事を探し回りましたが、molecule関連の記事が少ないように見受けられました。
    もちろん公式のドキュメントはありますが、私のような初心者にはちょっと難しかったというのが正直な感想です。
    ・ 今回はDockerコンテナをテスト対象として使用しました。
    同じことをDockerではなくVMwareでやろうとすると、
    VMware上に仮想マシンを作成するためのcreate.ymlやmolecule.ymlの中身も大きく変わってくるのでなかなか初心者にはハードルが高いなと感じました。

<良いなと思ったところ>

  • 自動でテストが行われるので開発やテストの負担減!
     ジョブ実行の結果をメールやSlackで通知することも可能なので、テストを見張っている必要もないこともポイントです。
    ・ テストが自動化されるので製品バージョンアップ等で必要だったテストの工数が削減でき、良いと思いました。
  • いつもクリーンな環境でテストがされる
     molecule testコマンドを実行すると、毎回インスタンスの作成・削除を行ってくれます。
    あまりよろしくないですが、検証環境を構築するのが面倒でいつも同じ検証環境使ってたりしますよね…。
    moleculeを使えば検証環境を建てる部分も自動でやってくれるので、面倒だった作業自体がなくなります。
     また、毎回新規でインスタンス作成されるので、過去の変更が引き継がれることがないので正確にroleのテストが行える点が良いと思いました。
  • テストコード化によってrole品質向上
    ・ testinfraやverify.ymlを使えば対象機器があるべき状態になっているかのテストも自動化できます。
    人がテストをすると判断基準の違い等で合否基準が変わってしまうということが考えられますが
    テストをコード化することによりテストの合否基準を一律化することができ、
    結果的にrole品質の向上につながると思いました。

 

今回のブログは、以上になります。

 

 

<参考サイト>

@inakadegaebal,”CentOS7にDockerをインストールする”,Qiita,2017/07/30,https://qiita.com/inakadegaebal/items/be9fecce813cebec5986(2021/05/23アクセス)

@niwasawa,”Docker で CentOS Linux 8 環境を構築して Apache HTTP Server を起動する”,Qiita,2020/3/21,https://qiita.com/niwasawa/items/85a78aaa8c5234d98fb4(2021/05/23アクセス)

OSCA,”DockerでCentOS 7のイメージを利用してみよう”,WEB ARCH LABO,更新日付不明,https://weblabo.oscasierra.net/docker-centos7/(2021/05/23アクセス)

まっぴぃ,”Install Docker on CentOS 7″,zenn,2020/10/25,https://zenn.dev/ymasaoka/articles/install-docker-centos-7(2021/05/23アクセス)

“Linux インストール後の作業”,DockerDocs,https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/linux-postinstall/(2021/05/23アクセス)

“プロキシーサーバー利用の設定”,DockerDocs,https://matsuand.github.io/docs.docker.jp.onthefly/network/proxy/(2021/05/23アクセス)

“Ansible MoleculeのDockerドライバーでのテスト実施ができない”,teratail,2020/10/31,https://teratail.com/questions/301543(2021/05/23アクセス)

@cxc,”Ansible Moleculeを使ってテストを自動化してみよう”,Qiita,2020/4/20,https://qiita.com/cxc/items/77c74c369e722b8537e8(2021/05/23アクセス)

@answer_d,”Moleculeに入門してみたよ”,Qiita,2020/1/15,https://qiita.com/answer_d/items/0119669f2e6151a86fc3(2021/05/23アクセス)

かずひら (id:Kazuhira),”Molecule 3を試す”,Hatena Blog,2020/4/4,https://kazuhira-r.hatenablog.com/entry/2020/04/04/230152(2021/05/23アクセス)

日常系インフラ自動化もふもふおじさん,”ANSIBLE TOWRE + GITLAB + MOLECULEで作るCI/CD環境”,日常系エンジニアのTech Blog,2019/9/23,https://sky-joker.tech/2019/09/23/ansible-towre-gitlab-molecule%E3%81%A7%E4%BD%9C%E3%82%8Bci-cd%E7%92%B0%E5%A2%83/(2021/05/23アクセス)

ユータ,”Ansible MoleculeとGitHub ActionsでCI/CDを体験してみた”,zenn,2020/12/5,https://zenn.dev/yuta28/articles/033efeb622a45cf44c91(2021/05/23アクセス)

水谷 裕一,”MoleculeでAnsibleのRoleをテストする – その1”,note,2020/12/16,https://note.com/shift_tech/n/nbd57ec4ae0df(2021/05/23アクセス)

トップページに戻る

ライトウェルのサービスサイト