我在docker-compose中尝试了Goss

首先

以前,我在工作中使用Serverspec作为服务器建设后的测试工具。

我在与Ansible结合使用时,进行了Serverspec测试用例的生成和自动执行,但与手动操作相比,尽管确实更快,但执行仍然需要相当一段时间。

人类,越来越贪婪啊,真是可怕啊,可怕啊。

在某一天,我得知了一个名为Goss的测试工具,于是我决定试试看。

Goss 的特点与 Serverspec 相比较

ServerspecGoss環境構築そこそこ簡単、テスト対象に接続可能な 1 ホストにあればいいテスト対象全てにシングルバイナリ配布実行速度*速い (100テストケース:10秒くらい)爆速(500テストケース:1秒くらい)テストケース形式Ruby 形式YAML 形式テストケース生成手動一部自動生成可能

关于执行速度,我认为测试的目标是物理机还是虚拟机等会有所不同,但仅供参考。

建立环境

在测试的目的上,将 Serverspec 直接替换为 Goss,并继续使用 Ansible 来进行测试的自动执行。

环境

使用docker-compose来启动ansible-server和test-target这两个容器,并进行测试。

通过在 ansible 服务器上安装 Goss 并将其二进制文件分散到 Ansible 的测试目标上进行测试。

┌────────────────┐          ┌─────────────┐ 
│ ansible-server │ =[SSH]=> │ test-target │
└────────────────┘          └─────────────┘

目录结构

.
├── ansible-server
│   ├── Dockerfile
│   ├── config
│   └── test-target-key
├── docker-compose.yml
├── test-target
│   ├── Dockerfile
│   └── test-target-key.pub
└── work
    ├── inventory.yml
    ├── roles
    │   └── goss
    │       ├── files
    │       │   ├── goss
    │       │   └── goss.yaml
    │       ├── tasks
    │       │   └── main.yml
    │       ├── templates
    │       └── vars
    │           └── main.yml
    └── site.yml

Dockerfile【ansible-server】

FROM ubuntu:18.04

WORKDIR /root

# SSH Settings
COPY ./test-target-key /root/.ssh/
COPY ./config /root/.ssh/
# Install common tools
RUN apt update && apt install --yes curl vim
# Install ansible
RUN apt install --yes software-properties-common && \
    apt-add-repository --yes --update ppa:ansible/ansible && \
    apt install --yes ansible
# Install Goss
RUN curl -L https://github.com/aelsabbahy/goss/releases/latest/download/goss-linux-amd64 -o /usr/local/bin/goss && \
    chmod +rx /usr/local/bin/goss && \
    cp -i $(which goss) .

CMD ["tail", "-f", "/dev/null"]

Dockerfile【测试目标】。

FROM ubuntu:18.04

WORKDIR /root

RUN apt update && apt install --yes openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:P@ssw0rd' | chpasswd
COPY ./test-target-key.pub /root/.ssh/authorized_keys
EXPOSE 22

# For Test.
RUN echo "this is test." > test.txt
RUN apt install --yes nginx
EXPOSE 80

CMD ["/usr/sbin/sshd", "-D"]

docker-compose.yml 可以用以下中文翻译: 数操集卡骑-试试.yml

---
  version: "2"
  services:
    ansible-server:
      build: ./ansible-server
      volumes:
        - ./work:/root/work

    test-target:
      build: ./test-target
      ports:
        - 8080:80

开始

$ docker-compose build
$ docker-compose up -d

考试 shì)

在 test-target 的 Dockerfile 中的描述中,进行以下测试。

test.txt に this is test. と記述されていること
Nginx がインストールされていること
Nginx が起動していること
80 ポートで Listen していること

测试用例可以使用YAML格式进行描述。

goss.yaml 文件

file:
  /root/test.txt:
    exists: true
    contains: ["this is test."]

port:
  tcp:80:
    listening: true
    ip:
    - 0.0.0.0
  tcp6:80:
    listening: true
    ip:
    - '::'
service:
  nginx:
    enabled: true
    running: false
process:
  nginx:
    running: true

省略 Ansible 的 Playbook

进行测试

$ docker-compose exec ansible-server /bin/bash
root@38b380ec3969:~# cd work/
root@38b380ec3969:~/work# ansible-playbook -i inventory.yml site.yml
ok: [test-target] => {
    "msg": {
        "changed": true,
        "cmd": [
            "./goss",
            "validate",
            "--format",
            "documentation"
---
        "stdout_lines": [
            "File: /root/test.txt: exists: matches expectation: [true]",
            "File: /root/test.txt: contains: matches expectation: [this is test.]",
            "Port: tcp:80: listening: matches expectation: [true]",
            "Port: tcp:80: ip: matches expectation: [[\"0.0.0.0\"]]",
            "Port: tcp6:80: listening: matches expectation: [true]",
            "Port: tcp6:80: ip: matches expectation: [[\"::\"]]",
            "Process: nginx: running: matches expectation: [true]",
            "Service: nginx: enabled: matches expectation: [true]",
            "Service: nginx: running: matches expectation: [false]",
            "",
            "",
            "Total Duration: 0.006s",
            "Count: 9, Failed: 0, Skipped: 0"
        ]
    }
}

哇,速度真是爆表啊,只用了0.006秒就通过了9个测试用例。

总结

    • Goss はやはり爆速

 

    • Ansible との相性も良さそう

 

    テストケース作るのも簡単 (紹介してないが、今回のテストケースはほとんど自動生成した)

除此之外,还有一些功能,如根据环境切换测试用例和使用for循环运行测试等。

最后

我們將此次創建的原始碼在 GitHub 上公開。

如果想要制作复杂的测试,似乎还是需要掌握Golang的知识。毕竟现在是Golang的时代。

广告
将在 10 秒后关闭
bannerAds