如何在GitHub Actions中发送Ansible Playbook的Debug消息至Slack
如何在GitHub Actions中把Ansible Playbook的Debug输出发送到Slack
要把Playbook中debug模块输出的成功百分比、失败主机列表等信息同步到Slack,需要分三步实现:捕获Ansible输出、在Actions中读取内容、自定义Slack消息。
1. 修改Ansible Playbook,将结果写入本地文件
在现有Playbook中,先通过set_fact保存计算结果,再将内容写入GitHub Actions运行环境的本地文件,方便后续读取:
- hosts: platform_linux:!skipped_group gather_facts: yes become: yes tasks: - name: Ping Linux host ansible.builtin.ping: - name: Calculate host status metrics set_fact: success_percent: "{{ 100 - ((ansible_play_hosts|length)/(ansible_play_hosts_all|length))*100 | round }}" failed_hosts: "{{ ansible_play_hosts_all | difference(ansible_play_hosts) }}" - name: Write results to local file copy: content: | Success percentage for Linux is {{ success_percent }} The Linux hosts that failed are {{ failed_hosts | default('None') }} dest: ./ansible_host_results.txt delegate_to: localhost
delegate_to: localhost确保文件生成在GitHub Actions的运行容器中,而非远程目标主机。
2. 在GitHub Actions的base.yml中读取结果文件
在执行Ansible Playbook的步骤之后,添加读取文件内容的步骤,将内容存入步骤输出变量:
- name: Execute Ansible Playbook # 替换为你实际运行Playbook的命令,比如带inventory参数的ansible-playbook命令 run: ansible-playbook -i inventory/${{ inputs.ou_env }} ${{ inputs.playbook }}.yml - name: Read Ansible host results id: ansible_results run: | RESULTS_CONTENT=$(cat ./ansible_host_results.txt) echo "content<<EOF" >> $GITHUB_OUTPUT echo "$RESULTS_CONTENT" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT
通过id: ansible_results标记步骤,后续可通过steps.ansible_results.outputs.content获取文件内容。
3. 自定义Slack通知内容
替换原有的Slack通知步骤,加入读取到的Ansible结果内容。以下提供两种方案:
方案一:使用slackapi/slack-github-action(更灵活)
- name: Send Slack notification uses: slackapi/slack-github-action@v1.24.0 with: slack-webhook-url: ${{ secrets.slack_webhook }} slack-message: | Ansible任务状态: ${{ job.status }} --- 主机检测详情: ${{ steps.ansible_results.outputs.content }} if: always()
方案二:继续使用act10ns/slack(兼容原有配置)
- name: Send slack notification uses: act10ns/slack@v1.6.0 with: webhook-url: ${{ secrets.slack_webhook }} status: ${{ job.status }} custom-text: | 主机检测详情: ${{ steps.ansible_results.outputs.content }} if: always()
注意事项
- 确保文件路径和Playbook中定义的一致,避免读取失败。
failed_hosts | default('None')用于处理无失败主机的场景,避免输出空内容。
内容的提问来源于stack exchange,提问作者Vinita Shah
相关产品推荐
相关产品推荐

