部署 node_exporter
创建目录
root@pg-1:~# mkdir roles/node_exporter/{vars,tasks,templates,handlers,files,meta} -p
root@pg-1:~# tree roles/
roles/
└── node_exporter
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars
配置handlers/main.yml
在此目录中可以存放触发器配置信息存放handlers配置
root@pg-1:~/roles# vim node_exporter/handlers/main.yml
---
- name: restart node_exporter
ansible.builtin.systemd:
name: node_exporter
state: restarted
配置 meta/main.yml
在此目录中可以存放角色执行依赖关系
root@pg-1:~/roles# vim node_exporter/meta/main.yml
---
# 可以根据实际需要编写依赖等信息,这里示例为空
dependencies: []
#- { role: nginx }
#- { role: php-fpm }
配置 vars/main.yml
在此目录中可以存放变量信息文件存放角色变量信息
root@pg-1:~/roles# vim node_exporter/vars/main.yml
---
# 可以在这里管理 node_exporter 的版本信息、安装位置等
node_exporter_version: "1.6.1"
node_exporter_base_dir: "/apps/node_exporter"
配置 tasks/main.yml
在此目录中可以定义任务配置文件信息存放任务
root@pg-1:~/roles# vim node_exporter/tasks/main.yml
---
###############################################################
# 1. 创建 node_exporter 用户
###############################################################
- name: Create node_exporter user
ansible.builtin.user:
name: node_exporter
system: yes
shell: /sbin/nologin
###############################################################
# 2. 创建存放 node_exporter 文件的基础目录
###############################################################
- name: Create base directory for node_exporter
ansible.builtin.file:
path: "{{ node_exporter_base_dir }}"
state: directory
owner: node_exporter
group: node_exporter
###############################################################
# 3. 先从 role 的 files 或其他目录复制压缩包到远程目标机
###############################################################
- name: Copy node_exporter tarball
ansible.builtin.copy:
src: "node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
dest: "{{ node_exporter_base_dir }}/node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
mode: '0644'
###############################################################
# 4. 解压 node_exporter
###############################################################
- name: Unarchive node_exporter
ansible.builtin.unarchive:
src: "{{ node_exporter_base_dir }}/node_exporter-{{ node_exporter_version }}.linux-amd64.tar.gz"
dest: "{{ node_exporter_base_dir }}/"
remote_src: true
creates: "{{ node_exporter_base_dir }}/node_exporter-{{ node_exporter_version }}.linux-amd64/node_exporter" # 幂等判断
notify: restart node_exporter
###############################################################
# 5. 创建或更新 node_exporter 软链接 (方便升级或回退)
###############################################################
- name: Create or update "current" symlink
ansible.builtin.file:
src: "{{ node_exporter_base_dir }}/node_exporter-{{ node_exporter_version }}.linux-amd64"
dest: "{{ node_exporter_base_dir }}/node_exporter"
state: link
notify: restart node_exporter
###############################################################
# 6. 拷贝或更新 systemd service 文件
###############################################################
- name: Copy systemd service file
ansible.builtin.template:
src: node_exporter.service.j2
dest: /etc/systemd/system/node_exporter.service
notify: restart node_exporter
###############################################################
# 7. 启用并启动 node_exporter 服务
###############################################################
- name: Enable and start node_exporter service
ansible.builtin.systemd:
name: node_exporter
enabled: yes
state: started
配置 templates/node_exporter.service.j2
在此目录中可以存放需要分发文件信息――存放分发文件信息 jinja2模板文件(支持变量)
root@pg-1:~/roles# vim node_exporter/templates/node_exporter.service.j2
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Type=simple
User=node_exporter
ExecStart={{ node_exporter_base_dir }}/node_exporter/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.ethtool \
--collector.tcpstat
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
创建 host 主机文件
root@pg-1:~/roles# vim inventory.ini
[node_exporter] # node_exporter 主机组
192.168.139.162 ansible_user=root ansible_password=root ansible_port=22 # 登录主机账密
#################### 如果主机多可用如下配置 #################
# [node_exporter]
# 192.168.139.162
# ........
# ........
# [node_exporter:vars]
# ansible_user=root
# ansible_password=root
# ansible_port=22
###########################################################
################### 如果有免密则不用配置账密 ##################
配置 ansible.cfg 文件
root@pg-1:~/roles# cat ansible.cfg
[defaults]
inventory = ./inventory.ini
host_key_checking = False
创建 site.yml 执行文件
root@pg-1:~/roles# vim site.yml
---
- hosts: node_exporter # 这个 Play 要在名为 node_exporter 的主机组上执行。
become: yes # 告诉 Ansible 执行任务时需要提权(例如使用 sudo)来获取 root 权限。
gather_facts: yes # 收集目标主机的系统信息(如操作系统、CPU、内存、网络接口等)并作为变量(ansible_facts)提供给后续任务使用,如果用不到里面的变量可以设置为 no 这样速度会加快
roles:
- node_exporter # 执行名为 node_exporter 的角色 其实就是当前目录下的 node_exporter 目录 这里目录指角色
最终 roles 目录
root@pg-1:~/roles# tree
.
├── ansible.cfg
├── inventory.ini
├── node_exporter
│ ├── files
│ │ └── node_exporter-1.6.1.linux-amd64.tar.gz
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── node_exporter.service.j2
│ └── vars
│ └── main.yml
└── site.yml
执行安装
`检查加载配置文件`
root@pg-1:~/roles# ansible --version
ansible 2.10.8
config file = /root/roles/ansible.cfg # 配置文件加载
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
`检查语法`
root@pg-1:~/roles# ansible-playbook --syntax-check site.yml
playbook: site.yml
`执行安装`
root@pg-1:~/roles# ansible-playbook site.yml
`验证`
root@pg-2:~# systemctl is-active node_exporter.service
active
root@pg-2:~# systemctl is-enabled node_exporter.service
enabled
root@pg-2:/apps/node_exporter/node_exporter# ./node_exporter --version
node_exporter, version 1.6.1 (branch: HEAD, revision: 4a1b77600c1873a8233f3ffb55afcedbb63b8d84)
build user: root@586879db11e5
build date: 20230717-12:10:52
go version: go1.20.6
platform: linux/amd64
tags: netgo osusergo static_build
注意:需要下载 sshpass 服务
apt install sshpass
未来升级示例
roles 目录
新版本放到 files 目录下
root@pg-1:~/roles# tree
.
├── ansible.cfg
├── inventory.ini
├── node_exporter
│ ├── files
│ │ ├── node_exporter-1.6.1.linux-amd64.tar.gz
│ │ └── node_exporter-1.8.2.linux-amd64.tar.gz # 新版本放到 files 目录下
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── node_exporter.service.j2
│ └── vars
│ └── main.yml
└── site.yml
修改变量
root@pg-1:~/roles# vim node_exporter/vars/main.yml
---
# 可以在这里管理 node_exporter 的版本信息、安装位置等
node_exporter_version: "1.8.2"
node_exporter_base_dir: "/apps/node_exporter"
执行升级
`检查语法`
root@pg-1:~/roles# ansible-playbook --syntax-check site.yml
playbook: site.yml
`执行升级`
root@pg-1:~/roles# ansible-playbook site.yml
`验证`
root@pg-2:~# cd /apps/node_exporter/node_exporter && ./node_exporter --version
node_exporter, version 1.8.2 (branch: HEAD, revision: f1e0e8360aa60b6cb5e5cc1560bed348fc2c1895)
build user: root@03d440803209
build date: 20240714-11:53:45
go version: go1.22.5
platform: linux/amd64
tags: unknown
未来回滚示例
修改变量
root@pg-1:~/roles# vim node_exporter/vars/main.yml
---
# 可以在这里管理 node_exporter 的版本信息、安装位置等
node_exporter_version: "1.6.1"
node_exporter_base_dir: "/apps/node_exporter"
执行回滚
`检查语法`
root@pg-1:~/roles# ansible-playbook --syntax-check site.yml
playbook: site.yml
`执行升级`
root@pg-1:~/roles# ansible-playbook site.yml
`验证`
root@pg-2:~# cd /apps/node_exporter/node_exporter && ./node_exporter --version
node_exporter, version 1.6.1 (branch: HEAD, revision: 4a1b77600c1873a8233f3ffb55afcedbb63b8d84)
build user: root@586879db11e5
build date: 20230717-12:10:52
go version: go1.20.6
platform: linux/amd64
tags: netgo osusergo static_build
文章评论