2021/07/12インフラCI/CDを学ぶ-molecule編
こんにちは、ライトウェルAnsibleチームの増田です。
今回のブログはインフラCI/CDのmolecule編になります!
moleculeと連携することで、Roleの開発支援とテストを自動化することができるようになります✨
検証に使用するツールの説明や検証環境の概要については、前回のブログをご確認ください。
<今回の検証内容イメージ>
- GitLabにプロジェクト(apache_install)を作成する
-
作成したプロジェクトとGitLab Runnerを連携させる
- GitLabRunnerサーバにmolecule及びDockerをインストールする
- apache_installのrole作成
- .gitlab-ci.ymlの作成
- molecule関連ファイル及び.gitlab-ci.ymlをプロジェクトにプッシュする
- 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アクセス)