The Inside Playbook

GitHub Actions と Red Hat Ansible Tower で高速な CI システムを構築する

2019年7月28日(日本語)、寄稿者:Sean Cavanaugh (ショーン・キャバノー)

Red Hat Ansible Tower は、Ansible Playbook の API (アプリケーション・プログラミング・インタフェース) のようなものです。導入済みツールのエコシステムに適合させられるため、Web UI を利用しない場合も、多くの Ansible ユーザーにメリットがあります。Ansible Tower で API を使ったことがなく、どこから始めたらいいかわからないという方のために、このブログ記事では、私が Github Actions と Red Hat Ansible Tower を連係させた際の手順をご紹介します。今回の目標は、「Ansible Tower ワークフローを使って、Github の PR (プルリクエスト) をトリガーとしてワークフロー・テンプレートを走らせ、自動的にテストを行う」ことでした。テスト自動化の実装を考えた動機としては、私が書いた Ansible Playbook の利用者が増えていたこともあり、コミュニティで利用されているものを不注意で壊すことがないようにしたかったためです。

今回作成した Red Hat Ansible Tower ワークフローでは、AWS (Amazon Web Services) でインスタンスをプロビジョニングし、プロビジョニングされた Red Hat Enterprise Linux コントロールノードでいくつかの Ansible Playbook を実行し、終了処理を実行。その後、インスタンス、VPC、その他のアーティファクトを AWS から削除します。プロビジョニング、テスト、終了処理というこのプロセスにより、Github リポジトリへの変更が、必ず系統的なテストを経てから master ブランチにマージされるようにできます。また、時間の節約にもなります。これはまさに自動化の強みです。

自動化ワークフローを構築する際の最良のアプローチは、テストケースを個別のテスト項目に細分化し、それぞれのテストで問題ないことを複数回確認できてから、次のものを追加することだと私は考えています。作成済みの Ansible Tower ワークフローが問題なく機能するかどうかの検証はここでは扱いませんが、API を使い始めるよりも前に、その確認はできているものとします。Github Actions の使用開始前にもう一つ行っておきたいのは、API リクエストが正常に機能していることの確認です。Ansible Tower の Browsable API を使用すれば必要なコマンドがわかるので、https://..com/api に移動して、実行したいことを見つけます。今回やりたいことは、ジョブテンプレートを起動して、Ansible Tower にワークフロー全体を実行させることです。

ドキュメントには、curl を使用して Ansible Tower API とやりとりする例がありますので、そちらも参考にしてください。https://docs.ansible.com/ansible-tower/latest/html/administration/tipsandtricks.html#launching-jobs-with-curl

HTTPie

curl とは別に、HTTPie というオープンソースのコマンドライン HTTP クライアントがあり、こちらも人気です。HTTPie は、CLI と Web サービスのインタラクションを、可能な限り使いやすいものにすることを目指しています。たとえば、Ansible Tower に対する API リクエストは、HTTPie を使用するとこのようになります。

~ http POST https://ansible.io/api/v2/job_templates/84/launch/ --auth seanc:password123!

この HTTPie コマンドではジョブ 84 を起動させています。84 というのは、私のワークフロー・ジョブテンプレートの一意の識別子です。自分のジョブのジョブ ID は、Browsable API でジョブを一覧表示するか、Web UI でブラウザウィンドウのアドレスバーを見れば確認できます。

認証についての補足:HTTPie は OAuth を含むさまざまな認証プラグインをサポートしています。上記の簡単な例では、偽のパスワードをプレーンテキストで表示しています。認証については、こちらに詳しい説明があります。https://github.com/jakubroztocil/httpie#11authentication

GitHub Actions

HTTPie を持ち出したのは、すでに Github Actions で Action として使えるようになっているからです。自分で使うために、HTTPie の仕組み、必要なパラメーター、リクエストの認証方法を確認したのですが、使い方は簡単で、私の古いノート型 Mac でも動作しました。HTTPie にしたのは、別に curl に不満があるからではなく、単に Github Actions で動作した前例があるものを使おうと考えたからです。同じ処理を実行する方法は他にもたくさんあると思います。

HTTPie が使えることを確認できたので、Github Actions ワークフローの構築を始めます。リポジトリの Github Actions タブを初めてクリックすると、空白のページに「Create a new workflow」という緑色のボタンが表示されます。

このボタンをクリックし、ワークフローファイルに名前を付けます (私はデフォルト名を使用しました)。次に、「create a new workflow」という青色のテキストをクリックします。すると、デフォルトでビジュアルエディタに遷移します。ここで、ワークフローに名前を付けることができます。このブログ記事では、これ以上ビジュアルエディタを使用しないで、上部の「<> Edit file」タブを使用します。

Github Action を作成する際には、ワークフローファイルを作成します。ビジュアルエディタを使用している場合、このワークフローファイルは自動的に作成されます。今回私がやりたいのは、プルリクエストを受信したら何らかの動作をトリガーするというシンプルな処理です。プルリクエストは、コミュニティのメンバーが変更を Github リポジトリにマージしようとする際に使います。この Github プルリクエストを受信したら Ansible Tower に API リクエストを送信し、ワークフロー・ジョブテンプレートを起動させるようにしたいと思います。

Github Actions ドキュメントを読み、利用可能な Action を調べ、HTTPie Github Action (詳細はこちら) を使うことに決めた後、次のような Github Actions ワークフローファイルを作成しました。

workflow "Linklight Test Workflow" {
 on = "pull_request"
 resolves = ["Call httpbin"]
}

action "Call httpbin" {
 uses = "swinton/httpie.action@master"
 args = ["POST", "https://ansible.io/api/v2/job_templates/84/launch/", "--auth=$USER_PASSWORD"]
 secrets = ["USER_PASSWORD"]
}

ご覧のとおり、きわめてシンプルな Github Action ワークフローファイルです。いずれかのブランチでプルリクエストを受信したら、ワークフローテンプレートを実行する Red Hat Ansible Tower ジョブへの HTTPie リクエストを送信します。一カ所だけ手間取ったのは、認証情報の格納でした。ビジュアルエディタを使えば、Action をクリックしてシークレットを追加という簡単な操作でできそうです。私の場合は、USER_PASSWORD という変数を作成してユーザー名とパスワードを格納しました (上記参照)。SECRET_KEY は USER_PASSWORD、Secret の値は単純にパスワードです (例:seanc:password123!)。

次に、テスト用のリポジトリを作成して、この新しい Github Action ワークフローでいろいろ実験してみました。あるテストブランチから別のテストブランチにテストのプルリクエストを送信したところ、なんとわずか 4 - 5 秒で表示されました。

「Call httpbin」は、Github Action ワークフローファイルで指定した名前です。「Details」リンクをクリックすれば、API リクエストと、Red Hat Ansible Tower の応答を確認できます。将来的にはもっと機能の充実した実例を紹介したいと思っていますが、今回はいくつかの例を見ただけでかなり簡単に当初の目的を達成できました。Github Actions について私に教え、ベータ版への登録を勧めてくれた Chris Short 氏に心から感謝します。

お問い合わせ・製品のご紹介

Red Hat Ansible Automationについてのお問い合わせは

ansible-jp@redhat.com

Red Hat Ansible Automation製品について

詳細はこちら