yourlabs.compose
将 docker-compose.yml 部署到服务器
Ansible 角色用于将 docker-compose.yml 部署到主目录,最好与 bigsudo 一起使用。
本README描述了功能,详细教程请参见TUTORIAL.md,其中提供了极端DevOps的模式。
示例
该角色自我测试,你可以直接复制:
- Dockerfile:默认适用于 CRUDLFA+ 项目,提供压缩和缓存的静态文件服务以及一个调度器。
- .gitlab-ci.yml:构建并推送 docker 镜像到 GitLab 镜像注册中心,提供一个部署作业 YAML 模板(宏),以及适用于不同部署用例的三个示例部署配置。
- docker-compose.yml:用于本地和临时部署。
- docker-compose.traefik.yml:支持 yourlabs.traefik。
- docker-compose.persist.yml:用于持久化部署的附加组件,即在 .gitlab-ci.yml 中指定的,需要 docker-compose.traefik.yml。
你需要更改:
- .gitlab-ci.yml:有一些
# UNCOMMENT ABOVE AND REMOVE BELOW
的注释,按照提示操作,以便使用 yourlabs/ansible。 - ci.yourlabs.io 更改为你的服务器地址.
- GitLab CI 变量设置:
$CI_SSH_KEY
,它应包含一个 ed25510 的私钥,你可以通过指令ssh-keygen -t ed25519 -a 100
创建一个。 - Dockerfile:更改命令参数
--module=wsgi:application
以指向你对应的 wsgi 应用程序路径,如果不需要 bigsudo 配置,则可以将其移除,并取消注释你想要的部分。
然后,你可以根据需要自定义!
其他你可能会使用的 bigsudo 命令:
- 启用一个备份 systemd 定时器:
bigsudo yourlabs.compose backup home=/home/$CI_PROJECT_NAME-$CI_ENVIRONMENT_NAME
- 在审查部署的 CI 服务器上,删除未使用的镜像、卷和网络:
bigsudo yourlabs.docker prunecron @ci.your.host
,这可以防止审查部署占用磁盘空间。
你也可以在 关于极端DevOps的博客文章 中获取更一般和概念性的描述。
功能文档
该角色的目的是自动化将多个 docker-compose.yml 文件合并部署到主机的目录,并围绕此进行自动化。
在包含 docker-compose.yml 文件的目录中,你可以使用以下命令将其部署到 $host:/home/staging
:
bigsudo yourlabs.compose home=/home/staging $user@$host
如果 $user@$host
未定义,则将在本地主机上执行。
你可以传递多个组合文件,并在生成最终文件时代理环境变量:
FOO=bar bigsudo yourlabs.compose \
home=/home/staging \
compose_django_image=$YOUR_IMAGE \
compose=docker-compose.yml,docker-compose.staging.yml
目录生成
此角色还可以使用指定的 uid、gid 和模式预创建目录,标记为 io.yourlabs.compose.mkdir
,示例如下:
volumes:
- "./log/admin:/app/log"
labels:
- "io.yourlabs.compose.mkdir=./app/log:1000:1000:0750"
这将创建 {{ home }}/log/admin
目录,所有者为 1000,组为 1000,模式为 0750。
环境生成
另一个有趣的功能是自动环境提供, 每个在服务环境中声明的变量都会在运行时定义。例如,在 docker-compose.yml 中:
environment:
- FOO
然后在执行 yourlabs.compose 角色时定义 FOO 变量,如下所示:
FOO=bar bigsudo yourlabs.compose home=/home/test
将生成以下环境:
environment:
- FOO=bar
CLI 上的 YAML 重写
你还可以使用 compose_servicename_keyname
变量添加或重写服务值。例如,动态重写 compose[services][django][image]
的值:
bigsudo yourlabs.compose home=/home/test compose_django_image=yourimage
如果你想即时清空值,只需传递空值,例如,要使 compose[services][django][build]
为空,请传递 compose_django_build=
而不提供值。 如果你没有在主目录中克隆你的代码库,则当 docker-compose 找不到 Dockerfile 的路径时会报错,这样可以规避此限制:
bigsudo yourlabs.compose home=/home/test compose_django_build=
网络自动化
管理 docker-compose 的网络可能有点棘手,例如,我们通常有一个与负载均衡器如 traefik 相关的 web
网络。这将 web
网络附加到 django 服务,并且只要在部署的 docker-compose.yml 文件中声明该网络为外部,它将自动附加网络:
bigsudo yourlabs.compose home=/home/test compose_django_networks=web
如果你正在做负载均衡器的 docker-compose.yml,则会遇到相反的问题:docker-compose.yml 声明了一个外部的 web
网络,但 docker-compose up 不会创建它,会报错:
ERROR: Network web declared as external, but could not be found. Please
create the network manually using `docker network create lol` and try again.
该角色通过解析 docker-compose.yml
中的外部网络,并在必要时使用 docker_network
ansible 模块在主机上预创建,防止了此问题。
作为 ansible 角色
最后,你可以像使用其他 ansible 角色一样使用此角色,如果你想将其包装在你的代码库中的更多任务中:
- name: 确保 docker 在此主机上设置一次
include_role: name=yourlabs.compose
vars:
home: /home/yourthing
compose_django_image: foobar
compose_django_build:
compose_django_networks:
- web
备份
对于带有 home
参数的部署,启用了自动备份。它会在 /home 中设置三个脚本:
- ./backup.sh:创建本地备份并在 restic 中备份。
- ./restore.sh:列出 restic 快照,运行时传入快照哈希作为参数以恢复快照。
- ./prune.sh:删除旧备份。
它会创建 1 个 systemd 服务和 systemd 定时器,
- backup-PROJECTNAME.service
- backup-PROJECTNAME.timer
开发
要在本地主机上开发此角色:
# 构建镜像
docker build -t test .
# 运行 bigsudo,如下所示:
bigsudo . home=/tmp/test compose_django_build= compose_django_image=test compose=docker-compose.yml,docker-compose.persist.yml
请注意,它会始终在更新之前尝试运行备份脚本。如果你更改了脚本,需要在重新运行 yourlabs.compose 之前删除 backup.sh,以便更新 backup.sh。