zaki work log

作業ログやら生活ログやらなんやら

[mise] 環境変数などにコマンドの実行結果をセットする

miseの環境変数などの定義のテンプレート定義には関数があり、その中のexec(command)を使えばコマンドの実行結果を参照できる。

お題

例として、以下のようなTerraformの変数ファイルがあるとして、サーバーアドレス部分("192.168.1.89")を環境変数としても持たせたい、というケース

variable "server_addr" {
  type        = string
  default     = "192.168.1.89"
  description = "server addr"
}

variable "server_port" {
  type        = string
  default     = "25443"
  description = "server port"
}

Linuxコマンドで取り出そうとするとこんな感じ(サンプルなんでクォートの類は脳内で無視してください)

$ grep server_addr -A3 variables.tf | grep default | awk -F'=' '{print $2}'
 "192.168.1.89"

mise.toml設定例

これを踏まえてmise.tomlへ記述すると、こんな感じ。
(クォートのエスケープがちょっと見づらいがそれは我慢)

[env]
SERVER_ADDR = "{{ exec(command=\"grep server_addr -A3 variables.tf | grep default | awk -F'=' '{print $2}'\") }}"

これで環境変数SERVER_ADDRにサーバーアドレスがセットされる。

$ echo $SERVER_ADDR
"192.168.1.89"

使いどころ

mise経由でコマンド実行結果を環境変数セットするのも良いけど、miseのタスクランナーのdescriptionに使用すると、タスク実行時に「現在の設定状態は〇〇だよ」というのを表示させたりできてわかりやすい。

ただしconfirmには(現時点では)filterが使えないため注意。
(むしろこっちで使いたかったかも)

[tasks.terraform-apply]
description = "create cloud resource {{ exec(command=\"grep server_addr -A3 variables.tf | grep default | awk -F'=' '{print $2}'\") }}"
confirm = "アドレス設定は確認した? (see variables.tf)"
run = """
terraform apply -auto-approve
"""

これでタスクランナーを起動すると以下の通り。

$ mise r
Tasks
Select a task to run
❯ install  create cloud resource  "192.168.1.89"
/ 
esc clear filter • enter confirm

ちなみに環境変数を参照するフィルターを使って{{ get_env(name='SERVER_ADDR') }}とも書けるが、環境変数の更新(コマンドの再実行による再評価)がリアルタイム(enter押下)でなくディレクトリ移動がトリガーになってるっぽいため、設定ファイル更新直後などで良い感じに値が更新されないことがあるので注意。
descriptionに直接exec(command)を記述した場合はmise runの実行のたびに評価される。


ということで、固定文字列であればmise.tomlに直接書いたり.envファイルで定義すればよいが、動的に値をセットしたい場合はexec(command)を使うと解決できる。