【Codex】Terraform/Ansibleでの監視用VMセットアップをお願いしてみた

こんにちは、キクです。

最近は周りでもCodex利用者が増えていく中で、僕はいまひとつ手を出せない状況が続いていました。

とはいえ、便利なのは知ってるので「何か活用してみたいなー」とは思っていました。

そこで今回は練習も兼ねて自宅のProxmox環境上に監視用VMのセットアップをお願いしてみようと考えました!

最初の一歩なので、あまり複雑なことはさせていないですが、一旦は上手く動いてくれたので記録用として記事にしておこうと思います。

それでは、よろしくお願いします。

今回の構想

まずは、今回のどのようなことをしたいのかを簡単に整理しておきます。

仕事の中で「Terraformも使ってIaC化も進めていきたい」という流れもあるのですが、僕はCodexだけでなくTerraformもほとんど触ったことがなく・・・。

そのため、今回はその辺りも含めて練習してみます。

具体的にはCodexにお願いして、以下を実現するコードを作ってもらう方向で進めます。

今回の構想

  • VM作成:Terraform
  • 監視ツールの導入:Ansible
  • 監視ツールの設定:Ansible

僕は作成されたコードを実行するだけで監視VMができあがるという状態に持っていければ成功とします。

Codexにお願いした内容

Codexとの会話を全て書くのは不毛なので、一番最初にどんな内容を依頼したかだけ残しておきます。

[一次依頼文]
自宅のミニPCでProxmoxが稼働しています
その上でPrometheusサーバVMを構築して、Grafanaで監視用ダッシュボードを整備したいです
また、これらは可能な限りコード管理できるようにしたいなと思ってます(TerraformやAnsibleなど)
なお、Proxmox上にはUbuntu導入済みのテンプレートは存在します

これらを踏まえて、どの作業をどのような方法で進めるべきかの整理から手伝ってください

すると、Codexからは以下のような回答が得られました。

[一次回答]
いいですね。これは最初に境界線をきれいに引くと、かなり気持ちよく育てられます。
おすすめ方針
Terraform/OpenTofuで「Proxmox上のVM」を作り、Ansibleで「Ubuntu VM内の設定」を行い、Prometheus/Grafanaの設定ファイルとダッシュボードをGit管理する、という分担がよさそうです。
・Terraform: Proxmox VM作成、clone、CPU/RAM/disk、ネットワーク、cloud-init、IP、SSH鍵
・Ansible: OS初期設定、Docker/Composeまたはsystemdサービス、Prometheus/Grafana配置、exporter配置
・Prometheus: prometheus.yml、scrape target、alert ruleをGit管理
・Grafana: datasourceとdashboard JSONをprovisioningでGit管理

手動: Proxmox APIトークン作成、初回の接続確認、場合によってはGrafana UIで作ったdashboardのJSON export

最初の構成案
自宅ミニPCなら、まずはPrometheusとGrafanaを同じUbuntu VMに載せる構成で十分です。
Proxmox
  ├─ monitoring-vm
  │   ├─ Prometheus
  │   ├─ Grafana
  │   ├─ node_exporter
  │   └─ optional: blackbox_exporter / alertmanager
  ├─ Proxmox host metrics
  └─ other VMs / services

VMはまず 2 vCPU / 4GB RAM / 40〜80GB disk くらいからでよいと思います。
保持期間は最初は15〜30日程度にして、ディスク消費を見ながら調整するのが安全です。

最初からいい感じの案を出してくれたので、これをベースに会話して詰めていきました。

Codexからの成果物

会話を重ねていく中でCodexが用意してくれた成果物について簡単にご紹介します。

作業ディレクトリ直下

作業ディレクトリ/
├─ README.md
├─ Makefile
├─ ansible.cfg
├─ .gitignore
├─ terraform/
├─ ansible/
├─ monitoring/
└─ docs/
ファイル/ディレクトリ説明
README.md全体概要と初回手順
Makefileよく使うコマンドのショートカット
ansible.cfgAnsibleの設定
.gitignoreGitに入れないファイルの指定
terraform/監視VM作成用
ansible/監視VM内設定用
monitoring/監視設定用
docs/作業メモ・運用メモ

Terraform

Terraformは Proxmox上にVMを作る担当になります。

terraform/
└─ proxmox-monitoring-vm/
   ├─ versions.tf
   ├─ providers.tf
   ├─ variables.tf
   ├─ main.tf
   ├─ outputs.tf
   ├─ terraform.tfvars.example
   ├─ terraform.tfvars
   ├─ terraform.tfstate
   ├─ terraform.tfstate.backup
   ├─ .terraform.lock.hcl
   └─ README.m
ファイル説明
versions.tfTerraform/providerのバージョン指定
providers.tfProxmoxへの接続設定
variables.tf使う変数の定義
main.tfVM作成の本体
outputs.tfterraform output で出す値
terraform.tfvars.example実値ファイルの見本
terraform.tfvars実際のProxmox URL、API token、VM ID、IPなど
.terraform.lock.hclproviderバージョン固定
terraform.tfstateTerraformの管理台帳
terraform.tfstate.backupstateのバックアップ
README.mdTerraform部分の簡単な説明
キク

*.tfは設計図、terraform.tfvarsは自身の環境の値を入力するという感じのようですね

今回、terraform.tfvarsには以下のような内容を設定しました。

[抜粋]
template_vm_id = 9000

vm_name           = "home-monitor"
vm_id             = 500
vm_cpu_cores      = 2
vm_memory_mb      = 4096
vm_network_bridge = "vmbr0"

vm_ipv4_address = "192.168.10.250/24"
vm_ipv4_gateway = "192.168.10.1"
dns_servers     = ["192.168.10.1"]

manage_boot_disk     = false
vm_disk_datastore_id = "local-lvm"
vm_disk_interface    = "scsi0"
vm_disk_size_gb      = 64

vm_cpu_type = "host"

Proxmox上に既に存在するテンプレートを利用しようと思っていたのでテンプレートIDを指定したり、その他にもVMのパラメータを指定しています。

Ansible

Ansibleは 作成済みVMの中身を設定する担当になります。

ansible/
├─ inventory/
│  ├─ hosts.ini
│  ├─ hosts.ini.example
│  └─ group_vars/
│     ├─ monitoring.yml
│     └─ monitoring.yml.example
├─ playbooks/
│  └─ site.yml
└─ roles/
   ├─ common/
   ├─ prometheus/
   ├─ node_exporter/
   └─ grafana/
ファイル/ディレクトリ説明
inventory/hosts.iniAnsibleの接続先VM。IPとSSHユーザを書く
inventory/hosts.ini.examplehosts.ini の見本
inventory/group_vars/monitoring.ymlGrafanaパスワードやPrometheusバージョンなど
inventory/group_vars/monitoring.yml.example変数ファイルの見本
playbooks/site.ymlAnsible実行の入口
roles/common/共通初期設定
roles/prometheus/Prometheusを入れる
roles/node_exporter/node_exporterを入れる
roles/grafana/Grafanaを入れる

monitoring

monitoring/Prometheus / Grafanaの設定そのものになります。

monitoring/
├─ prometheus/
│  ├─ prometheus.yml
│  ├─ targets/
│  │  └─ linux_nodes.yml
│  └─ rules/
│     └─ host_alerts.yml
└─ grafana/
   ├─ provisioning/
   │  ├─ datasources/
   │  │  └─ prometheus.yml
   │  └─ dashboards/
   │     └─ default.yml
   └─ dashboards/
      └─ system-overview.json
ファイル説明
prometheus/prometheus.ymlPrometheusのメイン設定
prometheus/targets/linux_nodes.ymlLinux監視対象一覧
prometheus/rules/host_alerts.ymlCPU/メモリ/ディスク/down検知のalert rule
grafana/provisioning/datasources/prometheus.ymlGrafanaにPrometheus datasourceを登録
grafana/provisioning/dashboards/default.ymlGrafanaにdashboard JSONを読み込ませる設定
grafana/dashboards/system-overview.json表示中のSystem Overviewダッシュボード

これらのファイルは、先程のAnsibleから適宜monitoring配下にあるファイルを取得させて使えるように配置してあります。

例えば、AnsibleのPrometheus用main.ymlには以下のように記載してCopy対象として利用しています。

- name: Copy Prometheus configuration
  ansible.builtin.copy:
    src: "{{ playbook_dir }}/../../monitoring/prometheus/"
    dest: "{{ prometheus_config_dir }}/"
    owner: root
    group: "{{ prometheus_group }}"
    mode: preserve
  notify: Restart prometheus

docs

docsには、各種メモが蓄積されていきます。

docs/
└─ runbook.md
ファイル説明
runbook.md作業メモ、運用メモ、トラブルシュート

今回の場合、Proxmox権限エラーやAnsible実行時に何度かトラブったのですが、そういった内容のメモをCodexが残してくれていました。

# Runbook

## 作業方針

このリポジトリでは、VMの外側と内側を分けて管理します。

- Terraform: Proxmox API経由で監視VMを作成する
- Ansible: 監視VMへSSHし、Prometheus/node_exporter/Grafanaをsystemdサービスとして整える
- Prometheus/Grafana: 設定ファイル、rules、dashboardsをGitで管理する

~省略~

### CPU typeのエラーが出た場合

次のようなエラーは、指定したCPU typeがそのProxmox環境で使えない状態です。

```text
Built-in cputype 'x86-64-v2-AES' is not defined
```

単一ノードの自宅環境では、`terraform.tfvars` に次を指定します。

```hcl
vm_cpu_type = "host"
```

複数ノードでlive migrationしたい場合は、各ノードで使える共通CPU typeを選びます。

~省略~

変更したい内容ごとの触る場所

やりたいこと触る場所
VM名・VM ID・CPU・メモリを変えるterraform/proxmox-monitoring-vm/terraform.tfvars
VMのIPを変えるterraform.tfvarsansible/inventory/hosts.ini
Ansibleの接続先を変えるansible/inventory/hosts.ini
Grafanaパスワードを変えるansible/inventory/group_vars/monitoring.yml
Prometheus保存期間を変えるansible/inventory/group_vars/monitoring.yml
監視対象を追加するmonitoring/prometheus/targets/linux_nodes.yml
alert ruleを追加するmonitoring/prometheus/rules/host_alerts.yml
Grafanaダッシュボードを変えるmonitoring/grafana/dashboards/system-overview.json
インストール手順を変えるansible/roles/

コード実行前の準備

作業PCでの環境構築

今回はTerraformとAnsibleを使いますが、自宅でこれらを動かしたことがないので、環境構築方法もCodexに教わりました。

$ brew tap hashicorp/tap
  = HomebrewにHashiCorp公式の配布元を追加

$ brew install hashicorp/tap/terraform
  = Terraformをインストール

$ brew install pipx
  = Python製CLIツールを安全に入れる道具をインストール

$ pipx ensurepath
  = pipxで入れたコマンドを使えるようPATH設定

$ pipx install --include-deps ansible
  = Ansibleを隔離環境にインストール

以下のコマンドにて無事にインストールできているかを確認します。

$ terraform version
$ ansible --version
[実行例]
$ terraform version
Terraform v1.15.8
on darwin_amd64

$ ansible --version
ansible [core 2.18.7]
  config file = None
  configured module search path = ['/Users/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/11.8.0/libexec/lib/python3.13/site-packages/ansible
  ansible collection location = /Users/user/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.13.5 (main, Jun 11 2025, 15:36:57) [Clang 17.0.0 (clang-1700.0.13.3)] (/usr/local/Cellar/ansible/11.8.0/libexec/bin/python)
  jinja version = 3.1.6
  libyaml = True

Proxmox側の準備

あとは、TerraformでVMを作成するProxmoxにて以下を実施しました。

Proxmox手動作業

  • API Tokensの発行
  • 発行したAPI TokenへのRole割り当て
キク

API Tokenを発行しただけで満足してTerraformを実行したら「権限がないから実行できない!」と怒られたので、Roleの割り当てもお忘れなく・・・笑

いざコード実行

Terraform実行:VM作成

作業PCにて以下を実行していきます。

$ cd terraform/proxmox-monitoring-vm
$ terraform init
$ terraform fmt
$ terraform validate
$ terraform plan
$ terraform apply

terraform init

目的:Terraform作業ディレクトリを初期化する

主にやること

  • 必要なproviderをダウンロード
  • .terraform/ ディレクトリを作成
  • .terraform.lock.hcl を作成/更新

今回の場合、Proxmoxを操作するためのbpg/proxmox providerを準備する。

terraform fmt

目的:Terraformファイルの書式を自動整形する

各コード類で書かれている意味は変えずにインデントの不備などを調整してくれる。

主な対象

  • *.tfファイル
  • *.tfvarsファイル

後続のterraform plan前に流しておくとコードが読みやすくなる

以下の場合、terraform.tfvarsを調整してくれたことになります。

[実行例]
$ terraform fmt
terraform.tfvars

terraform validate

目的:Terraform設定が文法的・構造的に正しいかを確認する

主な確認内容

  • HCLの文法が正しいか
  • 存在しない変数を参照していないか
  • provider設定として大きくおかしくないか
  • resourceの書き方が正しいか
[実行例]
$ terraform validate
Success! The configuration is valid.

ただし、この時点でProxmox側でVMが作成できるかまではチェックしない

API tokenの権限不足などがある場合には、後続のterraform planやterraform applyのタイミングで見つかったりする。

キク

実際、今回もterraform applyで権限設定漏れが発覚しました・・・笑

terraform plan

目的:Terraformで何をしようとしているかを確認する

Terraform的に非常に重要なステップであり、planで見積り/差分の確認をした上でapplyで適用するのが基本となる

[実行例]
$ terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # proxmox_virtual_environment_vm.monitoring will be created
  + resource "proxmox_virtual_environment_vm" "monitoring" {
      + acpi                                 = true
      + bios                                 = "seabios"
      + boot_order                           = (known after apply)
      + delete_unreferenced_disks_on_destroy = true
      + description                          = "Prometheus and Grafana monitoring VM managed by Terraform."
      + hotplug                              = (known after apply)
      + id                                   = (known after apply)
      + ipv4_addresses                       = (known after apply)
      + ipv6_addresses                       = (known after apply)
      + keyboard_layout                      = "en-us"
      + mac_addresses                        = (known after apply)
      + migrate                              = false
      + name                                 = "home-monitor"
      + network_device                       = [
          + {
              + bridge      = "vmbr0"
              + enabled     = true
              + firewall    = false
              + mac_address = (known after apply)
              + model       = "virtio"
              + mtu         = 0
              + queues      = 0
              + rate_limit  = 0
              + vlan_id     = 0
            },

~省略~

terraform apply

目的:前段のterraform planで確認した内容を実際に反映していく

[実行例]
$ terraform apply
proxmox_virtual_environment_vm.monitoring: Refreshing state... [id=500]

Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the last "terraform apply" which may have affected this plan:

  # proxmox_virtual_environment_vm.monitoring has been deleted
  - resource "proxmox_virtual_environment_vm" "monitoring" {
        id                                   = "500"
        name                                 = "home-monitor"
        tags                                 = [
            "terraform",
            "monitoring",
        ]
        # (27 unchanged attributes hidden)

        # (6 unchanged blocks hidden)
    }

Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond
to these changes.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # proxmox_virtual_environment_vm.monitoring will be created
  + resource "proxmox_virtual_environment_vm" "monitoring" {
      + acpi                                 = true
      + bios                                 = "seabios"
      + boot_order                           = (known after apply)
      + delete_unreferenced_disks_on_destroy = true
      + description                          = "Prometheus and Grafana monitoring VM managed by Terraform."
      + hotplug                              = (known after apply)
      + id                                   = (known after apply)
      + ipv4_addresses                       = (known after apply)
      + ipv6_addresses                       = (known after apply)
      + keyboard_layout                      = "en-us"
      + mac_addresses                        = (known after apply)
      + migrate                              = false
      + name                                 = "home-monitor"
      + network_device                       = [
          + {
              + bridge      = "vmbr0"
              + enabled     = true
              + firewall    = false
              + mac_address = (known after apply)
              + model       = "virtio"
              + mtu         = 0
              + queues      = 0
              + rate_limit  = 0
              + vlan_id     = 0
            },

~省略~

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + vm_ipv4_addresses = (known after apply)

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

proxmox_virtual_environment_vm.monitoring: Creating...
proxmox_virtual_environment_vm.monitoring: Still creating... [00m10s elapsed]
proxmox_virtual_environment_vm.monitoring: Still creating... [00m20s elapsed]
proxmox_virtual_environment_vm.monitoring: Creation complete after 22s [id=500]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

ssh_hint = "ssh <template-user>@192.168.10.250"
vm_id = 500
vm_ipv4_addresses = tolist([])
vm_name = "home-monitor"

結果

無事にProxmox側でのVM作成に成功していました。

パラメータも指定した通りに作成できていました。

また、手元からは以下のようなコマンドで確認することもできました。

$ terraform state list
proxmox_virtual_environment_vm.monitoring

$ terraform output
ssh_hint = "ssh <template-user>@192.168.10.250"
vm_id = 500
vm_ipv4_addresses = tolist([])
vm_name = "home-monitor"

Ansible実行:対象VMでの監視設定投入用

簡易的な事前確認

先ほどTerraformで作成したVMに対して、作業PCから作業ができるのかを簡易的に確認します。

$ ansible -i ansible/inventory/hosts.ini home-monitor -m ping
[実行例]
$ ansible -i ansible/inventory/hosts.ini home-monitor -m ping
Enter passphrase for key '/Users/user/.ssh/id_rsa': 
home-monitor | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.12"
    },
    "changed": false,
    "ping": "pong"
}

Ansibleであらかじめ用意されているpingモジュールを実行すると「SUCCESS」となったので、ひとまずは問題なさそうです。

Playbookの実行

それでは設定を流し込んでいきます。

$ ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml --ask-become-pass
[実行例]
$ ansible-playbook -i ansible/inventory/hosts.ini ansible/playbooks/site.yml --ask-become-pass
BECOME password: 

PLAY [Configure monitoring VM] ****************************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************************************
Enter passphrase for key '/Users/user/.ssh/id_rsa': 
ok: [home-monitor]

TASK [common : Set timezone] ******************************************************************************************************************************************************
ok: [home-monitor]

~省略~

TASK [prometheus : Install Prometheus binaries] ***********************************************************************************************************************************
ok: [home-monitor] => (item=prometheus)
ok: [home-monitor] => (item=promtool)

~省略~

TASK [node_exporter : Install node_exporter binary] *******************************************************************************************************************************
changed: [home-monitor]

~省略~

TASK [grafana : Install Grafana OSS] **********************************************************************************************************************************************
changed: [home-monitor]

TASK [grafana : Create Grafana dashboard directory] *******************************************************************************************************************************
changed: [home-monitor]

~省略~

PLAY RECAP ************************************************************************************************************************************************************************
home-monitor               : ok=33   changed=21   unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
キク

Errorなどと戦いながら何度かPlaybookを実行しましたが、無事に設定をを流し終えました!

結果

対象VMにSSH接続して、各サービスが起動しているか確認してみます。

kiku@home-monitor:~$ systemctl status prometheus
● prometheus.service - Prometheus
     Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-07-18 07:20:36 JST; 1min 15s ago
       Docs: <https://prometheus.io/docs/>
   Main PID: 29883 (prometheus)
      Tasks: 8 (limit: 4656)
     Memory: 32.7M (peak: 32.9M)
        CPU: 332ms
     CGroup: /system.slice/prometheus.service
             └─29883 /usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --storage.tsdb.retention.time=30d --storage.ts>

Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.410+09:00 level=INFO source=head.go:865 msg="WAL segment loaded" component=tsdb segment=0 maxSegment=1 du>
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.411+09:00 level=INFO source=head.go:865 msg="WAL segment loaded" component=tsdb segment=1 maxSegment=1 du>
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.411+09:00 level=INFO source=head.go:902 msg="WAL replay completed" component=tsdb checkpoint_replay_durat>
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.417+09:00 level=INFO source=main.go:1431 msg="filesystem information" fs_type=EXT4_SUPER_MAGIC
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.417+09:00 level=INFO source=main.go:1434 msg="TSDB started"
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.417+09:00 level=INFO source=main.go:1632 msg="Loading configuration file" filename=/etc/prometheus/promet>
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.417+09:00 level=INFO source=main.go:1048 msg="TSDB retention updated" duration=30d size=20GiB percentage=0
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.422+09:00 level=INFO source=main.go:1671 msg="Completed loading of configuration file" db_storage=41.983µ>
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.422+09:00 level=INFO source=main.go:1395 msg="Server is ready to receive web requests."
Jul 18 07:20:36 home-monitor prometheus[29883]: time=2026-07-18T07:20:36.422+09:00 level=INFO source=manager.go:209 msg="Starting rule manager..." component="rule manager"
kiku@home-monitor:~$ systemctl status node_exporter.service 
● node_exporter.service - Prometheus Node Exporter
     Loaded: loaded (/etc/systemd/system/node_exporter.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-07-18 07:20:36 JST; 1min 23s ago
       Docs: <https://github.com/prometheus/node_exporter>
   Main PID: 29946 (node_exporter)
      Tasks: 4 (limit: 4656)
     Memory: 6.9M (peak: 7.2M)
        CPU: 72ms
     CGroup: /system.slice/node_exporter.service
             └─29946 /usr/local/bin/node_exporter --web.listen-address=0.0.0.0:9100 "--collector.filesystem.mount-points-exclude=^/(dev|proc|sys|run|var/lib/containers/storage/.+>

Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.919+09:00 level=INFO source=node_exporter.go:142 msg=time
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.919+09:00 level=INFO source=node_exporter.go:142 msg=timex
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.919+09:00 level=INFO source=node_exporter.go:142 msg=udp_queues
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.919+09:00 level=INFO source=node_exporter.go:142 msg=uname
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.919+09:00 level=INFO source=node_exporter.go:142 msg=vmstat
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.919+09:00 level=INFO source=node_exporter.go:142 msg=watchdog
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.919+09:00 level=INFO source=node_exporter.go:142 msg=xfs
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.919+09:00 level=INFO source=node_exporter.go:142 msg=zfs
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.920+09:00 level=INFO source=tls_config.go:354 msg="Listening on" address=[::]:9100
Jul 18 07:20:36 home-monitor node_exporter[29946]: time=2026-07-18T07:20:36.920+09:00 level=INFO source=tls_config.go:357 msg="TLS is disabled." http2=false address=[::]:9100
kiku@home-monitor:~$ systemctl status grafana-server
● grafana-server.service - Grafana instance
     Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-07-18 07:20:37 JST; 1min 36s ago
       Docs: <http://docs.grafana.org>
   Main PID: 30010 (grafana)
      Tasks: 21 (limit: 4656)
     Memory: 281.3M (peak: 313.5M)
        CPU: 5.073s
     CGroup: /system.slice/grafana-server.service
             ├─30010 /usr/share/grafana/bin/grafana server --config=/etc/grafana/grafana.ini --pidfile=/run/grafana/grafana-server.pid --packaging=deb cfg:default.paths.logs=/var>
             ├─30020 /var/lib/grafana/plugins/elasticsearch/gpx_grafana_elasticsearch_datasource_linux_amd64
             └─30027 /var/lib/grafana/plugins/zipkin/gpx_grafana-zipkin-datasource_linux_amd64

Jul 18 07:20:45 home-monitor grafana[30010]: logger=plugin.backgroundinstaller t=2026-07-18T07:20:45.999792362+09:00 level=info msg="Installing plugin" pluginId=zipkin version=
Jul 18 07:20:47 home-monitor grafana[30010]: logger=plugin.installer t=2026-07-18T07:20:47.275976062+09:00 level=info msg="Installing plugin" pluginId=zipkin version=
Jul 18 07:20:47 home-monitor grafana[30010]: logger=installer.fs t=2026-07-18T07:20:47.441080561+09:00 level=info msg="Downloaded and extracted zipkin v12.4.5 zip successfully to>
Jul 18 07:20:47 home-monitor grafana[30010]: logger=plugins.registration t=2026-07-18T07:20:47.472414856+09:00 level=info msg="Plugin registered" pluginId=zipkin
Jul 18 07:20:47 home-monitor grafana[30010]: logger=plugin.backgroundinstaller t=2026-07-18T07:20:47.472456167+09:00 level=info msg="Plugin successfully installed" pluginId=zipki>
Jul 18 07:20:47 home-monitor grafana[30010]: logger=plugin.backgroundinstaller t=2026-07-18T07:20:47.472474703+09:00 level=info msg="Installing plugin" pluginId=grafana-lokiexplo>
Jul 18 07:20:49 home-monitor grafana[30010]: logger=plugin.installer t=2026-07-18T07:20:49.072319433+09:00 level=info msg="Installing plugin" pluginId=grafana-lokiexplore-app ver>
Jul 18 07:20:49 home-monitor grafana[30010]: logger=installer.fs t=2026-07-18T07:20:49.205217442+09:00 level=info msg="Downloaded and extracted grafana-lokiexplore-app v2.3.0 zip>
Jul 18 07:20:49 home-monitor grafana[30010]: logger=plugins.registration t=2026-07-18T07:20:49.231173774+09:00 level=info msg="Plugin registered" pluginId=grafana-lokiexplore-app
Jul 18 07:20:49 home-monitor grafana[30010]: logger=plugin.backgroundinstaller t=2026-07-18T07:20:49.231219333+09:00 level=info msg="Plugin successfully installed" pluginId=grafa>

続いて、ブラウザからPrometheusに繋いでみます。

http://192.168.10.250:9090
キク

無事に表示され、ターゲット情報もupになっているので大丈夫そうです!

最後に、ブラウザからGrafanaにも繋いでみます。

http://192.168.10.250:3000
キク

こちらも無事に表示されて、ダッシュボードも作成できていたのでOKです!

おわりに

いかがだったでしょうか。

今回はCodexを活用して自宅での監視用VMセットアップにチャレンジしてみました。

Codexと壁打ちしながらTerraformとAnsibleのコードを書いてもらい、コードを実行して無事にセットアップできるところまでを確認しました。

「とりあえずCodexを使ってみる!」というのが今回の目的だったので、成果物としては非常にシンプルなものになりましたが、次のステップとしてはCodexを活用しながらもう少しダッシュボードの整備をしてみようと思います!

ひとまず、Codex利用の成功体験を積めたので、今回の試みは大成功でした笑

本記事を最後まで読んでいただき、ありがとうございました。

ではでは!

-Codex
-,