Cloud provisioning with Bolt

Cloud provisioning with Bolt

このブログを動かしているサーバーは Terraform で構築しています。

とりあえずでプロビジョニングも Terraform で行なっていたのですが、いいかげん辛くなってきたので Bolt を使ったプロビジョニングに移行しました。

ツールとしては Ansible を今まで個人サーバーを構築する際に使っていたのですが、Bolt を今まで使ったことがなかったので選んでみました。

Bolt の概念

Bolt は Puppet Lab の開発した割と新しめのオーケストレーションツールです。Puppet との違いは対象のサーバーにエージェントソフトウェアを入れなくても使える点です。
Puppet の知識がなくても使う事ができ、やろうと思えば Puppet の機能を使用することも出来ます。

Bolt は任意のスクリプトやコマンドを複数のサーバーに実行する事ができます。
任意のスクリプトに説明などのメタデータを加えるなど再利用生を持たせたものをタスクと呼びます。
複数のタスクを 1 つのプランとしてまとめることができ、複数のプランを 1 つのプランにまとめることができます。
また、プランはモジュールとしてまとめられます。大雑把に モジュール > プランs > タスクs の関係。
プランやタスクを作成するディレクトリの階層には決まりがあり、この決まりに従って bolt コマンド使用時の呼び出し方が決まります。

以下のチュートリアルで基本を一通り学べました。

私の構成

Bolt の一連のファイルは Boltdir 以下にまとめています。このディレクトリ構成は Embedded project directory 構成です。

現在の構成は以下。

  • inventory.yaml に接続先の情報が入っています。
  • site-modules 以下に独自に作成したモジュールを保管します。
  • files や templates はモジュール内で使用するファイルやテンプレートが保管されています。
  • init と付いているファイルはデフォルトで実行されるプラン/タスクです。
Boltdir
├── inventory.yaml
└── site-modules
    ├── add_swap
    │   ├── files
    │   │   └── fstab
    │   └── plans
    │       └── init.pp
    ├── consul
    │   ├── files
    │   │   └── consul.service
    │   ├── plans
    │   │   └── init.pp
    │   └── templates
    │       └── consul.hcl.epp
    ├── install_utils
    │   └── plans
    │       └── init.pp
    ├── nomad
    │   ├── files
    │   │   └── nomad.service
    │   ├── plans
    │   │   └── init.pp
    │   └── templates
    │       └── nomad.hcl.epp
    ├── provision
    │   └── plans
    │       └── init.pp
    └── services
        └── plans
            └── init.pp

見ての通りタスクがなく全てプランで済ませていますが 1 つのプランに複数の処理が含まれる場合はタスクに切り出すことを検討した方が良さそう。

provision モジュールのプランから全てのプランを呼んでいます。

plan provision (
  TargetSpec $targets,
  String     $do_token = 'This is not production environment.'
) {
  run_plan('add_swap', $targets)
  run_plan('install_utils', $targets)
  run_plan('consul', $targets, 'do_token' => $do_token)
  run_plan('nomad', $targets)
  run_plan('services', $targets)
}

これにより以下のように 1 つのコマンドでプロビジョニングを完了させます。

$ bolt plan run provision targets=production

感想

今のサーバーだと基本的に Nomad を使用し全てのソフトウェアを Docker コンテナで動かしているのであまり Bolt を使用した設定はないのだけれど、それでも Nomad やその周辺のツールの設定変更や管理が格段に楽になった!✨
Terraform でその辺やると初期構築時はいいけど変更が無理ぽでな…。

Bolt、まだ細かい学びを書き切れてないので少しづつ書き残していきたい。