自动化维护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 安装 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,我们还有很长的路要走。