以前の記事では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できますエンジニアの大きな一歩になると思いました。