tk_ch’s blog

インフラエンジニアのブログ

Prometheus Node Exporter をAnsibleでインストールする(Rocky Linux 8)

PrometheusのExporterのひとつである、Node ExporterをAnsibleでインストールした時のメモ。
PrometheusやNode Exporterの設定は以下記事に記載してある。

tk-ch.hatenablog.com

環境

  • Node Exporter:1.4.0
  • 管理対象サーバ(Ansibleの実行先)のOS:RockyLinux8.6
  • ansible:6.4.0
  • ansible-core:2.13.4

実施内容

Ansibleのplaybookを準備

以下のディレクトリ、ファイルを作成した。
ディレクトリ構成は、Ansible公式ドキュメントのBest Practiceを参考にしている。

# tree --charset=c ansible
ansible
|-- ansible.cfg
|-- inventories
|   `-- production
|       |-- group_vars
|       |   `-- testservers.yml
|       `-- hosts
|-- roles
|   `-- install_node_exporter
|       |-- defaults
|       |   `-- main.yml
|       |-- files
|       |   `-- node_exporter-1.4.0.linux-amd64.tar.gz
|       |-- tasks
|       |   `-- main.yml
|       `-- templates
|           |-- node_exporter.service.j2
|           `-- node_exporter_envfile.j2
|-- site.yml
`-- testservers.yml

ansible/ansible.cfg
ansible実行時の設定。Ansibleが管理対象サーバへSSHする際に、ホスト鍵のチェックをしないようにしている。

[defaults]
host_key_checking = False

ansible/inventories/production/group_vars/testservers.yml
管理対象サーバへのアクセス情報を記載。

---
ansible_ssh_user: root
ansible_ssh_pass: password

ansible/inventories/production/hosts
管理対象サーバの接続先を記載。

[testservers]
192.168.10.123

roles/install_node_exporter/defaults/main.yml このロールで使う変数を定義している。

---
work_dir: /root/ansible_work/node_exporter      # このタスクの作業用ディレクトリ
node_exporter_user: node_exporter               # Node Exporterの実行ユーザ
node_exporter_group: "{{ node_exporter_user }}" # Node Exporterの実行ユーザの所属グループ
node_exporter_id: 65541                         # Node Exporterの実行ユーザ・グループのID(任意の値でよい)
node_exporter_version: 1.4.0                    # インストールするNode Exporterのバージョン
prometheus_dir: /opt/prometheus                 # Node Exporterの配置先
node_exporter_bin: /usr/local/bin               # Node Exporterの実行ファイルリンク配置先
node_exporter_envfile: /etc/sysconfig/node_exporter  # Node Exporterの変数定義ファイル
textfile_collector_dir: /var/lib/node_exporter/textfile_collector  # Textfile Collector用ファイルの配置先

ansible/roles/install_node_exporter/tasks/main.yml
実行するタスクを記載。Node Exporterをインストール、起動する内容。

---
- name: create work directory
  file:
    path: "{{ work_dir }}"
    state: directory
    owner: root
    group: root
    mode: 0755

- name: add group for node exporter
  group:
    name: "{{ node_exporter_group }}"
    gid: "{{ node_exporter_id }}"

- name: add user for node exporter
  user:
    name: "{{ node_exporter_user }}"
    group: "{{ node_exporter_group }}"
    uid: "{{ node_exporter_id }}"
    create_home: no
    shell: /sbin/nologin

- name: copy node exporter tarball
  copy:
    src: "node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
    dest: "{{ work_dir }}"

- name: create prometheus directory
  file:
    path: "{{ prometheus_dir }}"
    state: directory
    owner: root
    group: root
    mode: "0755"

- name: extract node exporter tarball
  unarchive:
    remote_src: yes
    src: "{{ work_dir }}/node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
    dest: "{{ prometheus_dir }}"
    owner: "{{ node_exporter_user }}"
    group: "{{ node_exporter_group }}"

- name: create node exporter symbolic link
  file:
    path: "{{ node_exporter_bin }}/node_exporter"
    state: link
    src: "{{ prometheus_dir }}/node_exporter-{{ node_exporter_version }}.linux-amd64/node_exporter"

- name: create node exporter systemd file
  template:
    src: node_exporter.service.j2
    dest: /etc/systemd/system/node_exporter.service
    owner: root
    group: root
    mode: 0664

- name: create node exporter environment directory
  template:
    src: node_exporter_envfile.j2
    dest: "{{ node_exporter_envfile }}"
    owner: root
    group: root
    mode: 0664

- name: create textfile collector directory
  file:
    path: "{{ textfile_collector_dir }}"
    state: directory
    owner: "{{ node_exporter_user }}"
    group: "{{ node_exporter_group }}"
    mode: 0755

- name: enable and start node_exporter
  systemd:
    daemon_reload: yes
    enabled: yes
    state: started
    name: node_exporter.service

roles/install_node_exporter/files/ 管理対象サーバにアップロードする用のファイルを置く。
今回はインストール対象のNode Exporterのtarballを事前にダウンロードして配置している。
tarballはここからダウンロードできる。

# ls -l roles/install_node_exporter/files/
合計 9876
-rw-r--r-- 1 root root 10111972  9月 26 12:39 node_exporter-1.4.0.linux-amd64.tar.gz

roles/install_node_exporter/templates/node_exporter.service.j2
Node ExporterのSysytemdService用テンプレートファイル。

[Unit]
Description=Node Exporter

[Service]
User={{ node_exporter_user }}
EnvironmentFile=-{{ node_exporter_envfile }}
ExecStart={{ node_exporter_bin }}/node_exporter $OPTIONS

[Install]
WantedBy=multi-user.target

roles/install_node_exporter/templates/node_exporter_envfile.j2
Node Exporter実行時のオプション設定ファイルのテンプレートファイル。

OPTIONS="--collector.textfile.directory {{ textfile_collector_dir }}"

ansible/site.yml
実行するplaybook。個別のplaybookをimportして使う。

---
- import_playbook: testservers.yml

ansible/testservers.yml
個別のplaybook。

---
- hosts: testservers
  roles:
    - install_node_exporter

ansibleの実行

ansible-playbookを実行する。

# ansible-playbook -i inventories/production/hosts site.yml

管理対象のサーバに接続し、node_exporterサービスが正常に起動していればOK。

# systemctl status node_exporter
● node_exporter.service - Node Exporter
   Loaded: loaded (/etc/systemd/system/node_exporter.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-10-11 11:27:43 UTC; 1h 42min ago
 Main PID: 36046 (node_exporter)
    Tasks: 5 (limit: 10992)
   Memory: 18.7M
   CGroup: /system.slice/node_exporter.service
           mq36046 /usr/local/bin/node_exporter --collector.textfile.directory /var/lib/node_exporter/textfile_collector

10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.337Z caller=node_exporter.go:115 level=info collector=thermal_zone
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.337Z caller=node_exporter.go:115 level=info collector=time
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.337Z caller=node_exporter.go:115 level=info collector=timex
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.337Z caller=node_exporter.go:115 level=info collector=udp_queues
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.337Z caller=node_exporter.go:115 level=info collector=uname
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.337Z caller=node_exporter.go:115 level=info collector=vmstat
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.337Z caller=node_exporter.go:115 level=info collector=xfs
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.337Z caller=node_exporter.go:115 level=info collector=zfs
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.338Z caller=node_exporter.go:199 level=info msg="Listening on" address=:9100
10月 11 11:27:43 ip-192-168-10-123.ap-northeast-1.compute.internalmydomain.local node_exporter[36046]: ts=2022-10-11T11:27:43.338Z caller=tls_config.go:195 level=info msg="TLS is disabled." http2=false

まとめ

  • RockyLinux8へのPrometheus Node ExporterのインストールをAnsibleで自動化できた。

参考文献