我在docker-compose中尝试了Goss
首先
以前,我在工作中使用Serverspec作为服务器建设后的测试工具。
我在与Ansible结合使用时,进行了Serverspec测试用例的生成和自动执行,但与手动操作相比,尽管确实更快,但执行仍然需要相当一段时间。
人类,越来越贪婪啊,真是可怕啊,可怕啊。
在某一天,我得知了一个名为Goss的测试工具,于是我决定试试看。
Goss 的特点与 Serverspec 相比较
关于执行速度,我认为测试的目标是物理机还是虚拟机等会有所不同,但仅供参考。
建立环境
在测试的目的上,将 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的时代。