AWXのWebhook機能を使ってGitHubと連携してみた


Ansible Advent Calendar 2019の初日を担当させて頂きます!
よろしくお願いします。

さて、今回はAWXにマージされたWebhook機能を使ってGitHubと連携しAWXのワークフローを実行してみたいと思います。
ワークフローの実行結果もGitHub上のステータスに反映できるようにします。

やりたいこと

ざっくり言うとこんな感じです。

GitHubのリポジトリへのプッシュをトリガーにwebhookが登録されたAWXに送信されworkflowの実行をします。
workflowでGitHubへのステータスアップデートや目的の処理(CIなど)を実行します。

構成

今回はAWS上にCentOS7の環境を構築します。
ドメインはパブリックDNSを使用します。
また、インターネット上に作成するのでAWXもSSL対応にします。

ここでは、既にAWS上にCentOS7のインスタンスが起動している前提で進めていきます。
ちなみにインスタンスのサイズは t2.medium を使っています。

AWX構築

まずは、AWX環境を構築します。

必要なパッケージのインストール

構築に必要なパッケージをインストールします。

モジュールのインストール

構築で必要なモジュールをインストールをします。

python2.7を使う場合は more-itertools が必要です。(以下を参照)

証明書の作成

AWXで使用する自己証明書を作成します。
以下のPlaybookを使う事でAnsibleからサクッと証明書の自動生成ができます。

change me のところは秘密鍵のパスワードに変更してください。
例えば以下のようにパスワードをランダムに生成することも可能です。

Playbookを実行します。

AWXの起動

AWXのリポジトリをクローンします。

AWXの installer ディレクトリへ移動します。

インベントリファイルを修正します。

dockerを起動します。

インストールPlaybookを実行します。

接続確認

パブリックDNSまたはパブリックIPでアクセスできることを確認します。

スクリーンショット 2019-11-30 16.32.31.png

GitHubのToken生成

リポジトリのステータスを変更するためのトークンを発行します。
次のドキュメントの手順に従ってトークンを発行してください。

今回はステータスを変更するだけをするので許可する操作は repo:status のみチェックを入れて生成します。

生成されたTokenをどこか安全な場所にメモっておきます。

ワークフローテンプレート作成

プロジェクト作成

今回はGitHubのステータスをアップデートするPlaybookがあるリポジトリと実際に動きを確認するPlaybookがあるリポジトリを使用するためプロジェクトは2つ作成します。

GitHubステータスアップデート用

動作を確認する用

動作確認ではCentOS7イメージを使ってコンテナを起動してApacheのインストール及び起動、接続確認をするPlaybookを使用します。

テンプレート作成

GitHubステータス用のテンプレートは以下のように作成しています。
ジョブタグの 起動プロンプト にチェックを入れているのはステータスの処理をタグで分けているためです。
Webhookはワークフローテンプレート側で有効化するのでテンプレートでは設定しません。

動作を確認する用のテンプレートは以下のように作成しています。
centosユーザーでログインした後にrootにスイッチしてPlaybookを実行するため 権限昇格の有効化 にチェックを入れています。
ここでのインベントリーはAWXが動作しているAWSのインスタンスを指定しています。

ワークフロージョブテンプレート作成

ワークフローは以下のように作成しました。

最初の Githus Status Operation には pending タグを設定しています。

最後に成功した場合は success タグが設定されたジョブが実行されます。

失敗した場合は failure タグが設定されたジョブが実行されます。

Surveyは以下のように設定しています。

GitHub Token

これは、GitHub上で作成したTokenを設定します。

AWX NAME

これはAWXへアクセスするためのFQDNまたはIPを設定します。

そして最後に ENABLE WEBHOOK にチェックを入れて GitHub を選択します。
WEBHOOK URLWEBHOOK KEY はGitHubリポジトリに設定するため、どこか安全な場所にメモっておきます。

GitHubリポジトリのWebhook設定

リポジトリのWebhook設定をします。
対象のリポジトリの Settings をクリックします。

次に Webhooks をクリックします。

Add webhook をクリックします。

以下の部分を変更します。

項目 変更内容
Payload URL WEBHOOK URLを入力
Content type application/json
Secret WEBHOOK KEYを入力
SSL verification 自己証明書のためDisable

変更したら Add webhook をクリックします。
Webhookを追加するとAWXへワークフロー実行のリクエストが飛びます。そのため、最初の登録時はワークフローが実行されます。ちなみに、今回作成したワークフローは最初の処理で発生したリクエストに必要なキーが存在しないためエラーが発生して止まります。

デモ

実際に動かしたときのデモ動画です。

AWX Webhook demo for Ansible advent calendar 2019 from sky_joker on Vimeo.

最後に

今回はAWXでWebhook機能の検証をしましたが、この前リリースされたAnsible Tower 3.6でもこの機能が使えます。
また、この機能が実装されたばかりの時はSurveyの処理に不具合がありましたが解決されていました。

Webhook機能を使えば、テンプレートやワークフローの自動実行が可能なのでAWX/Ansible Tower側でのオペレーションが不要になるのはいいですね 🙂
この機能はCIちっくにも使えそうですが、既存のCIツールの置き換えにはならないと思っています。
例えば、既存のCIツールはYAMLでステージやコマンドをつらつらと書けば自動で解釈してフローや依存関係を形成してくれますが、この機能だとPlaybookを一つずつ書いてワークフローで組み合わせるという作業が発生するのでちょっとめんどいです。
なので適材適所で使っていく感じかなと思います。

以上!Ansible Advent Calendar 2019の1日目でした!
それでは2日目の rluisr さんへバトンを繋ぎたいと思います!よろしくお願いします!

参考

Leave a Reply

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください