emmetog.jenkins
JenkinsのためのAnsibleロール
Ansibleを使用してJenkinsをインストールし、完全に設定します。
このロールは、すべてのJenkins設定をバージョン管理に保存したいときに使用され、Jenkinsを繰り返しかつ確実にデプロイできるようになります。また、Jenkinsをペットではなく牛として扱うことができます。
Jenkinsをインストールするロールを探していて、すべてをWebインターフェース経由で設定したい場合、また同じ完全に設定されたJenkinsを繰り返しデプロイする必要がない場合は、このロールは不要です。その場合は、geerlingguy/ansible-role-jenkinsロールを見てください。
要件
Dockerを使用してデプロイする場合、サーバーにDockerがインストールされている必要があります。現在、Docker、apt-get、yumの方法のみがサポートされていますが、他の方法も簡単に追加できます。PRを歓迎します。
インストール
Ansible Galaxyを使用してインストールします:
$ ansible-galaxy install emmetog.jenkins
ロール変数
以下の変数はJenkinsのインストール方法に影響します:
jenkins_install_via
: Jenkinsのインストール方法を制御します。重要: この変数は以下のいずれかの値に設定する必要があります:docker
: Dockerコンテナ内にインストールapt
: Ubuntu/Debian Linuxシステムに直接Jenkinsをインストールyum
: RedHat/CentOS Linuxシステムに直接Jenkinsをインストール
jenkins_version
: インストールするJenkinsの正確なバージョン
以下の変数はJenkinsの設定方法に影響します:
jenkins_url
: JenkinsにアクセスするためのURLjenkins_port
: Jenkinsがリッスンするポートjenkins_home
: Jenkins設定が保存されるサーバー上のディレクトリjenkins_admin
: Jenkinsサーバーの管理者のメールアドレスjenkins_java_opts
: Java実行可能ファイルに渡されるオプションjenkins_config_owner
: Jenkins設定ファイルの所有者jenkins_config_group
: Jenkins設定ファイルのグループjenkins_auth
: AnsibleがJenkinsと認証する方法、(下記の「認証とセキュリティ」セクションを参照)jenkins_url_health_check
: Jenkinsが起動した後のヘルスチェックに使用するURL(デフォルトはjenkins_url
)jenkins_health_check_user
: 定義されていれば、ヘルスチェックにこのユーザー名で基本認証を使用(例:Google OAuthを設定した場合に便利)jenkins_health_check_password
: 定義されていれば、ヘルスチェックにこのパスワードで基本認証を使用(例:Google OAuthを設定した場合に便利)
以下のリスト変数はJenkinsでインストールされるジョブ/プラグインに影響します:
jenkins_jobs
: Jenkinsにコピーするジョブの名前一覧。config.xml
ファイルはjenkins_source_dir_jobs/<job_name>
に存在する必要があります。jenkins_plugins
: JenkinsにインストールするプラグインIDのリスト。jenkins_custom_plugins
: Jenkinsにインストールするカスタムプラグインのリスト。
完全な変数のリストについては、defaults/main.yml
を参照してください。
例のプレイブック
- hosts: jenkins
vars:
jenkins_version: "2.73.1"
jenkins_hostname: "jenkins.example.com"
jenkins_port: 8080
jenkins_install_via: "docker"
jenkins_jobs:
- "my-first-job"
- "another-awesome-job"
jenkins_include_secrets: true
jenkins_include_custom_files: true
jenkins_custom_files:
- src: "jenkins.plugins.openstack.compute.UserDataConfig.xml"
dest: "jenkins.plugins.openstack.compute.UserDataConfig.xml"
jenkins_plugins:
- git
- blueocean
jenkins_custom_plugins:
- "openstack-cloud-plugin/openstack-cloud.jpi"
roles:
- emmetog.jenkins
設定ファイルの管理
上記の例では、{{ playbook_dir }}/jenkins-configs/jobs/my-first-job/config.xml
および{{ playbook_dir }}/jenkins-configs/jobs/another-awesome-job/config.xml
にジョブ設定ファイルを探します。
注意: これらのディレクトリはカスタマイズ可能です。jenkins_source_dir_configs
およびjenkins_source_dir_jobs
ロール変数を参照してください。
ロールはまた、{{ playbook_dir }}/jenkins-configs/config.xml
を探します。このconfig.xml
ファイルはサーバーにコピーされ、ジョブ設定のテンプレートとして使用されます。
上記の例では、{{ playbook_dir }}/jenkins-configs/secrets
にあるすべてのシークレットディレクトリもアップロードされ、{{ jenkins_custom_files }}
変数で定義されたカスタムファイルもコピーされます。{{ jenkins_include_secrets }}
および{{ jenkins_include_custom_files }}
変数は、これらの機能を有効にするためにtrue
に設定する必要があります。追加で、ロールは{{ jenkins_custom_plugins }}
リスト変数に.jpiまたは.hpiファイルを提供することでカスタムプラグインをインストールできます。
config.xml
およびカスタムファイルはテンプレートとして扱われるため、変数を含めることができ、Ansibleボールトの機密データも含められます。
設定ファイルを変更したり、新しい項目(ジョブ、プラグインなど)を追加したりする場合の通常のワークフローは次のとおりです:
- Jenkins UIで変更を行う
- 結果のXMLファイルをバージョン管理システムにコピーする
- 新しく作成されたファイルについては、それぞれのリストに追加することを忘れないでください:
- 新しいジョブの場合、
jenkins_jobs
に追加する必要があります - カスタムファイルの場合、
jenkins_include_custom_files
に追加する必要があります - カスタムプラグインの場合、
jenkins_custom_plugins
に追加する必要があります
Jenkins設定ファイルの例
{{ jenkins_source_dir_configs }}/config.xml
にグローバルなJenkins設定を入力します。例えば:
<?xml version='1.1' encoding='UTF-8'?>
<hudson>
<disabledAdministrativeMonitors/>
<version>2.176.1</version>
<installStateName>RESTART</installStateName>
<numExecutors>1</numExecutors>
<mode>EXCLUSIVE</mode>
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
<disableSignup>false</disableSignup>
<enableCaptcha>false</enableCaptcha>
</securityRealm>
<disableRememberMe>false</disableRememberMe>
<projectNamingStrategy class="jenkins.model.ProjectNamingStrategy$DefaultProjectNamingStrategy"/>
<workspaceDir>${JENKINS_HOME}/workspace/${ITEM_FULLNAME}</workspaceDir>
<buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>
<markupFormatter class="hudson.markup.EscapedMarkupFormatter"/>
<jdks/>
<viewsTabBar class="hudson.views.DefaultViewsTabBar"/>
<myViewsTabBar class="hudson.views.DefaultMyViewsTabBar"/>
<clouds/>
<quietPeriod>0</quietPeriod>
<scmCheckoutRetryCount>0</scmCheckoutRetryCount>
<views>
<hudson.model.AllView>
<owner class="hudson" reference="../../.."/>
<name>all</name>
<filterExecutors>false</filterExecutors>
<filterQueue>false</filterQueue>
<properties class="hudson.model.View$PropertyList"/>
</hudson.model.AllView>
</views>
<primaryView>all</primaryView>
<slaveAgentPort>0</slaveAgentPort>
<disabledAgentProtocols>
<string>JNLP-connect</string>
<string>JNLP2-connect</string>
</disabledAgentProtocols>
<label>master</label>
<crumbIssuer class="hudson.security.csrf.DefaultCrumbIssuer">
<excludeClientIPFromCrumb>false</excludeClientIPFromCrumb>
</crumbIssuer>
<nodeProperties/>
<globalNodeProperties/>
</hudson>
ジョブ設定ファイルの例
{{ playbook_dir }}/jenkins-configs/jobs/my-first-job/config.xml
に次のような内容を配置できます:
<?xml version='1.0' encoding='UTF-8'?>
<project>
<actions/>
<description>私の最初のジョブ。 "こんにちは世界" と言います。</description>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers/>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>echo "こんにちは世界!"</command>
</hudson.tasks.Shell>
</builders>
<publishers/>
<buildWrappers/>
</project>
認証とセキュリティ
このロールはJenkinsのための次の認証メカニズムをサポートしています:
- APIトークンを使用した認証(推奨、Jenkins 2.96以上が必要)
- Strict Crumb Issuerプラグインを使用したcrumb認証(APIトークンを使用しない場合に必要、Jenkins 2.176.2以降が必要)
- セキュリティなし(推奨しません)
APIトークンベースの認証
APIトークンを使用した認証は推奨されますが、設定には少し手間がかかります。APIトークンの利点は、Jenkinsで簡単に取り消すことができ、その使用も追跡されることです。APIトークンはcrumbトークンを取得する必要がなく、Jenkinsバージョン2.172.2以降は難しくなっています(こちらのセキュリティ通知を参照)。
APIトークンを作成するには、次の手順を行います:
- すべてのAPIトークンは特定のユーザーに所属する必要があります。デプロイ用の特別なユーザーを作成するか、管理者または他のアカウントでログインします。
- ユーザーの設定ページで「新しいトークンを追加」ボタンをクリックします。
- トークンの値を保存します。できればAnsibleボールトに保存してください。
- プレイブックに次の変数を定義します:
jenkins_auth: "api"
jenkins_api_token: "(Ansibleボールトで定義されたトークン)"
jenkins_api_username: "(Ansibleボールトで定義されたユーザー名)"
$JENKINS_HOME/users/the_username/config.xml
ファイルのバックアップを作成します。ここでthe_username
は、作成したAPIトークンの所有者に対応するユーザー名です。- このファイルをコントロールホストに追加し、
jenkins_custom_files
リストにデプロイされるようにしてください。
src
の値は、プレイブックに関連付けたコントロールマシン上でのファイルの保存場所に応じて変更する必要があるかもしれません。
Crumbベースの認証
Crumbベースの認証は、クロスサイトリクエストフォージェリ攻撃を防ぐために使用でき、APIトークンが不都合な場合に推奨されます。注意: crumbベースの認証は「誰でも何でも操作できます」というアクセス制御設定でのみ機能します。Jenkinsの設定がより厳格なセキュリティを必要とする場合は、上記に記載されたAPIトークンを使用してください。
Crumbベースの認証は、最近のJenkinsのセキュリティ修正により、設定が少し難しくなることがあります。CSRFを設定するには、次の手順を行います:
- Jenkins >= 2.176.2を使用している場合、Strict Crumb Issuerプラグインをインストールする必要があります。このロールによって
jenkins_plugins
リストにstrict-crumb-issuer
IDを追加することでインストールできます。 - Jenkinsで「Jenkinsの管理」 -> 「全体のセキュリティを設定」をクリックします。
- 「CSRF保護」セクションで、「クロスサイトリクエストフォージェリの攻撃を防ぐ」を有効にし、Jenkins >= 2.176.2を使用している場合は「Strict Crumb Issuer」、それ以外の場合は「Default Crumb Issuer」を選択します。このオプションを表示するには、Strict Crumb Issuerプラグインがインストールされている必要があります。その後、メインJenkinsの
config.xml
ファイルをコントロールホストにバックアップする必要があります。
上記の手順を実行するには、少なくともAnsible 2.9.0pre5または2.10(執筆時点で両方とも開発中)である必要があります。詳細についてはこちらのAnsibleのissueを参照してください。
HTTPS
JenkinsでHTTPSを有効にするには、次の手順を行います:
jenkins_port_https
にJenkinsがリッスンするポートを定義します- JKSキーストアまたはCA署名証明書のいずれかの変数を定義します:
- JKSキーストアの場合、次の変数を定義する必要があります:
jenkins_https_keystore
: コントロールホスト上のキーストアファイルのパス。これはこのロールによってJenkinsサーバーにコピーされます。jenkins_https_keystore_password
: 指定されたJKSキーストアのパスワード。Ansibleボールトを使用することを推奨します。重要: この文字列はサーバー上のJenkins設定ファイルに平文で書き込まれます。また、サーバーのプロセスリストにも表示されます。署名証明書ファイルへの移行を検討してください(以下参照)。
- CA署名の証明書ファイルの場合、次の変数を定義する必要があります:
jenkins_https_certificate
: 証明書ファイルのパス。これはこのロールによってJenkinsサーバーにコピーされます。Ansibleボールトを使用することを推奨します。jenkins_https_private_key
: CA署名証明書のためのプライベートキー。Ansibleボールトを使用することを推奨します。
- JKSキーストアの場合、次の変数を定義する必要があります:
- 必要に応じて、自己署名証明書を使用している場合は、
jenkins_https_validate_certs
をfalse
に設定します。
JenkinsをDockerでデプロイする場合は、Jenkins自体を設定するのではなく、jwilder/nginx-proxyやtraefikのようなリバースプロキシを使用することをお勧めします。これにより、少し柔軟性が得られ、責任の分離が可能になります。これらのプロジェクトのドキュメントを参照して、プロキシをデプロイし、HTTPSを設定する方法を確認してください。
Jenkinsインスタンスの前にリバースプロキシを使用してDockerを使用してデプロイする場合、jenkins_docker_expose_port
変数をfalse
に設定して、ポートがホストに公開されないようにする必要があります。リバースプロキシにのみ公開されるようにします。
ライセンス
MIT
作成者情報
エメット・オグレイディによって愛情を込めて作成されました。
私はNimbleCIの創設者で、GithubのフィーチャーブランチワークフロープロジェクトのためのDockerコンテナを構築しています。
私の個人的なブログでブログを書いたり、NimbleCIブログでDocker関連のことについて書いています。
Installs and completely configures Jenkins using Ansible
ansible-galaxy install emmetog.jenkins