LoginSignup
2
1

More than 3 years have passed since last update.

Travis CI + docker-compose + ansibleでzabbixモジュールのCIをやる

Last updated at Posted at 2019-05-26

Travis CIとdocker-composeとansibleを使ってzabbixのモジュールをテストを自動化してみました。

やりたかったこと

  • Python2.7、3.5、3.6、3.7ごとのAnsible動作試験をしたかった
  • Zabbixの各バージョンでAnsibleのZabbixモジュールの動作試験をしたかった
  • Zabbixの複数バージョンを使うのでコンテナを使いたかった(バージョンごとにVMのインスタンスを立てたくなかった)

作成したファイル

今回作ったファイルは以下に保存されています。

https://github.com/sky-joker/travis-ci-zabbix-test

travis.yml

travis.yml は以下のように書きました。
composeをインストールしてpipでansibleとzabbix-api(zabbixモジュールを動かすのに必要)をインストールしてコンテナを立ち上げzabbixの起動を確認するPlaybookを実行し、各コンテナが起動したらlocaleを設定してからモジュールのテストPlaybookを実行しています。
テストするpythonのバージョンは 2.7 3.5 3.6 3.7 を指定しています。(3.8は無かった)

language: python
python:
  - "2.7"
  - "3.5"
  - "3.6"
  - "3.7-dev"

services:
  - docker

install:
  - sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  - sudo chmod +x /usr/local/bin/docker-compose
  - pip install ansible zabbix-api
  - sudo docker-compose up -d
  - ansible-playbook zabbix_startup_check.yml
  - sh set_zabbix_locale.sh

script:
  - ansible-playbook test_zabbix_group.yml

docker-compose.yml

ここでは、zabbix3.0からzabbix4.2までのコンテナ(公式イメージ)が起動するように定義しました。
アクセスするポートごとにzabbixのバージョンを分けました。

---
version: '3.7'
services:
  # Zabbix Server 3.0
  zabbix30-db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: "zabbix"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
  zabbix30-server:
    image: zabbix/zabbix-server-mysql:centos-3.0-latest
    environment:
      DB_SERVER_HOST: "zabbix30-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
    depends_on:
      - "zabbix30-db"
    links:
      - "zabbix30-db"
  zabbix30-web:
    image: zabbix/zabbix-web-apache-mysql:centos-3.0-latest
    environment:
      DB_SERVER_HOST: "zabbix30-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
      ZBX_SERVER_HOST: "zabbix30-server"
      PHP_TZ: "Asia/Tokyo"
    depends_on:
      - "zabbix30-db"
      - "zabbix30-server"
    links:
      - "zabbix30-db"
      - "zabbix30-server"
    ports:
      - "8030:80"

  # Zabbix Server 3.2
  zabbix32-db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: "zabbix"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
  zabbix32-server:
    image: zabbix/zabbix-server-mysql:centos-3.2-latest
    environment:
      DB_SERVER_HOST: "zabbix32-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
    depends_on:
      - "zabbix32-db"
    links:
      - "zabbix32-db"
  zabbix32-web:
    image: zabbix/zabbix-web-apache-mysql:centos-3.2-latest
    environment:
      DB_SERVER_HOST: "zabbix32-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
      ZBX_SERVER_HOST: "zabbix32-server"
      PHP_TZ: "Asia/Tokyo"
    depends_on:
      - "zabbix32-db"
      - "zabbix32-server"
    links:
      - "zabbix32-db"
      - "zabbix32-server"
    ports:
      - "8032:80"

  # Zabbix Server 3.4
  zabbix34-db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: "zabbix"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
  zabbix34-server:
    image: zabbix/zabbix-server-mysql:centos-3.4-latest
    environment:
      DB_SERVER_HOST: "zabbix34-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
    depends_on:
      - "zabbix34-db"
    links:
      - "zabbix34-db"
  zabbix34-web:
    image: zabbix/zabbix-web-apache-mysql:centos-3.4-latest
    environment:
      DB_SERVER_HOST: "zabbix34-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
      ZBX_SERVER_HOST: "zabbix34-server"
      PHP_TZ: "Asia/Tokyo"
    depends_on:
      - "zabbix34-db"
      - "zabbix34-server"
    links:
      - "zabbix34-db"
      - "zabbix34-server"
    ports:
      - "8034:80"

  # Zabbix Server 4.0
  zabbix40-db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: "zabbix"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
  zabbix40-server:
    image: zabbix/zabbix-server-mysql:centos-4.0-latest
    environment:
      DB_SERVER_HOST: "zabbix40-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
    depends_on:
      - "zabbix40-db"
    links:
      - "zabbix40-db"
  zabbix40-web:
    image: zabbix/zabbix-web-apache-mysql:centos-4.0-latest
    environment:
      DB_SERVER_HOST: "zabbix40-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
      ZBX_SERVER_HOST: "zabbix40-server"
      PHP_TZ: "Asia/Tokyo"
    depends_on:
      - "zabbix40-db"
      - "zabbix40-server"
    links:
      - "zabbix40-db"
      - "zabbix40-server"
    ports:
      - "8040:80"

  # Zabbix Server 4.2
  zabbix42-db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: "zabbix"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
  zabbix42-server:
    image: zabbix/zabbix-server-mysql:centos-4.2-latest
    environment:
      DB_SERVER_HOST: "zabbix42-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
    depends_on:
      - "zabbix42-db"
    links:
      - "zabbix42-db"
  zabbix42-web:
    image: zabbix/zabbix-web-apache-mysql:centos-4.2-latest
    environment:
      DB_SERVER_HOST: "zabbix42-db"
      MYSQL_USER: "zabbix"
      MYSQL_PASSWORD: "zabbix"
      MYSQL_DATABASE: "zabbix"
      MYSQL_ROOT_PASSWORD: "zabbix"
      ZBX_SERVER_HOST: "zabbix42-server"
      PHP_TZ: "Asia/Tokyo"
    depends_on:
      - "zabbix42-db"
      - "zabbix42-server"
    links:
      - "zabbix42-db"
      - "zabbix42-server"
    ports:
      - "8042:80"

zabbix_startup_check.yml

これは、compose実行後にzabbixの起動を確認するPlaybookです。
以下のように書いています。

---
- name: zabbix startup check
  hosts: localhost
  gather_facts: no
  tasks:
    - name: check login to zabbix.
      uri:
        url: "http://127.0.0.1:{{ item }}/api_jsonrpc.php"
        method: POST
        body:
          jsonrpc: "2.0"
          method: "user.login"
          params:
            user: "admin"
            password: "zabbix"
          id: "1"
        body_format: json
        status_code: 200
      retries: 60
      delay: 5
      until: result is defined and 'json' in result and 'result' in result.json
      register: result
      loop:
        - 8030
        - 8032
        - 8034
        - 8040
        - 8042

set_zabbix_locale.sh

デフォルトだと日本語などが使えない(英語のみ)のでコンテナ内でlocaleを設定します。

#!/bin/sh

for c in $( docker ps --format '{{.Names}}' | grep web ) ; do
    docker exec $c localedef -f UTF-8 -i zh_CN zh_CN
    docker exec $c localedef -f UTF-8 -i cs_CZ cs_CZ
    docker exec $c localedef -f UTF-8 -i fr_FR fr_FR
    docker exec $c localedef -f UTF-8 -i he_IL he_IL
    docker exec $c localedef -f UTF-8 -i it_IT it_IT
    docker exec $c localedef -f UTF-8 -i ko_KR ko_KR
    docker exec $c localedef -f UTF-8 -i ja_JP ja_JP
    docker exec $c localedef -f UTF-8 -i nb_NO nb_NO
    docker exec $c localedef -f UTF-8 -i pl_PL pl_PL
    docker exec $c localedef -f UTF-8 -i pt_BR pt_BR
    docker exec $c localedef -f UTF-8 -i pt_PT pt_PT
    docker exec $c localedef -f UTF-8 -i ru_RU ru_RU
    docker exec $c localedef -f UTF-8 -i sk_SK sk_SK
    docker exec $c localedef -f UTF-8 -i tr_TR tr_TR
    docker exec $c localedef -f UTF-8 -i uk_UA uk_UA
    docker exec $c apachectl -k graceful
done

test_zabbix_group.yml

実際に実行するテストは以下のように書いています。

---
- name: zabbix grpuo module test.
  hosts: localhost
  gather_facts: no
  vars:
    zabbix_server: "http://127.0.0.1"
    zabbix_user: "admin"
    zabbix_passwd: "zabbix"
    zabbix_ports:
      - 8030
      - 8032
      - 8034
      - 8040
      - 8042
    zabbix_groups:
      - Example1
      - Example2
  tasks:
    - name: create of zabbix host group.
      zabbix_group:
        server_url: "{{ zabbix_server }}:{{ item }}"
        login_user: "{{ zabbix_user }}"
        login_password: "{{ zabbix_passwd }}"
        validate_certs: no
        host_groups: "{{ zabbix_groups }}"
        state: present
      loop: "{{ zabbix_ports }}"

    - name: delete of zabbix host group.
      zabbix_group:
        server_url: "{{ zabbix_server }}:{{ item }}"
        login_user: "{{ zabbix_user }}"
        login_password: "{{ zabbix_passwd }}"
        validate_certs: no
        host_groups: "{{ zabbix_groups }}"
        state: absent
      loop: "{{ zabbix_ports }}"

実行結果例

問題なければ以下のように表示されます :)

2019/06/24 追記

いくつかに分かれていたファイルをPlaybook化しました。
https://gist.github.com/sky-joker/fd22535f0d715e5cd64503e13f0a8cea

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1