我有一个 Gitlab 管道,它执行一个 ansible-playbook 来创建一个清单文件。现在,如果剧本导致
changed>0
,则应该有一个合并请求,其中包含对 main
分支的更改。
下面是我的
gitlab-ci.yaml
,
---
include:
- local: .gitlab-ci-vars.yml
image:
name: $ANSIBLE_IMAGE
before_script:
- ansible --version
stages:
- "inventory build"
- create_merge_request
inventory-build:
stage: inventory build
script:
- ansible-playbook $PLAYBOOK_NAME
tags:
- $RUNNER_TAG
# Proceed with MR only if the playbook resulted in some changes
create_merge_request:
stage: create_merge_request
script:
- echo "Creating merge request..."
# Use GitLab API or custom scripts to create the merge request here
我不想通过管道传输剧本的输出并检查
PLAY RECAP
以确定库存是否有变化。一定有一些我不知道的更好的方法。我正在使用 gitlab v16.7.3-ee
如果你按照剧本本身来做,事情会变得更简单。任何 Ansible 任务都会生成一个包含
changed
标志的返回对象。如果将其注册到变量中,则可以在任何后续操作中使用它。
因此,如果您正在谈论正在更改的库存,您可能有一个将库存文件写入文件系统的任务,因此您可以重用该任务的结果。
counter_enabled
和 @U880D 在评论中提到的自定义统计信息将允许方便地将每个主机的更改聚合到一个变量中,因此如果您想根据某些特定数量的更改来控制行为,您可以这样做。但整体解决方案保持不变。
您还可以使用
command
模块运行 Git,检查工作区在签出后是否被修改或与目标分支不同,注册其输出,并应用 changed_when
任务关键字来定义将任务结果标记为的条件更改 - 当我从 VMware API 检索数据并动态构建清单时,我会执行相同的操作。
或者,如果您不想从 Ansible 本身提出合并请求,我看到的最简单的解决方案是将包含类似
changed: true
或 changed: false
的文件写入工作区并使用它而不是解析 Ansible 日志(顺便说一句,可以使用 community.general.log_plays
回调插件将其复制到文件中)。或者只是运行 git diff ...
或其他比较命令并分析其输出。