AnsibleでPrometheusを構築した | Ansible入門

Ansible

以前の記事ではAnsibleでZabbixの構築をやってみましたが、今回は少しやり方をかえつつPrometheusの構築も試してみます。

Ansibleプロジェクトの構成

まず好きな場所にディレクトリを作成します。

mkdir ansible-prometheus
cd ansible-prometheus

inventoryの作成

次に管理対象のホスト(サーバーやVMなど)の情報を管理するためのインベントリと呼ばれるファイルを作成します。

vim inventory.ini
# inventory.ini
[prometheus_servers]
server1.example.com #構築するマシンのFQDNまたはIPアドレス
server2.example.com #構築するマシンのFQDNまたはIPアドレス

Playbookの作成

prometheus.ymlというplaybookを作成します。

vim prometheus.yml
# prometheus.yml
- hosts: prometheus_servers
become: yes
roles:
- prometheus

hosts: 対象のホストグループを指定します。

become: 管理者権限で実行するためにyesを指定します。

roles: 使用するRoleを指定します。

roleとは

roleは複数のタスクや設定ファイル、テンプレートなどをまとめて再利用しやすくするための仕組みです。例えば複雑な処理をさせるとき、一つのplaybookに処理を書くことできますが、複雑なplaybookとなることで開発が複雑になったり今後のメンテナンスがしづらくなるデメリットがあります。そのためにroleというplaybookをグループごとに管理する仕組みが有効となります。

ロールには、特定のディレクトリ構成が必要です。例えば、tasks(タスク)、handlers(ハンドラ)、templates(テンプレート)、files(ファイル)、vars(変数)などのディレクトリがあり、これらに設定ファイルやスクリプトを格納します。

roleの作成

ansible-galaxy initコマンドによってprometheusディレクトリにroleの基本構造を作成できます。

ansible-galaxy init prometheus
cd prometheus

prometheusディレクトリが以下のようなディレクトリ構造になっていることを確認してください。

prometheus/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml

taskの作成

prometheus/tasks/main.ymlを作成します。

vim tasks/main.yml
# prometheus/tasks/main.yml
- name: Create prometheus group
group:
name: "{{ prometheus_group }}"
state: present

- name: Create prometheus user
user:
name: "{{ prometheus_user }}"
group: "{{ prometheus_group }}"
create_home: no
shell: /sbin/nologin

- name: Create necessary directories
file:
path: "{{ item }}"
state: directory
owner: "{{ prometheus_user }}"
group: "{{ prometheus_group }}"
mode: '0755'
loop:
- "{{ prometheus_config_dir }}"
- "{{ prometheus_data_dir }}"

- name: Download Prometheus binary
get_url:
url: "https://github.com/prometheus/prometheus/releases/download/v{{ prometheus_version }}/prometheus-{{ prometheus_version }}.linux-amd64.tar.gz"
dest: "/tmp/prometheus.tar.gz"
mode: '0644'

- name: Extract Prometheus binary
unarchive:
src: "/tmp/prometheus.tar.gz"
dest: "/tmp/"
remote_src: yes

- name: Install Prometheus binary
copy:
src: "/tmp/prometheus-{{ prometheus_version }}.linux-amd64/prometheus"
dest: "{{ prometheus_install_dir }}/prometheus"
owner: "{{ prometheus_user }}"
group: "{{ prometheus_group }}"
mode: '0755'

- name: Install Prometheus configuration
template:
src: prometheus.yml.j2
dest: "{{ prometheus_config_dir }}/prometheus.yml"
owner: "{{ prometheus_user }}"
group: "{{ prometheus_group }}"
mode: '0644'

- name: Install systemd service
template:
src: prometheus.service.j2
dest: "/etc/systemd/system/prometheus.service"
mode: '0644'

- name: Reload systemd
systemd:
daemon_reload: yes

- name: Enable and start Prometheus service
systemd:
name: prometheus
enabled: yes
state: started

変数の設定

prometheus/defaults/main.ymlにデフォルトの変数を設定します。

# prometheus/defaults/main.yml
prometheus_version: "2.40.0"
prometheus_user: "prometheus"
prometheus_group: "prometheus"
prometheus_install_dir: "/usr/local/bin"
prometheus_config_dir: "/etc/prometheus"
prometheus_data_dir: "/var/lib/prometheus"
prometheus_web_listen_address: "0.0.0.0:9090"

テンプレートの作成

prometheus/templates/prometheus.yml.j2に以下のテンプレートファイルを作成します。

vim templates/prometheus.yml.j2
global:
scrape_interval: 15s

scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

prometheus/templates/prometheus.service.j2も作成します。

vim prometheus.service.j2
[Unit]
Description=Prometheus Service
Wants=network-online.target
After=network-online.target

[Service]
User={{ prometheus_user }}
Group={{ prometheus_group }}
Type=simple
ExecStart={{ prometheus_install_dir }}/prometheus \
--config.file={{ prometheus_config_dir }}/prometheus.yml \
--storage.tsdb.path={{ prometheus_data_dir }} \
--web.listen-address={{ prometheus_web_listen_address }}

[Install]
WantedBy=multi-user.target

ハンドラーの設定

サービスを再起動するためのハンドラーを設定します。

ハンドラーは何か変更があったときに実行されるplaybookです。prometheusの設定に変更があれば再起動するというplaybookになります。

# prometheus/handlers/main.yml
- name: Restart Prometheus
systemd:
name: prometheus
state: restarted

playbookの実行

以下のコマンドでプレイブックを実行します。

ansible-playbook -i inventory.ini prometheus.yml --ask-become-pass

ask-become-passでパスワードを要求されますが、対象マシンのsudoパスワードを入力してください。これでsudo権限でplaybookが実行できます。

TASK [prometheus : Reload systemd] **************************************************************************************************************************************
ok: [192.168.0.30]
ok: [192.168.0.31]

TASK [prometheus : Enable and start Prometheus service] *****************************************************************************************************************
ok: [192.168.0.30]
ok: [192.168.0.31]

PLAY RECAP **************************************************************************************************************************************************************
192.168.0.30 : ok=11 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.0.31 : ok=11 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

このようにエラーがなく実行できれば成功です。

動作確認

prometheusにはIPアドレス:9090で接続できます(例 192.168.0.30:9090)

メトリクスも取れていたのでprometheusは無事に動作しておりました

今回はAnsibleを使ってPrometheusを簡単に構築してみました。roleを使って複雑なansibleが書けたらIaCできますエンジニアの大きな一歩になると思いました。

タイトルとURLをコピーしました