跳转至

自动化维护node-exporter (二)

因为我们讲的Prometheus,对于自动化维护的范畴主要的目的是起到抛砖引玉的效果,在此,不在过多的深入讲解,如果有什么疑问,可以加群提问交流。

Ansible概述

Ansible 简介

Ansible 是一个开源的基于 OpenSSH 的自动化配置管理工具。可以用它来配置系统、部署软件和编排更高级的 IT 任务,比如持续部署或零停机更新。

Ansible 的主要目标是简单和易用,并且它还高度关注安全性和可靠性。

Ansible 适用于开发人员、系统管理员、发布工程师、IT 经理,以及介于两者之间的所有人。

Ansible 适合管理几乎所有的环境,从拥有少数实例的小型环境到有数千个实例的企业环境。

Ansible 功能

管理员可以通过 Ansible 在成百上千台计算机上同时执行指令(task)。 对于管理员来说,经常需要执行下面的任务:

维护现存的比较复杂的服务器时,手动登录的方式很容易遗漏一些操作,或者是执行一些未预期的操作。 手动初始化新的服务器耗时耗力! 对于这两种情况,如果完全通过 shell 脚本实现。脚本会过于复杂,极难维护。当然我们也可以使用同类的工具,比如 Puppet 、 Chef 、saltstack。这三个工具的特点是:需要学习新的知识栈(Ansible同样也是有学习成本的)。

相比 Puppet、Chef、Saltstack 使用 Ansible 可以延续之前使用 shell 脚本的工作习惯和方式,因而其学习成本会低一些。下面是 Ansible 的一些优势:

可以逐行的执行 shell 命令。 不需要另外的客户端工具(linux 一般会自带 ssh 工具)。 相同的配置只被执行一次(多次执行同一配置不会出问题)。

Ansible 特性

轻量级,不需要安装客户端,通过ssh通信;

基于模块工作,模块可以由任何语言开发;

不仅支持命令行使用模块,也支持yaml格式的playbook;

支持sudo

幂等性,同一台服务器多次执行同一个palybook是安全的;

商业化UI 10台主机免费

开源UI 文档

Ansible 工作流程

使用 Ansible 无须在被管理的客户端电脑上安装代理之类的组件。它通过普通的 SSH 进行通信,以便从远程计算机检索信息、发出命令和复制文件。这是 Ansible 简化服务器管理的一种方式。任何公开 SSH 端口的服务器都可以通过 Ansible 进行配置和管理。

Ansible 采用模块化的设计,所以非常容易扩展到各种特定的使用场景。模块可以用任何语言编写,并使用标准 JSON 进行通信。Ansible 的配置文件是用 YAML 格式编写的,因为它使用起来非常简单,并且与主流的标记语言很相似。除了通过命令行工具 Ansible 还可以通过配置脚本(Playbooks)与客户端交互。

ansible安装

# 配置仓库
# CentOS 6:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
# CentOS 7:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# CentOS 8:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# 安装ansible
yum install ansible

# ubuntu
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

Ansible中文文档-马哥教育出品


使用 Ansible 安装 Prometheus 以及 Exporter组件

概述

这个 Ansible 角色从 https://packagecloud.io/app/prometheus-rpm 托管的RPM包安装 Prometheus 等组件

此处的RPM,也可以是APT源,前篇已经讲到了,如果想修改成自己的源配置,只需要调整TASK中的main.yml配置即可。

此角色用于处理守护程序的安装和命令行配置参数。对于简单的 exporter 来说,这已经足够了。但是对于像Prometheus这样的更复杂的组件,还是需要使用单独的角色来管理生成的配置文件。

软件包的定制化

如果有其他需求,可以参考 https://github.com/lest/prometheus-rpm 仓库,此仓库是用于构建软件包的源文件。

目录结构

/data/code/ansible-role-prometheus-rpm tree
├── defaults # 此处定义需要安装的package名字以及调用的变量参数定义
│   └── main.yml
├── handlers # 定义prometheus、exporter等服务的启动与重启的执行任务
│   └── main.yml
├── meta # 此处是定义INFO、平台、TAGS、依赖一些信息
│   └── main.yml 
├── tasks # 触发TASKS: 配置yum源,以及安装成功后,会直接调用handlers定义的执行启动与重启任务
│   └── main.yml
└── templates # 模板:此处是定义了 用于覆盖 systemd 读取的的参数选项变量名  
    └── etc
        └── default
            ├── alertmanager.j2
            ├── apache_exporter.j2
            ├── blackbox_exporter.j2
            ├── collectd_exporter.j2
            ├── consul_exporter.j2
            ├── elasticsearch_exporter.j2
            ├── graphite_exporter.j2
            ├── haproxy_exporter.j2
            ├── jmx_exporter.j2
            ├── mysqld_exporter.j2
            ├── node_exporter.j2
            ├── postgres_exporter.j2
            ├── prometheus.j2
            ├── pushgateway.j2
            ├── redis_exporter.j2
            ├── sachet.j2
            └── snmp_exporter.j2

角色变量

默认情况下,此角色不安装任何内容。

prometheus_rpm_components 中设置需要安装的组件列表。

Prometheus 的配置:

prometheus_rpm_components:
  - alertmanager
  - blackbox_exporter
  # - prometheus # Prometheus 1.x
  - prometheus2 # Prometheus 2.x
  - sachet

Exporters 的配置:

prometheus_rpm_components:
  - apache_exporter
  - collectd_exporter
  - consul_exporter
  - elasticsearch_exporter
  - graphite_exporter
  - haproxy_exporter
  - jmx_exporter
  - mysqld_exporter
  - node_exporter
  - postgres_exporter
  - pushgateway
  - redis_exporter
  - snmp_exporter

你也可以设置变量用于配置命令行选项,会直接覆盖 systemd 单元读取的相应 /etc/default 文件中的选项。

prometheus_rpm_alertmanager_opts: ""
prometheus_rpm_blackbox_exporter_opts: ""
prometheus_rpm_prometheus_opts: '--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/data'
prometheus_rpm_sachet_exporter_opts: "-config /etc/prometheus/sachet.yml"

prometheus_rpm_apache_exporter_opts: "--config.file /etc/prometheus/blackbox.yml"
prometheus_rpm_collectd_opts: ""
prometheus_rpm_consul_exporter_opts: ""
prometheus_rpm_elasticsearch_exporter_opts: ""
prometheus_rpm_graphite_exporter_opts: ""
prometheus_rpm_haproxy_exporter_opts: ""
prometheus_rpm_jmx_exporter_opts: ""
prometheus_rpm_mysqld_exporter_opts: ""
prometheus_rpm_node_exporter_opts: ""
prometheus_rpm_postgres_exporter_opts: ""
prometheus_rpm_postgres_exporter_data_source_name: ""
prometheus_rpm_postgres_exporter_data_source_uri: ""
prometheus_rpm_postgres_exporter_data_source_user: ""
prometheus_rpm_postgres_exporter_data_source_user_file: ""
prometheus_rpm_postgres_exporter_data_source_pass: ""
prometheus_rpm_postgres_exporter_data_source_pass_file: ""
prometheus_rpm_pushgateway_opts: ""
prometheus_rpm_redis_exporter_opts: ""
prometheus_rpm_snmp_exporter_opts: ""

默认情况下,该角色会安装软件包,但不会将其升级到新版本。

prometheus_rpm_package_state: present

将此设置为 latest 可在当前系统上升级软件包。可以在命令行上执行此操作,例如:

ansible-playbook my-servers playbooks/foo.yml --extra-vars ansible_become=latest

如果不想使用yum源方式,也可以使用copy模块,把文件copy到目标host,进行安装

# task 插入以下代码块
- name: copy node-exporter.rpm
  copy: src=./files/xx.rpm dest=/tmp/
  notify: install node-exporter.rpm

# hander 插入以下代码块
- name: install node-exporter.rpm
  yum:
    name: /tmp/node-exporter.rpm
    state: present

总结

这个仓库 ansible-role-prometheus-rpm 就是使用我们在前篇提及到的 prometheus-rpm 的 rpm 制作的 ansible-role 管理配置, 我们可以直接针对这个Role配置做一些调整后就可以自己用了,针对Ubuntu的role在这里 ansible-role-apt ,比如使用Jenkins+Ansible来维护软件包的发布,或者使用Gitlab CI来做持续集成、部署,在这里,对于Jenkins+Ansible与Gitlab CI是另外一个课题,可以在 优点知识 找到答案,如果你有什么不明白的地方或者疑问,可以加群交流。

另外,对于自动化运维始终是一门比较大的话题,涉及的技术知识点也比较多,每个公司都会开发出自己的运维管理工具,但是最终还是万变不离其宗, 当前的开源的一站式管理平台也有很多,比如:腾讯蓝鲸、CoDo等等,对于自动化以及后续的AIOps,我们还有很长的路要走。