基于Git仓库与GitLab Runner实现SaltStack状态管理及持续部署咨询
无Salt Master的GitLab CI + SaltStack部署方案指引
一、仓库结构设计
- 根目录创建
states/文件夹,存放所有Salt状态文件(如nginx.sls、app-deploy.sls等) - 可选创建
pillar/文件夹,存储自定义pillar配置数据(用于动态参数传递) - CI流水线中可动态生成
top.sls(无需提前写入固定Minion列表)
二、Minion端预配置
- 安装Python 3(salt-ssh运行依赖)
- 安装
salt-minion包(无需启动服务,仅用于本地执行状态,比无客户端模式更稳定) - 将GitLab Runner的SSH公钥添加到Minion的
~/.ssh/authorized_keys - 确保Minion的SSH服务允许密钥登录,防火墙开放22端口
三、GitLab Runner配置
- 选择执行器:推荐用shell或docker(docker可直接使用含salt-ssh的镜像)
- 在项目
Settings > CI/CD > Variables中添加以下变量:SSH_PRIVATE_KEY:Runner连接Minion的私钥,设置为「Protected」和「Masked」TARGET_MINIONS:目标Minion的主机名/IP列表,用逗号分隔(如minion01,192.168.1.10)
- 若用shell执行器,在Runner主机安装依赖:
# Debian/Ubuntu apt install salt-ssh salt-lint # 或用pip安装 pip install salt-ssh salt-lint
四、CI流水线配置(.gitlab-ci.yml)
stages: - lint - deploy # 语法检查阶段:提前发现状态文件错误 salt-lint: stage: lint image: python:3.10-slim before_script: - pip install salt-lint script: - salt-lint states/ # 部署阶段:仅master分支提交后触发 deploy-states: stage: deploy only: - master before_script: # 安装依赖+配置SSH - apt update && apt install -y salt-ssh openssh-client - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh && chmod 700 ~/.ssh - ssh-keyscan -H $TARGET_MINIONS >> ~/.ssh/known_hosts && chmod 644 ~/.ssh/known_hosts # 动态生成top.sls:指定所有目标Minion应用states下的状态 - echo "base:" > top.sls - for minion in $(echo $TARGET_MINIONS | tr ',' ' '); do echo " $minion:" >> top.sls; echo " - states" >> top.sls; done script: # 通过salt-ssh直接推送并应用状态 - salt-ssh $TARGET_MINIONS state.apply --file-root=. --pillar-root=pillar/
五、测试与验证
- 提交测试状态文件到master分支,观察GitLab CI流水线运行状态
- 登录目标Minion,检查状态是否正确应用(如查看服务状态、文件是否生成)
- 若出现SSH连接失败:检查私钥格式、Minion的
authorized_keys权限、防火墙规则
内容的提问来源于stack exchange,提问作者Mehran Mahmoudi
相关产品推荐
相关产品推荐

