Microsoft Teams Notifications mit AWX

Da es standardgemäß keinen Notification Type für Microsoft Teams gibt muss man sich etwas überlegen.
Die Antwort findet man im Notification Type „Webhook“ in AWX.

Vorbereitung

Bevor man beginnt sollte man zuerst einen Connector vom Typ Incoming Webhook in Microsoft Teams anlegen.
Dies ist recht unspektakulär und wird hier gut beschrieben.

Als Ergebnis erhält man ein URL, welche kopiert und später in der Konfiguration des Webhooks in AWX eingetragen wird.

Konfiguration des Notification Types in AWX

Grundkonfiguration

Erstellt in AWX unter Notifications ein neues Notification Template vom Typ Webhook und benennt es einfachheitshalber „Microsoft Teams“. Wählt nun noch eine Organisation aus und setzt den Type auf Webhook.

In den Type Details tragt ihr im Feld Target URL die zuvor aus Microsoft Teams kopierte URL ein. Die Felder Username, Basic Auth Password und Disable SSL Verification bleiben leer bzw. ohne Häkchen.

Im Feld HTTP Headers tragt ihr folgende Zeilein ein:

{
  "content-type": "application/json"
}

Als HTTP Method wählt ihr „POST“ aus.

Customize Messages…

Wie im vorigen Screenshot zu sehen, müsst ihr die Checkbox für die Customize Messages aktivieren.
Nachfolgend führe ich den Code der einzelnen Message Bodies auf. Ich beschränke mich dabei auf Start, Success und Error.

START MESSAGE BODY
{   
    "@type": "MessageCard",
    "@context": "http://schema.org/extensions",
    "summary": "Job started: {{ job.name }}",
    "title": "Job started: {{ job.name }}",
    "themeColor": "FFFFFF",
    "sections": [
        {
            "title": "Details",
            "facts": [
                {
                    "name": "Status",
                    "value": "{{ job.status }}"
                },
                {
                    "name": "Started",
                    "value": "{{ job.started }}"
                },
                {
                    "name": "Job Template",
                    "value": "[{{ job.summary_fields.job_template.name }}](https://example.de/#/templates/job_template/{{ job.summary_fields.job_template.id }})"
                },
                {
                    "name": "Job Type",
                    "value": "{{ job.job_type }}"
                },
                {
                    "name": "Launched by",
                    "value": "[{{ job.summary_fields.created_by.first_name }} {{ job.summary_fields.created_by.last_name }}](https://example.de/#/users/{{ job.summary_fields.created_by.id }})"
                },
                {
                    "name": "Inventory",
                    "value": "[{{ job.summary_fields.inventory.name }}](https://example.de/#/inventories/inventory/{{ job.summary_fields.inventory.id }})"
                },
                {
                    "name": "Project",
                    "value": "[{{ job.summary_fields.project.name }}](https://example.de/#/projects/{{ job.summary_fields.project.id }})"
                },
                {
                    "name": "Playbook",
                    "value": "{{ job.playbook }}"
                }
            ]
        }
    ],
    "potentialAction": [
        {
            "@context": "http://schema.org",
            "@type": "ViewAction",
            "name": "View on Ansible",
            "target": [
                "{{ url }}"
            ]
        }
    ]
}
SUCCESS MESSAGE BODY
{   
    "@type": "MessageCard",
    "@context": "http://schema.org/extensions",
    "summary": "Job success: {{ job.name }}",
    "title": "Job success: {{ job.name }}",
    "themeColor": "5CB85C",
    "sections": [
        {
            "title": "Details",
            "facts": [
                {
                    "name": "Status",
                    "value": "{{ job.status }}"
                },
                {
                    "name": "Started",
                    "value": "{{ job.started }}"
                },
				{
                    "name": "Finished",
                    "value": "{{ job.finished }}"
                },
                {
                    "name": "Job Template",
                    "value": "[{{ job.summary_fields.job_template.name }}](https://example.de/#/templates/job_template/{{ job.summary_fields.job_template.id }})"
                },
                {
                    "name": "Job Type",
                    "value": "{{ job.job_type }}"
                },
                {
                    "name": "Launched by",
                    "value": "[{{ job.summary_fields.created_by.first_name }} {{ job.summary_fields.created_by.last_name }}](https://example.de/#/users/{{ job.summary_fields.created_by.id }})"
                },
                {
                    "name": "Inventory",
                    "value": "[{{ job.summary_fields.inventory.name }}](https://example.de/#/inventories/inventory/{{ job.summary_fields.inventory.id }})"
                },
                {
                    "name": "Revision",
                    "value": "{{ job.scm_revision }}"
                },
                {
                    "name": "Project",
                    "value": "[{{ job.summary_fields.project.name }}](https://example.de/#/projects/{{ job.summary_fields.project.id }})"
                },
                {
                    "name": "Playbook",
                    "value": "{{ job.playbook }}"
                }
            ]
        }
    ],
    "potentialAction": [
        {
            "@context": "http://schema.org",
            "@type": "ViewAction",
            "name": "View on Ansible",
            "target": [
                "{{ url }}"
            ]
        }
    ]
}
ERROR MESSAGE BODY
{   
    "@type": "MessageCard",
    "@context": "http://schema.org/extensions",
    "summary": "Job error: {{ job.name }}",
    "title": "Job error: {{ job.name }}",
    "themeColor": "D9534F",
    "sections": [
        {
            "title": "Details",
            "facts": [
                {
                    "name": "Status",
                    "value": "{{ job.status }}"
                },
                {
                    "name": "Started",
                    "value": "{{ job.started }}"
                },
				{
                    "name": "Finished",
                    "value": "{{ job.finished }}"
                },
                {
                    "name": "Job Template",
                    "value": "[{{ job.summary_fields.job_template.name }}](https://example.de/#/templates/job_template/{{ job.summary_fields.job_template.id }})"
                },
                {
                    "name": "Job Type",
                    "value": "{{ job.job_type }}"
                },
                {
                    "name": "Launched by",
                    "value": "[{{ job.summary_fields.created_by.first_name }} {{ job.summary_fields.created_by.last_name }}](https://example.de/#/users/{{ job.summary_fields.created_by.id }})"
                },
                {
                    "name": "Inventory",
                    "value": "[{{ job.summary_fields.inventory.name }}](https://example.de/#/inventories/inventory/{{ job.summary_fields.inventory.id }})"
                },
                {
                    "name": "Revision",
                    "value": "{{ job.scm_revision }}"
                },
                {
                    "name": "Project",
                    "value": "[{{ job.summary_fields.project.name }}](https://example.de/#/projects/{{ job.summary_fields.project.id }})"
                },
                {
                    "name": "Playbook",
                    "value": "{{ job.playbook }}"
                }
            ]
        }
    ],
    "potentialAction": [
        {
            "@context": "http://schema.org",
            "@type": "ViewAction",
            "name": "View on Ansible",
            "target": [
                "{{ url }}"
            ]
        }
    ]
}