JenkinsからAnsibleにパラメータを渡してジョブを実行する
前田です。
最近は継続的インテグレーションツールにJenkinsを使っています。
今までずっとCircleCIを使ってきたので、UIなどにまだ全然慣れていないですが、少しずつ覚えていっています。
現在扱っているシステムは下記のような感じで、JenkinsからAnsibleを使ってサーバの環境構築やデプロイをしています。
アプリケーションやAnsibleなどの構成管理のソースコードはGitHubなどで管理していることが多いと思いますが、DBの接続情報などの環境によって値が変わったり、セキュアにしなければいけないパラメータなどは、直接ソースコードに記載するのではなく、JenkinsやCircleCIなどのインテグレーションサービスにパラメータを設定し、デプロイ時に動的にセットしてあげるのがセオリーだと思います。
JenkinsからAnsible(Jenkins Ansible plugin使用)でサーバの環境構築をする際に、サーバやアプリケーション固有の情報(DBの接続情報など)を構築対象のサーバに渡してあげる為、どうやって渡すかの方法を色々調査しましたので、その方法を書きたいと思います。
環境 | バージョン |
---|---|
Jenkins version | 1.645 |
Jenkins Ansible Plugin | 0.6.2 |
Jenkinsのパラメータ設定
Jenkinsのパラメータは、全ジョブ全体のグローバルパラメータと、ジョブ毎のパラメータがあります。
それぞれで同じ名前を設定した場合は、ジョブ毎のパラメータが優先されます。
ケースによって、どちらかに値を設定します。
グローバルパラメータの設定方法
Jenkinsトップ -> Jenkinsの管理 -> システムの設定 -> グローバルプロパティの「環境変数」チェックボックス
「追加」ボタンをクリックして、設定したいパラメータを設定していきます。
ジョブ毎のパラメータの設定方法
Jenkinsトップ -> 設定したいジョブを選択 -> 設定 -> 「ビルドのパラメータ化」チェックボックス
「パラメータの追加」 -> 「文字列」を選択し、「名前」にキー、「デフォルト値」に渡したいパラメータを設定していきます。
Ansibleジョブの設定
次にAnsible実行時にパラメータをセットする方法です。
Jenkinsトップ -> 設定したいジョブを選択 -> 設定 -> invoke Ansible Playbook -> 高度な設定
Additional parameters
に下記のようにパラメータを追加します。
--extra-vars '{"db_host":"${DB_HOST}"}'
この設定は、Jenkinsのグローバルパラメータやジョブ毎のパラメータに設定したDB_HOST
というパラメータを受け取り、Ansible側のdb_host
パラメータを上書いてAnsibleを実行します。
以上、簡単ですが「JenkinsからAnsibleにパラメータを渡して環境構築する方法」でした。
完全に個人的な目線ですが、Jenkinsは色々クセがあって、CircleCIなどのようには直感的に動かせないところがつらいですが、自由度はかなり高そうなので、色々触ってみると面白いかもと思っています。
参考 : How to pass parameter from Jenkins job to Ansible playbook