mito’s blog

IT技術メインの雑記。思い立ったが吉日。

TerraformでJenkinsの構築を自動化したときのメモ

はじめに

DockerやAnsibleは使わず、terraformのfileやremort-exce、local-exceを組み合わせて自動構築します。
Jenkinsを使って何かを自動構築するのではなく、Jenkinsサーバを自動構築する記事です。


環境

  • OS : Amazon Linux 2
  • Jenkins : 2.332.2
  • Terraform : v1.1.7


java-openjdk11のインストール

OSがAmazon Linux 2なので、以下コマンドでインストールします。
Amazon Correttoでもいいかもしれません。

$ sudo yum upgrade -y
$ sudo amazon-linux-extras install -y java-openjdk11


セットアップウィザードの無効化

色々調べたのですが、Jenkinsのバージョンによって設定方法が変わるようです。

jenkins.service.d、override.confを作成し、 daemon-reload、およびサービスをリスタートします。 ただし、ログインが無効になりID/Passwordの入力無しになるので、後でそれらを有効にします。

$ pwd
/etc/systemd/system/jenkins.service.d
$ cat override.conf
[Service]
Environment="JAVA_OPTS=-Djenkins.install.runSetupWizard=false"
$ sudo systemctl daemon-reload
$ sudo systemctl restart jenkins


ログインの有効(設定の変更)

/var/lib/jenkins/config.xmlを入れ替え、サービスをリスタートします。
ログインのほか、各設定を有効・無効にしたものを用意しておくと手間が減るので、 それらを設定したJenkinsからコピーしておくと良いです。


initialAdminPasswordの取得

Jenkinsサーバにログインして確認するのは面倒なので、local-execで取得します。

  provisioner "local-exec" {
    working_dir = "${path.root}/"
    interpreter = ["/usr/bin/bash", "-c"]
    command     = <<-EOT
      echo $(ssh -o StrictHostKeyChecking=no -i key.pem ec2-user@IPアドレス "sudo cat /var/lib/jenkins/secrets/initialAdminPassword") > initialAdminPassword.txt
    EOT
  }

初回起動時にセットアップウィザードを無効にすると、ファイルinitialAdminPasswordが作成されませんでした。
そのため、セットアップウィザードを有効にした状態で初回起動した後(initialAdminPasswordの作成)、セットアップウィザードを無効にして起動しなおしました。

initialAdminPasswordの作成方法か、それを知る手順があればあればぜひ教えてください。


プラグインのインストール

セットアップウィザードを無効にしているため、そこでインストールを提案されるプラグインは入っていません。
必要なプラグインをインストールし、サービスをリスタートしてプラグインを有効化します。
なお、credencialsなどを入れていないと、ノード追加の認証方法はagent.jarによる接続しか選べませんでした。

$ sudo java -jar jenkins-cli.jar -s http://localhost:8080 -auth ユーザ名:パスワード install-plugin プラグイン名
$ sudo systemctl restart jenkins

プラグインを複数まとめてインストールしたい場合は、昨日の記事を参考にしてください。


認証情報の登録

STOREやDomainはデフォルトのまま、鍵認証とします。
Jenkins CLIを使って認証情報(credentials.xml)をインポートしますが、credentials.xmlは手動で登録したJenkinsからエクスポートすると楽に用意できます。
その際、鍵は暗号化されているためインポート前に書き換えます。

認証情報のエクスポート
$ sudo java -jar jenkins-cli.jar -s http://localhost:8080 -auth ユーザ名:パスワード list-credentials-as-xml system::system::jenkins
鍵の書き換え
chompを付けて最終行の改行を削除しないと、登録できませんでした
  provisioner "file" {
    content     = templatefile("${path.root}/credentials.xml", {KEY_PEM=chomp(鍵)})
    destination = "/tmp/credentials.xml"
  }
認証情報のインポート
$ cat /tmp/credentials.xml | sudo java -jar jenkins-cli.jar -s http://localhost:8080 -auth ユーザ名:パスワード import-credentials-as-xml system::system::jenkins

Jenkins CLIには、importではなく、createコマンドもあります。


ノードの登録

認証情報と同様の手順です。
手動でノードを登録した後、ノードの設定ファイルをエクスポートして用意し、IPアドレスなどを書き換えてからインポートします。

ノード設定ファイルの取得
$ sudo java -jar jenkins-cli.jar -s http://localhost:8080 -auth ユーザ名:パスワード get-node ノード名
IPアドレスの書き換え
固定ではないので変数を指定していますが、確か改行が入ったのでchompで消します
  provisioner "file" {
    content     = templatefile("${path.root}/ノード名.xml", {NODE_IP=chomp(IPアドレス)})
    destination = "/tmp/ノード名.xml"
  }
ノードの登録
$ cat /tmp/ノード名.xml | sudo java -jar jenkins-cli.jar -s http://localhost:8080 -auth ユーザ名:パスワード create-node ノード名

備考

Jenkins CLIでlogin、logoutコマンドはこのバージョンだと使えませんでした。
EC2で立てているので様々な情報を変数に置き換え、ノード数も可変にしたので、整理もかねて投稿!
DockerやAnsibleが使えたら楽だったかも。まぁでも、おかげで知見が増えたなぁ。