ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

NewsBlur 部署体系中的 Docker CE Ansible Role:源码解析与实战配置指南

NewsBlur 部署体系中的 Docker CE Ansible Role:源码解析与实战配置指南 后端前端社交人工智能【免费下载链接】NewsBlurNewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument.项目地址https://gitcode.com/gh_mirrors/ne/NewsBlur点击查看免费下载本文围绕 NewsBlur 仓库中ansible/roles/docker/README.md所描述的「使用 Ansible role 安装 Docker CECommunity Edition」这一核心主题展开。该 role 负责在目标主机上完成旧 Docker 包清理、官方仓库配置、Docker CE 与 Compose 插件安装、用户组授权、daemon.json 模板下发及newsblurnet网络创建是 NewsBlur 在 app / www 节点上运行容器化服务Postgres、Redis、Web、Celery 等的前提基础。读完本文你将掌握该 role 的完整任务链路、关键变量与平台分支差异并能将其复用到其他基于 Docker 的部署场景。一、Role 定位与项目上下文ansible/roles/docker是 NewsBlur 部署体系中负责安装 Docker CE 的 Ansible role。从仓库的ansible/roles/docker/README.md可以看出它最初源自第三方角色zaxos/docker-ce-ansible-role官方要求的支持平台包括CentOS 7Ubuntu Xenial 16.04LTSUbuntu Yakkety 16.10Ubuntu Trusty 14.04LTS最低 Ansible 版本为 1.9见 meta/main.yml 中min_ansible_version: 1.9。不过仓库中实际保存的实现已经历了明显演进install-Ubuntu.yml使用了ansible.builtin.apt_repository、keyrings 目录/usr/share/keyrings/docker-archive-keyring.gpg、docker-compose-plugin等现代 Docker 官方安装方式因此实际适用环境已远超 README 中列出的旧版本系统这一点在阅读与复用时需要留意。在 NewsBlur 的部署编排中该 role 通过setup_app.yml和setup_www.yml被显式引用setup_app.yml- { role: docker, tags: docker }setup_www.yml- { role: docker, tags: docker }也就是说在应用节点与 Web 节点上Docker 的安装由本 role 统一完成而其他基础部分如防火墙、系统 base 配置则由base、ufw等角色负责。role 内部还会创建名为newsblurnet的 Docker 网络这是 NewsBlur 各容器间互相通信的基础设施——ansible/roles/postgres/tasks/main.yml、ansible/roles/redis/tasks/main.yml、ansible/roles/web/tasks/container.yml、ansible/roles/celery_task/tasks/main.yml、ansible/roles/mcp/tasks/container.yml等处的容器定义全部声明了network_mode/network: newsblurnet可见该网络是整条容器链路的「虚拟交换机」。二、Role 目录结构总览该 role 遵循标准 Ansible role 布局各文件职责如下路径职责tasks/main.yml主任务入口按平台分发、启动服务、授权用户组、下发 daemon.json、创建网络tasks/install-EL.ymlRedHat 系CentOS 等安装流程tasks/install-Ubuntu.ymlUbuntu 系安装流程含架构分支defaults/main.yml可覆盖的默认变量清理/前置包清单vars/main.yml内部变量docker_compose_versionhandlers/main.yml服务启动与重启 handlertemplates/daemon.jsonDocker 守护进程配置文件模板meta/main.ymlGalaxy 元数据平台、标签、Licensetests/test.yml语法检查用的测试 playbooktests/inventory测试用 inventorylocalhost三、主任务链路从安装到网络就绪tasks/main.yml 是整个 role 的执行骨架共分 6 个阶段按平台分发安装include_tasks: install-EL.yml当ansible_os_family RedHat与include_tasks: install-Ubuntu.yml当ansible_distribution Ubuntu。通过条件判断实现跨发行版兼容是典型的 Ansible 多平台处理模式。启用 Docker 服务使用service模块设置docker服务state: started、enabled: yes保证开机自启。将 SSH 用户加入 docker 组user模块将{{ ansible_ssh_user }}以append: yes方式追加到docker组并register: docker_group_added当组关系发生变更时通过meta: reset_connection重置 SSH 连接使组权限立即生效无需重新登录。将nb用户加入 docker 组与上一步相同的授权逻辑固定用户名为nb这是 NewsBlur 约定运行管理命令的系统用户例如celery_task的 cron 任务即以nb身份执行docker run ...。下发 daemon.json 模板将 templates/daemon.json 渲染到/etc/docker/daemon.json并notify: restart docker。创建 newsblurnet 网络docker_network模块创建名为newsblurnet的 overlay/bridge 网络供后续所有服务容器使用同样notify: restart docker。值得说明的是handlers/main.yml 中定义了两个 handlerStart Docker CE service将 docker 服务state: startedRestart Docker通过listen: restart docker监听主题任何任务notify: restart docker都会触发 Docker 守护进程重启。这种「主题监听listen」写法使 daemon.json 变更、网络创建等不同来源的通知能统一收敛到一个重启动作避免重复重启。四、平台分支详解EL 与 Ubuntu 两条安装路径4.1 RedHat / CentOS 安装install-EL.ymlinstall-EL.yml 的流程为清理旧版 Dockeryum模块以state: absent卸载 defaults/main.yml 中docker_cleanup_packages_EL列出的docker、docker-common、docker-client、docker-engine。这是为了避免系统自带旧包与 Docker CE 冲突。安装前置包安装docker_prerequisite_packages_EL中唯一的包python-docker供 Ansible 的 docker 相关模块使用。导入官方 GPG 密钥rpm_key导入https://download.docker.com/linux/centos/gpg。添加官方仓库get_url将https://download.docker.com/linux/centos/docker-ce.repo下载到/etc/yum.repos.d/docker-ce.repo并设置owner: root、group: root、mode: 0644、force: yes。安装 Docker CEyum安装docker-cestate: present且update_cache: yes。4.2 Ubuntu 安装install-Ubuntu.ymlinstall-Ubuntu.yml 是现代 Docker 官方推荐的「deb keyring」方式清理旧包卸载docker_cleanup_packages_Ubuntu中的docker.io、docker-engine、containerd。安装前置包docker_prerequisite_packages_Ubuntu包含apt-transport-https、ca-certificates、curl、software-properties-common、python3-docker。其中python3-docker是 Ansibledocker_*模块运行所需的 Python 客户端库。下载并固化 GPG 密钥shell执行curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg并借助creates参数保证幂等密钥文件已存在则跳过。按架构添加仓库连续三次调用ansible.builtin.apt_repository依次写入arch{{ ansible_architecture }}、archarm64、archamd64三个变体的 apt 源全部指向https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable并带signed-by指定 keyring。这样做可以在不同 CPU 架构的主机上都能命中正确的软件源。刷新 APT 缓存ansible.builtin.apt执行update_cache: yes。安装 Docker CE 与 Compose 插件apt一次安装docker-ce与docker-compose-plugin两个包state: latest保证升级到当前仓库中的最新版本。对比两条路径可以看出EL 分支的state: present表示「确保安装」Ubuntu 分支的state: latest表示「确保最新」运维上如需锁定版本可自行调整。五、变量体系默认值、内部值与可覆盖策略role 将「可被外部覆盖的默认值」放在defaults/main.yml将「内部固定值」放在vars/main.yml这是 Ansible 的最佳实践分层defaults/main.ymldocker_state: present声明式状态供外部 playbook 通过-e docker_state...覆盖实际安装任务中未直接引用该变量属于该 role 预留的通用接口docker_cleanup_packages_EL/docker_cleanup_packages_Ubuntu两个发行版的旧包清理清单docker_prerequisite_packages_EL/docker_prerequisite_packages_Ubuntu两个发行版的前置依赖清单docker_prerequisite_packages_Ubuntu_1404为 Ubuntu 14.04 准备的旧内核扩展包linux-image-extra-{{ ansible_kernel }}与linux-image-extra-virtual保留了历史平台的兼容定义。vars/main.ymldocker_compose_version: 2.40.1Compose 版本常量。虽然当前 Ubuntu 安装任务已改用docker-compose-plugin包而非下载二进制该变量仍保留了指定 Compose 版本的能力如后续切换为二进制安装方式可直接使用。六、daemon.json 模板NewsBlur 的 Docker 守护进程定制templates/daemon.json 是 Docker 守护进程的核心配置模板内容如下{ dns-search: [node.consul, service.consul], default-ulimits: { nofile: { Name: nofile, Hard: 65536, Soft: 65536 } } }两个关键配置项的解读dns-search为容器设置 DNS 搜索域node.consul与service.consul使容器可直接使用主机名.node.consul、服务名.service.consul这类 Consul DNS 名字解析到对应服务。这与仓库中 consul 角色 的服务发现体系配合NewsBlur 各容器如 Postgres、Redis在同一newsblurnet网络中通过 Consul 域名互相寻址实现服务注册与发现的松耦合。default-ulimits.nofile将容器默认的文件描述符软/硬限制统一提高到 65536。NewsBlur 这类高并发 RSS 阅读服务依赖大量 socket 连接提高nofile上限可显著降低「Too many open files」类故障概率。模板通过主任务的template任务下发到/etc/docker/daemon.json变更后触发restart dockerhandler 使配置生效。七、newsblurnet 网络容器互联的基础设施tasks/main.yml 的最后一步创建 Docker 网络- name: Make docker network for newsblurnet become: yes docker_network: name: newsblurnet notify: restart docker该网络是 NewsBlur 全部容器化组件的通信平面。仓库中大量角色都在容器定义里引用它例如postgres/tasks/main.yml- name: newsblurnetredis/tasks/main.yml- name: newsblurnet且启动命令带--networknewsblurnet --hostname {{ ansible_hostname }}web/tasks/container.yml- name: newsblurnetcelery_task/tasks/main.ymlcron 中直接docker run --rm ... --networknewsblurnet newsblur/newsblur_python3 ...mcp/tasks/container.yml、grafana/tasks/main.yml、各 exporter 角色同样挂接该网络从这些调用关系可以看出一旦该网络缺失或名字不一致所有容器间的服务发现与连通都会中断因此由本 role 在安装 Docker 后第一时间统一创建。八、测试与质量保障该 role 自带测试资产可用于 CI 或本地验证tests/test.yml一个仅包含roles: [docker-ce-ansible-role]的最小 playbookhosts 指向localhosttests/inventory内容为localhost的单主机 inventory.travis.yml历史 CI 配置使用 Python 2.7 pip 安装 Ansible生成roles_path../的 ansible.cfg然后执行ansible-playbook tests/test.yml -i tests/inventory --syntax-check做语法校验并将结果推送到 Ansible Galaxy 通知 webhook。这套「最小 playbook 语法检查」模式可快速验证 role 结构正确性适合在发布前作为冒烟测试运行。九、在 NewsBlur 中的实际部署用法在 NewsBlur 仓库中该 role 并非通过ansible-galaxy install从 Galaxy 拉取README 中的ansible-galaxy install zaxos.docker-ce-ansible-role是上游角色的通用用法而是被直接存放在ansible/roles/docker下随仓库一起管理。实际接入方式为# ansible/playbooks/setup_app.yml节选 - hosts: app vars_files: - ../env_vars/base.yml roles: - { role: base, tags: base } - { role: ufw, tags: ufw } - { role: docker, tags: docker } - ...setup_www.yml采用相同模式。带tags: docker的写法允许运维时用ansible-playbook setup_app.yml --tags docker单独重跑 Docker 相关任务实现局部收敛。由于任务中引用了nb用户NewsBlur 的运行用户与newsblurnet网络该 role 与 NewsBlur 的 docker-compose.yml 本地开发方案、deploy_app.yml 中docker pull newsblur/newsblur_deploy/docker run --rm -v {{ newsblur_repo_path }}:/srv/newsblur的构建流程互为配合前者保证生产主机具备一致的 Docker 运行时与网络后者负责应用镜像的拉取与构建。十、复用与二次开发要点若要将该 role 复用到其他项目建议关注以下几点平台判断主入口只区分 RedHat 与 Ubuntu 两个分支其他发行版如 Debian、openSUSE需自行扩展include_tasks分支。版本策略Ubuntu 分支使用state: latest安装docker-ce与docker-compose-plugin如生产环境需要固定版本应改为指定version或将docker_compose_version变量接入安装逻辑。用户组授权任务硬编码了ansible_ssh_user与nb两个用户若目标主机的 SSH 用户名不同或不存在nb用户应先将对应用户名抽成变量。密钥与仓库 URLGPG 密钥、apt/yum 源地址均指向 Docker 官方域名内网/离线环境需替换为镜像源或本地仓库。Consul 依赖dns-search依赖 Consul DNSnode.consul/service.consul可用若没有 Consul可移除该配置项否则容器内 DNS 查询会出现不必要的搜索域开销。结语ansible/roles/docker虽是一段源自第三方、看似短小的 README但仓库中保存的完整实现展示了 NewsBlur 对 Docker 运行时的工程化治理平台分支化安装、旧包清理、官方仓库与密钥固化、用户组授权、守护进程模板化下发以及newsblurnet网络这一贯穿全部容器角色的通信基础设施。理解这条链路既有助于排查 NewsBlur 生产环境中的容器启动与互通问题也可以直接提炼为一套可复用的「Ansible 安装 Docker CE」最佳实践。赞分享后端前端社交人工智能【免费下载链接】NewsBlurNewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument.项目地址https://gitcode.com/gh_mirrors/ne/NewsBlur点击查看免费下载相关推荐python_backend自定义指标监控模型性能与业务指标的实现方法python_backend自定义指标监控模型性能与业务指标的实现方法 GitHub 加速计划的 python_backend 是一个基于 Triton 的后后端前端社交人工智能gpt-repository-loader与代码学习路径自动生成学习计划gpt repository loader与代码学习路径自动生成学习计划 在软件开发的学习过程中面对复杂的代码仓库往往让初学者望而却步。 gpt repos上一篇开源项目 anthropic-sdk-python 使用教程下一篇Windows11项目社区指南获取支持与分享经验的最佳途径创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表