
こんにちは、キクです。
最近は周りでもCodex利用者が増えていく中で、僕はいまひとつ手を出せない状況が続いていました。
とはいえ、便利なのは知ってるので「何か活用してみたいなー」とは思っていました。
そこで今回は練習も兼ねて自宅のProxmox環境上に監視用VMのセットアップをお願いしてみようと考えました!
最初の一歩なので、あまり複雑なことはさせていないですが、一旦は上手く動いてくれたので記録用として記事にしておこうと思います。
本記事の内容
それでは、よろしくお願いします。
今回の構想
まずは、今回のどのようなことをしたいのかを簡単に整理しておきます。
仕事の中で「Terraformも使ってIaC化も進めていきたい」という流れもあるのですが、僕はCodexだけでなくTerraformもほとんど触ったことがなく・・・。
そのため、今回はその辺りも含めて練習してみます。
具体的にはCodexにお願いして、以下を実現するコードを作ってもらう方向で進めます。
僕は作成されたコードを実行するだけで監視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.cfg | Ansibleの設定 |
.gitignore | Gitに入れないファイルの指定 |
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.tf | Terraform/providerのバージョン指定 |
providers.tf | Proxmoxへの接続設定 |
variables.tf | 使う変数の定義 |
main.tf | VM作成の本体 |
outputs.tf | terraform output で出す値 |
terraform.tfvars.example | 実値ファイルの見本 |
terraform.tfvars | 実際のProxmox URL、API token、VM ID、IPなど |
.terraform.lock.hcl | providerバージョン固定 |
terraform.tfstate | Terraformの管理台帳 |
terraform.tfstate.backup | stateのバックアップ |
README.md | Terraform部分の簡単な説明 |
*.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.ini | Ansibleの接続先VM。IPとSSHユーザを書く |
inventory/hosts.ini.example | hosts.ini の見本 |
inventory/group_vars/monitoring.yml | GrafanaパスワードやPrometheusバージョンなど |
inventory/group_vars/monitoring.yml.example | 変数ファイルの見本 |
playbooks/site.yml | Ansible実行の入口 |
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.yml | Prometheusのメイン設定 |
prometheus/targets/linux_nodes.yml | Linux監視対象一覧 |
prometheus/rules/host_alerts.yml | CPU/メモリ/ディスク/down検知のalert rule |
grafana/provisioning/datasources/prometheus.yml | GrafanaにPrometheus datasourceを登録 |
grafana/provisioning/dashboards/default.yml | Grafanaに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.tfvars と ansible/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にて以下を実施しました。
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作業ディレクトリを初期化する
今回の場合、Proxmoxを操作するためのbpg/proxmox providerを準備する。
terraform fmt
目的:Terraformファイルの書式を自動整形する
各コード類で書かれている意味は変えずにインデントの不備などを調整してくれる。
後続のterraform plan前に流しておくとコードが読みやすくなる
以下の場合、terraform.tfvarsを調整してくれたことになります。
[実行例]
$ terraform fmt
terraform.tfvars
terraform validate
目的:Terraform設定が文法的・構造的に正しいかを確認する
[実行例]
$ 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利用の成功体験を積めたので、今回の試みは大成功でした笑
本記事を最後まで読んでいただき、ありがとうございました。
ではでは!