Ansible 使用介绍
环境信息
- Centos 7
- ansible-core 2.16
- Docker image python:3.12.3
安装
ansible-core
版本及 Python 版本支持对应关系
ansible-core Version | Control Node Python | Target Python / PowerShell |
---|---|---|
2.16 | Python 3.10 - 3.12 | Python 2.7 Python 3.6 - 3.12 Powershell 3 - 5.1 |
为了环境部署方便灵活,可以选择使用 python:3.12.3
的 Docker 镜像,以其为基础环境安装 ansible-core 2.16
或者直接使用 ansible
镜像启动。
# docker run --rm -it python:3.12.3 bash |
配置
Ansible 主配置文件为 /etc/ansible/ansible.cfg
,其中的配置都可以被 ansible-playbook
或者命令行参数覆盖。
ansible 默认会读取环境变量
ANSIBLE_CONFIG
指定的配置文件,当前路径下的ansible.cfg
,以及用户家目录下的.ansible.cfg
,以及/etc/ansible/ansible.cfg
作为配置文件,已第一个找到的为准
常用配置说明
配置项 | 说明 | 示例 |
---|---|---|
inventory |
指定 inventory (主机列表)文件的路径,默认为 /etc/ansible/hosts |
|
remote_user |
(未指定用户时)连接远程主机时使用的用户 | |
remote_port |
连接远程主机时使用的(默认)端口 | |
host_key_checking |
默认启用。检查主机密钥可以防止服务器欺骗和中间人攻击。 如果主机重新安装并且在 know_hosts 中拥有不同的密钥,ansible 会提示确认密钥。如果要禁用此行为,可以配置为 False |
|
ask_pass |
默认为 False。当设置为 True 时,ansible 要求输入远端服务器的密码,即使配置了免密登录 | |
log_path |
日志文件,默认 /var/log/ansible.log |
|
pattern |
当没有给出 pattern 时的默认 pattern ,默认值是 * 即所有主机 |
inventory 配置文件
默认的 inventory 配置文件路径为 /etc/ansible/hosts
,主要用来配置 Managed Hosts 列表
主机列表中的主机可以单独出现,也可以位于某个或者多个组中([]
开头的行)
ansible-demo1.local |
常用配置说明
配置项 | 说明 | 示例 |
---|---|---|
ansible_ssh_host |
远程主机地址 | |
ansible_ssh_port |
远程主机端口 | |
ansible_ssh_user |
连接远程主机的 ssh 用户 | |
ansible_ssh_pass |
连接远程主机的 ssh 用户密码,建议使用 key 连接 | |
ansible_ssh_private_key_file |
连接远程主机的 ssh 私钥文件路径 | |
ansible_sudo_pass |
sudo 密码(这种方式并不安全,强烈建议使用 --ask-sudo-pass ) |
|
ansible_connection |
与主机的连接类型.比如:local , ssh 或者 paramiko Ansible 1.2 以前默认使用 paramiko 。1.2 以后默认使用 smart ,smart 方式会根据是否支持 ControlPersist , 来判断 ssh 方式是否可行. |
|
ansible_shell_type |
目标系统的 shell 类型.默认情况下,命令的执行使用 sh 语法,可设置为 csh 或 fish . |
|
ansible_python_interpreter |
目标主机的 python 路径 系统中有多个 Python, 或者命令路径不是 /usr/bin/python |
YAML 语法格式
YAML(YAML Ain’t Markup Language)是一种专门用于数据序列化的格式,常用于配置文件、数据交换等场景。它以其可读性和简洁性而受到开发者的青睐。YAML设计的目标是易于人类阅读和编写,并且易于与其他编程语言进行交互。下面是YAML语法的详细介绍
基本结构
数据类型 :YAML 支持标量(如字符串、整数、浮点数)、序列(列表)和映射(字典)三种基本数据类型。
缩进 :YAML 使用缩进表示结构层级关系,通常每个层级缩进两个或四个空格(禁止使用制表符)。
标量数据类型
标量(Scalars) 是单个的、不可分割的值。可以是字符串、整数或浮点数。标量可以是单行的值,也可以是多行的值
# 单行字符串 |
多行字符串可以使用字面量样式(|
)或折叠样式(>
):
# 字面量样式保留换行符 |
- 可以显式指定数据类型,例如字符串可以用单引号或双引号包围
- 字符串通常不需要引号,但如果含有特殊字符,则需要使用单引号或双引号。
true
,false
,null
等特定词汇表示布尔值和Null
。- 时间和日期需要遵循ISO格式。
列表(Sequences)
列表(Sequences) 是一组按顺序排列的值(类似于数组或列表),用破折号加空格表示新的元素,每个列表项占一行,也需要正确缩进。
# 列表 |
字典(Mappings)
映射/字典(Mappings) 是键值对的集合(类似于字典或哈希表),用冒号加空格表示键值对,键值对需要正确缩进
# 字典 |
嵌套结构
列表和字典可以嵌套使用,形成复杂的结构
# 嵌套的列表和字典 |
锚点和别名
YAML支持定义锚点(&
)和别名(*
)来重用(引用)文档中的某部分,使用 &
创建一个锚点(alias),之后可以用 *
引用这个锚点。
使用 <<
和 *
来合并已有(引用)的映射。
# 使用锚点和别名 |
注释
使用井号 #
开始一个注释,井号后面的内容将被视为注释,注释内容直到行尾。
多文档支持
一个 YAML 文件可以包含多个文档,每个文档用三个短横线 ---
分隔。
--- |
SSL Certbot 使用方法汇总
Certbot 是 Let’s Encrypt SSL 官方推荐的 ACME 协议客户端,它是一个 Python 程序,且包含模块化插件支持。Let’s Encrypt 的根证书浏览器支持广泛,且支持泛域名。但单个证书的有效期为 90 天,以防止滥用。
安装 Certbot
以下步骤演示在 Python3 环境中安装 Certbot 及其相关依赖
- 安装
certbot
pip install certbot
- 申请证书时,要使用 DNS 方式验证域名所有权并且 DNS 使用 Cloudflare 的情况下,可以安装
certbot-dns-cloudflare
插件实现自动验证,参考以下命令安装certbot-dns-cloudflare
,此模块需要cloudflare
模块的支持安装完成后检查相关模块和版本。其中pip install cloudflare
pip install certbot-dns-cloudflarecloudflare
版本需要最低为2.3.1
[1]以上模块安装完成后,即可使用# pip list
certbot 2.10.0
certbot-dns-cloudflare 2.10.0
cloudflare 2.19.2certbot
申请域名证书,并支持 Cloudflare DNS 的自动验证。
基于 Cloudflare DNS 的自动验证申请域名证书
参考步骤安装 certbot
及 Cloudflare DNS 插件后 即可使用 certbot
自动请求 Cloudflare DNS 创建申请证书时需要的 DNS 记录自动完成域名归属权的验证过程。
certbot
支持的 Cloudflare 相关的参数如下
参数 | 说明 | 示例 |
---|---|---|
--dns-cloudflare |
使用 Cloudflare 的 DNS 插件自动验证域名归属权 | |
--dns-cloudflare-credentials |
请求 Cloudflare 的授权配置文件 | |
--dns-cloudflare-propagation-seconds |
请求 Cloudflare DNS 添加相关 DNS 记录后,让 ACME 服务等待多少秒再验证 DNS 记录。主要用来防止 DNS 记录添加后,缓存 DNS 服务器未来得及更新最新记录。 默认为 10 |
假设有 Cloudflare 账号的 Global API Key,则 Credentials 配置文件内容参考如下
# Cloudflare API credentials used by Certbot |
申请证书的具体命令如下,如果是第一次申请,需要根据提示填写自己的邮箱信息并同意许可协议,邮箱用于接受之后系统发送的错误或者域名证书过期等信息
certbot certonly \ |
如果是非交互式环境,可以使用参数
--email your-email@example.com
和--agree-tos
自动绑定邮箱并同意许可
docker compose 简介
Compose
项目是 Docker
官方的开源项目,负责实现对 Docker 容器集群
的快速编排。
Compose
定位是 「定义和运行多个 Docker
容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig
。
使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML
格式)来定义一组相关联的应用容器为一个项目(project
)。Compose
中有两个重要的概念:
服务 (service)
: 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。项目 (project)
: 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义。
Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose
目前分为 2 个大版本: [1]
Compose V1
: 目前已经不提供官方支持。使用Python
编写,通过docker-compose
命令来调用。Compose V1
的docker-compose.yml
最开始要包含version
命令,取值范围2.0
到3.8
Compose V2
: 使用Go
编写,通过docker compose
命令来调用。Compose V2
忽略docker-compose.yml
最开始的version
指令。Compose V2
向后兼容Compose V1
版本
Linux 进程常见状态说明
状态标识 | 状态名称 | 状态说明 | 示例 |
---|---|---|---|
R |
task_running | 进程处于运行或就绪状态 | |
S |
task_interruptible sleeping |
可中断的睡眠状态 | |
D |
task_uninterruptible | 不可中断的睡眠状态 1. 它是一种睡眠状态,意味着处于此状态的进程不会消耗 CPU 2. 睡眠的原因是等待某些资源(比如锁或者磁盘 IO),这也是非常多 D 状态的进程都处在处理 IO 操作的原因 3. 是它不能被中断,这个要区别于 硬件中断 的中断,是指不希望在其获取到资源或者超时前被终止。因此他不会被信号唤醒,也就不会响应 kill -9 这类信号。这也是它跟 S(可中断睡眠) 状态的区别 |
|
T |
task_stopped task_traced Traced |
暂停状态或跟踪状态 | |
Z |
task_dead exit_zombie zombie |
退出状态,进程成为僵尸进程 | |
X |
task_dead exit_dead |
退出状态,进程即将被销毁 | |
I |
idle | 空闲状态 |
进程命令名和进程可执行文件名
在系统中遇到以下进程:
# ps -elf | grep 18686 |
其中 PID 为 18686
的进程名为 /usr/sbin/CROND
,其启动了另外两个子进程。但是在系统中检查,并不存在路径 /usr/sbin/CROND
# ls -l /usr/sbin/CROND |
出现此种现象,主要是因为 在启动时,进程的命令名是根据路径传递给 execve()
函数的参数决定的,而不是直接与系统中的文件进行匹配。
在 Linux 系统中,ps
命令显示的进程信息是从 /proc
文件系统中获取的,而 /proc
文件系统包含有关正在运行的进程的信息,包括每个进程的命令名。因此,即使实际上系统中不存在 /usr/sbin/CROND
文件,但如果进程的命令名是 /usr/sbin/CROND
,那么 ps
命令仍然会显示进程的命令名为 /usr/sbin/CROND
。
进程的命令名可以查看 /proc/<PID>/cmdline
文件,本示例中显示如下:
# cat /proc/18686/cmdline |
对应的系统上的可执行文件的名称可以查看 /proc/<PID>/stat
、/proc/<PID>/comm
、/proc/<PID>/status
等文件
# cat /proc/900/comm |
在本示例中,实际执行的命令为 crond
参考文档
Prometheus Process exporter 使用
安装部署
为 process-exporter
生成 systemd
服务启动配置文件:
[Unit] |
建议将 process-exporter
的配置写入文件并使用 -config.path
指定配置文件。
配置进程监控
process-exporter
在配置文件中使用模板变量来配置筛选要监控的进程,可以使用的模板变量包括:
变量 | 说明 | 示例 |
---|---|---|
{{.Comm}} |
匹配进程的命令名(不包括路径)。主要来源于 /proc/<pid>/stat 输出中的第二部分命令名是指进程执行时的名称。在 Linux 系统中,可以通过 /proc/<PID>/comm 文件来获取进程的命令名。例如,如果一个进程执行的命令是 /usr/local/bin/php ,那么它的命令名就是 php 。 |
|
{{.ExeBase}} |
匹配进程的可执行文件名,不包括路径 可执行文件名是指进程的完整路径的最后一个部分。例如,如果一个进程的完整路径是 /usr/local/bin/php ,那么它的可执行文件名就是 php 。 |
|
{{.ExeFull}} |
匹配进程的可执行文件的完整路径,例如 /usr/local/php73/bin/php |
|
{{.Username}} |
匹配进程的用户名 | |
{{.Matches}} |
匹配进程的命令行参数列表 | |
{{.StartTime}} |
||
{{.Cgroups}} |
监控系统上的所有进程
要监控系统上的所有进程的运行情况,可以参考以下配置: [1]
process_names: |
- 以上配置会获取到系统上的所有进程(子进程被统计入父进程中)
- 假如配置中有多个匹配项,以上配置不能放到第一个,否则因为其可以匹配到系统中所有的进程,后续配置的匹配不会再有机会生效
监控系统上面指定进程
假如系统中运行了多个 php
的子进程,为了获取到各个子进程的统计数据,可以参考以下配置
process_names: |
使用此配置,可以获取到系统中以下进程的统计数据:
/usr/local/php73/bin/php /home/www/admin/artisan Pulldata
/usr/local/php73/bin/php /home/www/admin/artisan schedule:run
/usr/local/php73/bin/php /home/www/admin/artisan queue:work
除可以获取到以上特定进程的统计数据外,还可以统计到除此之外的其他所有进程的统计数据。
因为配置中匹配进程的顺序的关系,假如系统中还有除此之外的其他
php
进程,那么由最后的{{.Comm}}
统计到的php
进程资源使用数据中不再包含前面 3 个特定进程的资源使用数据。
脚注
iptables 服务使用说明
iptables 的底层实现是 netfilter
,netfilter 的架构是在整个网络流程的若干位置放置一些钩子,并在每个钩子上挂载一些处理函数进行处理。
IP 层的 5 个钩子点的位置,对应就是 iptables 的 5 条内置链,分别是
PREROUTING
FORWARD
INPUT
OUTPUT
POSTROUTING
当网卡收到一个网络报文送达协议栈时,最先经过的 netfilter 钩子是 PREROUTING
,此处常见的钩子函数是 目的地址转换 (DNAT)
。无论 PREROUTING
是否存在钩子处理网络数据包,下一步内核都会通过查询本地路由表决定这个数据包的流向
- 如果是发送给本地进程,则进入
INPUT
链传给本地进程 - 如果是发送给其他机器(或者其他
network namespace
),则经过 netfilter 的FORWARD
钩子传送出去,相当于将本地机器当作路由器
所有马上要发送到网络协议栈之外的数据包,都会经过 POSTROUTING
钩子,这里常见的处理函数是 源地址转换(SNAT)
或者 源地址伪装(Masquerade, 简称 Masq)
除了 5 条内置的链,iptables 还有 5 张表,这 5 张表主要是用来给 iptables 中的规则(rule)分类,系统中所有的 iptables 规则都被划分到不同的表集合中。5 张表分别为
raw
- iptables 是有状态的,即 iptables 对数据包有连接追踪 (connection trackong) 机制,而raw
可以用来去除这种追踪机制mangle
- 用于修改数据包的 IP 头信息nat
- 用于修改数据包的源或者目的地址filter
- 用于控制到达某条链上面的数据包是继续放行、直接丢弃(drop)、或拒绝(reject)security
- 用于在数据包上面应用 SELinux
表是有优先级的,5 张表的优先级从高到低是: raw
、mangle
、nat
、filter
、security
,iptables 不支持自定义表。不是每个链上都能挂表,iptables 表与链的对应关系如下图
- | PREROUTING | FORWARD | INPUT | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
raw |
Y | N | N | Y | N |
mangle |
Y | Y | Y | Y | Y |
nat (SNAT) |
N | N | Y | N | Y |
nat (DNAT) |
Y | N | N | Y | N |
filter |
N | Y | Y | Y | N |
security |
N | Y | Y | Y | N |
iptables 表和链的工作流程图如下
iptables 命令
常用选项说明
选项 | 说明 | 示例 |
---|---|---|
-F ,--flush |
清除所有规则,默认规则除外 | |
-P ,--policy |
设置默认规则 | |
-t ,--table |
指定要操作的表,默认为 filter 表 |
iptables -t nat -P INPUT ACCEPT |
--list ,-L [chain [rulenum]] |
列出(指定的链或所有链)的规则 | iptables -t nat -L -v -n --line-numbers |
--verbose ,-v |
verbose mode | |
--numeric ,-n |
不解析协议和端口号,以数字的形式显示 | |
--line-numbers |
显示规则的行号,可以根据行号对具体的规则进行操作 | |
--jump ,-j |
匹配的规则的处理 target | iptables -A INPUT -j LOG |
--append ,-A chain |
像指定的链中追加规则 | -A INPUT -i lo -j ACCEPT |
--insert ,-I chain [rulenum] |
向指定的链中指定的位置插入规则 | iptables -I INPUT 10 -p tcp --dport 80 -j ACCEPT |
--delete ,-D chain rulenum |
删除指定链中的指定位置的规则 | iptables -D INPUT 10 |
--replace ,-R chain rulenum |
更新指定链中的指定位置的规则 | |
-S, --list-rules [chain] |
按照类似 iptables-save 的输出打印规则 |
Nextcloud 安装配置
Nextcloud All-in-One
Nextcloud All-in-One 在一个 Docker 容器中提供了方便部署和维护的 Nextcloud 方式。[1]
使用 docker compose 部署
为方便后期管理及迁移,建议使用 docker compose
方式部署。docker-compose.yml
参考文件如下: [2]
version: "3" |
使用 docker compose
方式部署注意事项:
name: nextcloud_aio_mastercontainer
: Volume 名称必须是nextcloud_aio_mastercontainer
,否则会报错找不到卷nextcloud_aio_mastercontainer
:It seems like you did not give the mastercontainer volume the correct name? (The 'nextcloud_aio_mastercontainer' volume was not found.). Using a different name is not supported since the built-in backup solution will not work in that case!
启动成功后,根据提示在浏览器中打开 Nextcloud AIO setup
页面并记录页面显示的密码
You should be able to open the Nextcloud AIO Interface now on port 8080 of this server! |
根据页面提示登陆,跟随页面提示进行新实例初始化。
初始化过程中要提供域名,系统会自动为域名颁发证书(使用系统 443 端口映射到容器中的 8443 端口)
默认的 Nextcloud AIO 未部署反向代理,要使用反向代理请参考文档: Reverse Proxy Documentation
脚注
Prometheus 安装配置
环境信息
- Centos 7
- Prometheus Server 2.4
- Node Exporter v1.4.0
- Grafana v9.2.5
安装
在 Docker 中安装 Prometheus Server
创建 Prometheus Server 配置文件,如 /root/prometheus/prometheus.yml
,内容如下 [1]
# my global config |
使用 Docker 启动时挂载此文件,作为 Prometheus Server 的配置文件,之后需要修改配置,可以直接修改此文件。
docker run -d -p 9090:9090 \ |
启动后,可以通过 $Prometheus_IP:9090
访问 Prometheus Server UI
Prometheus Redis exporter 使用
Prometheus ValKey & Redis Metrics Exporter
Prometheus Redis Metrics Exporter 下载页面
redis_exporter 安装
wget https://github.com/oliver006/redis_exporter/releases/download/v1.59.0/redis_exporter-v1.59.0.linux-amd64.tar.gz |
为 redis_exporter
生成 systemd
服务配置文件 /usr/lib/systemd/system/redis_exporter.service
[Unit] |
启动 redis_exporter
服务
# systemctl daemon-reload |
redis_exporter
服务启动后,默认启动 9121
端口提供 Metrics 数据供 Prometheus 抓取。
redis_exporter 配置
redis 实例及认证信息配置
如果要通过一个 redis_exporter
实例监控多个 Redis 实例,可以参照以下配置文件配置 Redis 实例及其认证信息,如果无需密码认证,则保留密码项为空。
|
修改 redis_exporter
启动参数,使其读取上面配置的实例和其认证信息
/usr/bin/redis_exporter -redis.password-file /etc/redis_exporter_pwd_file.json |
配置 Prometheus 抓取 redis_exporter 指标
参考以下配置使用文件发现的方式配置被监控的 Redis 实例
|
targets-redis-instances.yml
文件内容包含 Targets 内容:
- labels: |
Prometheus Node exporter 使用
环境信息
- Centos 7
- Prometheus 2.44.0
- node_exporter-1.6.0
node_exporter 安装
以下步骤演示安装 node_exporter
并使用 systemd
管理服务
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz |
生成 systemd
服务配置文件 /usr/lib/systemd/system/node_exporter.service
[Unit] |
执行以下命令管理服务
$ systemctl daemon-reload |
node_exporter 配置信息
启动参数详解
参数 | 说明 | 示例 |
---|---|---|
--web.listen-address=":9100" |
node_exporter 监听端口,默认 9100 | |
--web.telemetry-path="/metrics" |
prometheus 获取 Metrics 访问的 url,默认 /metrics |
|
--log.level="info" |
日志级别 | |
--log.format="logger:stderr" |
日志打印格式 | |
--collector.disable-defaults |
关闭默认的采集项 | |
--no-collector.${item} |
关闭某一项默认开启的采集项 | --no-collector.cpu |
--collector.systemd.unit-include="(docker'|'sshd).service" |
收集指定服务的指标 |
可以配置通过正则表达式屏蔽或者选择某些监控项 [1]
参数 | 说明 | 示例 |
---|---|---|
--collector.diskstats.ignored-devices="^(ram'|'loop'|')\\d+$" |
忽略某些磁盘的信息收集 | |
--collector.filesystem.ignored-mount-points="^/(dev'|'proc'|')($'|'/)" |
忽略某些文件系统挂载点的信息收集 | |
--collector.filesystem.ignored-fs-types="^(autofs'|'proc)$" |
忽略某些文件系统类型的信息收集 | |
--collector.netclass.ignored-devices="^$" |
忽略某些网络类的信息收集 | |
--collector.netdev.ignored-devices="^$" |
忽略某些网络设备的信息收集 | |
--collector.netstat.fields="^$" |
配置需要获取的网络状态信息 | |
--collector.vmstat.fields="^(oom_kill'|'pgpg'|'pswp).*" |
配置 vmstat 返回信息中需要收集的选项 |
功能对照表
默认开启的功能
默认开启的功能 [1]
名称 | 说明 | 系统 |
---|---|---|
arp |
从 /proc/net/arp 中收集 ARP 统计信息 |
Linux |
conntrack |
从 /proc/sys/net/netfilter/ 中收集 conntrack 统计信息 |
Linux |
cpu |
收集 cpu 统计信息 | Darwin, Dragonfly, FreeBSD, Linux |
diskstats |
从 /proc/diskstats 中收集磁盘 I/O 统计信息 |
Linux |
edac |
错误检测与纠正统计信息 | Linux |
entropy |
可用内核熵信息 | Linux |
exec |
execution 统计信息 | Dragonfly, FreeBSD |
filefd |
从 /proc/sys/fs/file-nr 中收集文件描述符统计信息 |
Linux |
filesystem |
文件系统统计信息,例如磁盘已使用空间 | Darwin, Dragonfly, FreeBSD, Linux, OpenBSD |
hwmon |
从 /sys/class/hwmon/ 中收集监控器或传感器数据信息 |
Linux |
infiniband |
从 InfiniBand 配置中收集网络统计信息 | Linux |
loadavg |
收集系统负载信息 | Darwin, Dragonfly, FreeBSD, Linux, NetBSD, OpenBSD, Solaris |
mdadm |
从 /proc/mdstat 中获取设备统计信息 |
Linux |
meminfo |
内存统计信息 | Darwin, Dragonfly, FreeBSD, Linux |
netdev |
网口流量统计信息,单位 bytes | Darwin, Dragonfly, FreeBSD, Linux, OpenBSD |
netstat |
从 /proc/net/netstat 收集网络统计数据,等同于 netstat -s |
Linux |
sockstat |
从 /proc/net/sockstat 中收集 socket 统计信息 |
Linux |
stat |
从 /proc/stat 中收集各种统计信息,包含系统启动时间,forks, 中断等 |
Linux |
textfile |
通过 --collector.textfile.directory 参数指定本地文本收集路径,收集文本信息 |
any |
time |
系统当前时间 | any |
uname |
通过 uname 系统调用, 获取系统信息 |
any |
vmstat |
从 /proc/vmstat 中收集统计信息 |
Linux |
wifi |
收集 wifi 设备相关统计数据 |
Linux |
xfs |
收集 xfs 运行时统计信息 | Linux (kernel 4.4+) |
zfs |
收集 zfs 性能统计信息 | Linux |
默认关闭的功能
默认关闭的功能 [1]
名称 | 说明 | 系统 |
---|---|---|
bonding |
收集系统配置以及激活的绑定网卡数量 | Linux |
buddyinfo |
从 /proc/buddyinfo 中收集内存碎片统计信息 |
Linux |
devstat |
收集设备统计信息 | Dragonfly, FreeBSD |
drbd |
收集远程镜像块设备(DRBD)统计信息 | Linux |
interrupts |
收集更具体的中断统计信息 | Linux,OpenBSD |
ipvs |
从 /proc/net/ip_vs 中收集 IPVS 状态信息,从 /proc/net/ip_vs_stats 获取统计信息 |
Linux |
ksmd |
从 /sys/kernel/mm/ksm 中获取内核和系统统计信息 |
Linux |
logind |
从 logind 中收集会话统计信息 |
Linux |
meminfo_numa |
从 /proc/meminfo_numa 中收集内存统计信息 |
Linux |
mountstats |
从 /proc/self/mountstat 中收集文件系统统计信息,包括 NFS 客户端统计信息 |
Linux |
nfs |
从 /proc/net/rpc/nfs 中收集 NFS 统计信息,等同于 nfsstat -c |
Linux |
qdisc |
收集队列推定统计信息 | Linux |
runit |
收集 runit 状态信息 |
any |
supervisord |
收集 supervisord 状态信息 |
any |
systemd |
从 systemd 中收集设备系统状态信息 |
Linux |
tcpstat |
从 /proc/net/tcp 和 /proc/net/tcp6 收集 TCP 连接状态信息 |
Linux |
配置示例
采集白名单配置
关闭默认的采集项,只开启指定的采集项(白名单)
node-exporter --collector.disable-defaults --collector.cpu --collector.meminfo |
向 Telegram 发送消息
环境信息
- Centos 7
- Python 3
在 Telegram 中生成 Bot
首先在 telegram 中搜索
@BotFather
,和其对话,根据提示创建 机器人,记录下生成的token
信息创建新的 Channel 或者 Group 或者将刚刚新建的 Bot 加入已有的 Channel/Group。
获取 ChatGroup ID,可以使用以下方法之一
添加机器人
@get_id_bot
到 Channel,会自动显示Chat ID
使用以下代码获取
>>> import requests
>>> response = requests.get(f'https://api.telegram.org/bot{token}/getUpdates')
>>> data = response.json()
>>> chat_id = data['result'][0]['message']['chat']['id']
>>> chat_id
-992754669
使用 curl 向 telegram 发送消息
$ curl -v "https://api.telegram.org/bot{token}/sendMessage?text=sa&chat_id=-992754669" |
使用 python 向 telegram 发送消息
使用 requests 库
>>> import requests |
使用 telegram 库
需要安装 python-telegram-bot
pip install --upgrade python-telegram-bot |
发送消息代码
>>> import telegram |
如果需要在非异步环境中(例如 Django 试图函数) 运行以上异步代码,会报错: RuntimeError: There is no current event loop in thread 'Thread-1'
。需要特殊处理,可以使用 asyncio.run()
函数来运行异步代码,它可以在非异步环境中创建一个新的事件循环并运行异步函数。
Django 视图中参考代码如下
def send_message_to_tg(chat_id: int, text: str): |
Grafana 使用
Grafana 是一款用 GO 语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。
基础概念
组织(Organization) 与用户(User)
Organization 相当于一个 Namespace,一个 Organization 完全独立于另一个 Organization,包括 datasource
、dashboard
等,创建一个 Organization 就相当于打开了一个全新的视图,所有的 datasource
、dashboard
等都需要重新创建。一个用户(User) 可以属于多个 Organization。
User 是 Grafana 里面的用户,用户可以有以下 角色
admin
- 管理员权限,可以执行任何操作。editor
- p不可以创建用户、不可以新增Datasource
、可以创建 Dashboard**viewer
- 仅可以查看 Dashboardread only editor
- 允许用户修改 Dashboard,但是 不允许保存
数据源 Datasource
Grafana 中操作的数据集、可视化数据的来源
Dashboard
在 Dashboard 页面中,可以组织可视化数据图表。
Panel
- 在一个 Dashboard 中,Panel 是最基本的可视化单元。通过 Panel 的Query Editor
可以为每一个 Panel 添加查询的数据源以及数据查询方式。每一个 Panel 都是独立的,可以选择一种或者多种数据源进行查询。一个 Panel 中可以有多个Query Editor
来汇聚多个可视化数据集Row
- 在 Dashboard 中,可以定义一个Row
,来组织和管理一组相关的Panel
Variables
在 Dashboard 的设置页面中,有 Variables
页面,在其中可以为 Dashboard 配置变量,之后可以在 Panel 的 Query Editor
中使用这些预定义的变量。变量的值也可以是通过表达式获取的值。也可以在 Panel 的标题中使用变量
例如以下 Variables 配置
Node label_values(kubernetes_io_hostname) |
在 Dashboard 中定义了这些变量后,可以在 Panel 的 Query Editor
中使用,在 Query Editor
中使用了 Variables 中定义的变量后,在 Dashboard 的顶部下拉菜单中可以选择预定义的变量的值(需要在定义 Variables 时配置 Show on dashboard
为 Label and Value
以使在 Dashboard 顶部显示下拉菜单),Panel 中的 Query
表达式就会使用这些变量的值进行计算以及显示图表。
Django 常见错误
环境信息
- centos7
- python3
- Django 4
ModuleNotFoundError: No module named ‘MySQLdb’
ModuleNotFoundError: No module named ‘MySQLdb’
…
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
解决方法
pip3 install pymysql |
编辑文件./python36/lib/python3.6/site-packages/django/db/backends/mysql/__init__.py
, 输入以下内容
import pymysql |
Nginx 安装及升级
本文档主要做为需要安装或升级 Nginx 版本或者需要重新编译 Nginx 为其添加新模块时的参考。Nginx 服务常用配置说明
环境信息
- Centos 7 5.4.225-1
- nginx stable 1.24.0
编译安装 Nginx
编译安装 Nginx 之前,首先需要安装依赖包 [1]
pcre
cd /tmp |
zlib
cd /tmp |
openssl
cd /tmp |
编译安装 Nginx
下载 Nginx stable 版本编译安装
wget https://nginx.org/download/nginx-1.24.0.tar.gz |
要启用或者停用指定的 Nginx 自带模块,参考 Nginx 编译配置选项说明
此处编译配置添加第三方模块 nginx-module-vts
以支持 Prometheus。执行以下命令编译 Nginx 并添加第三方模块 nginx-module-vts
。Nginx 和 nginx-module-vts 版本兼容列表
wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.2.tar.gz |
编译安装后的软件包,只需要安装好依赖,便可以迁移到其他机器上面使用,本文档编译安装后的软件包下载链接
为 Nginx 配置 systemd 管理配置文件
为了能使用 systemctl
管理源码编译安装的 nginx,可以为其使用以下配置文件将其托管到 systemd
[Unit] |
Prometheus 采集 Nginx 监控数据
参考步骤安装 nginx-module-vts
模块,以支持 Prometheus 采集 Nginx 统计数据。
如果要统计 Nginx 所有的 vhost 数据,则将 nginx-module-vts
模块相关配置放置于 http
模块内,否则可以在只想要监控(统计)的 vhost (server
配置段) 中添加配置。
nginx-module-vts
模块相关配置命令说明:
命令 | 说明 | 用法示例 |
---|---|---|
vhost_traffic_status_zone |
定义 vhost_traffic_status 模块使用的共享内存区域。用于存储虚拟主机的流量统计信息 |
vhost_traffic_status_zone shared_memory_name size; shared_memory_name 是共享内存区域的名称,size 是共享内存区域的大小。 |
vhost_traffic_status_filter_by_host |
按主机名过滤虚拟主机状态信息 默认会将流量全部计算到第一个 server_name 上;启用后,只会显示与请求的主机名匹配的虚拟主机状态信息。 |
vhost_traffic_status_filter_by_host on; |
vhost_traffic_status_filter_by_set_key |
根据自定义键值对来过滤虚拟主机的状态信息 | vhost_traffic_status_filter_by_set_key $host$request_uri; |
vhost_traffic_status_filter_by_set_zone |
过滤器使用的共享内存区域 | |
vhost_traffic_status_display |
用于显示虚拟主机状态信息的格式 支持 json 、CSV 和 html |
vhost_traffic_status_display_format html; |
vhost_traffic_status_display_format |
用于显示虚拟主机状态信息的字段格式。 可以选择显示的字段有:request、status、request_time、request_length、request_method、request_uri、request_length、request_time、request_time_counter、request_time_counter_overflows、request_time_min、request_time_max、request_time_avg、request_time_median、request_time_percentile。 |
vhost_traffic_status_display_format field1 field2 ...; |
为了获取所有域名的统计信息,在 Nginx 的 http
模块内添加以下配置:
http { |
重载配置后查看请求内容:
# curl localhost:8888/status |
统计信息输出结果支持多种格式:
localhost:8888/status/format/json
- Jsonlocalhost:8888/status/format/html
- Htmllocalhost:8888/status/format/jsonp
- Jsonplocalhost:8888/status/format/prometheus
- Prometheuslocalhost:8888/status/format/control
- control
在 Prometheus 中添加以下 Targets 配置抓取 nginx-module-vts
模块暴露出的统计信息
- job_name: "Nginx" |
在 Prometheus 中检查抓取到的数据
常见错误
error while loading shared libraries
Nginx 编译安装成功后,启动报错
$ /usr/local/nginx-1.24.0/sbin/nginx -t |
问题原因 为 Nginx 在系统的库文件路径中未找到已经安装的 libpcre2-8.so.0
库文件。可以通过以下方式验证
- 搜索
libpcre2-8.so.0
,可以看到系统上已经存在此库文件/usr/local/lib/libpcre2-8.so.0
$ find / -name libpcre2-8.so.0
/usr/local/lib/libpcre2-8.so.0 - 检查此库文件是否在系统已加载的库文件中。执行以下命令搜索系统已经加载的库文件,发现没有
/usr/local/lib/libpcre2-8.so.0
$ ldconfig -p | grep libpcre
libpcre32.so.0 (libc6,x86-64) => /lib64/libpcre32.so.0
libpcre16.so.0 (libc6,x86-64) => /lib64/libpcre16.so.0
libpcreposix.so.0 (libc6,x86-64) => /lib64/libpcreposix.so.0
libpcrecpp.so.0 (libc6,x86-64) => /lib64/libpcrecpp.so.0
libpcre.so.1 (libc6,x86-64) => /lib64/libpcre.so.1 - 检查系统共享库文件的查找路径的配置文件
/etc/ld.so.conf
,发现其中不包括路径/usr/local/lib/
,因此位于此路径下的共享库文件无法被搜索到$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
要解决此问题,可以使用以下方法之一:
添加
/usr/local/lib/
到系统共享库查找路径配置文件/etc/ld.so.conf
/etc/ld.so.conf include ld.so.conf.d/*.conf
/usr/local/lib/执行以下命令,使配置生效
ldconfig
设置系统环境变量
LD_LIBRARY_PATH
,这个变量定义了系统共享库的查找目录。将/usr/local/lib
添加到此变量的值中,要永久生效需要将其写入配置文件,如~/.bash_profile
等export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
创建符号链接
ln -s /usr/local/lib/libpcre2-8.so.0 /usr/local/nginx-1.24.0/sbin/libpcre2-8.so.0
或者
ln -s /usr/local/lib/libpcre2-8.so.0 /lib64/libpcre2-8.so.0
SSL modules require the OpenSSL library
执行以下命令执行编译前配置时报错 ./configure: error: SSL modules require the OpenSSL library.
:
# ./configure --prefix=/usr/local/nginx-1.24.0 \ |
此报错原因为未找到 OpenSSL 的库文件。
针对此场景,可以通过在编译配置时指定 OpenSSL 的源码中库文件的具体位置(--with-openssl=/tmp/openssl-1.1.1t
),参考以下命令
./configure --prefix=/usr/local/nginx-1.24.0 \ |
Error 127
Nginx 执行 make
命令时报错: /bin/sh: line 2: ./config: No such file or directory
# ./configure --prefix=/usr/local/nginx-1.24.0 \ |
错误信息表明在编译 nginx 时,make
命令无法找到 OpenSSL 的配置脚本 config
。此脚本位于 OpenSSL 的源码目录中。可以通过 --with-openssl=/tmp/openssl-1.1.1t
指定。
修改编译前的配置命令如下:
./configure --prefix=/usr/local/nginx-1.24.0 \ |
getpwnam(“nginx”) failed
nginx 报错
nginx: the configuration file /usr/local/nginx-1.24.0/conf/nginx.conf syntax is ok |
问题原因 为 nginx
用户不存在,创建 nginx
用户或者修改配置文件,使用已有的用户运行 nginx
参考链接
脚注
Nginx 服务常用配置说明
Nginx 服务配置
全局通用配置
user nginx nginx; |
Prometheus 指标汇总
环境信息
- Prometheus 2.44.0
- Grafana 9.5.2
- Kubernetes 1.24
Kubernetes 相关指标
Kubernetes 中部署并监控 Kubernetes 集群参考。配置 Prometheus 监控 Kubelet 之后可以采集到 Kubelet 监控指标。
配置 Prometheus 读取 cAdvisor 之后可以通过 cAdvisor 采集到容器相关的监控指标。
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
kubelet_pod_start_duration_seconds_count |
Pod 启动的时间 | ||
kubelet_pod_start_duration_seconds_bucket |
Pod 启动的时间的延迟直方图数据 | kubelet_pod_start_duration_seconds_bucket{le="0.5"} |
|
kubelet_running_pods |
运行的 Pod 的数量 | ||
kubelet_running_containers |
运行的 Containers 的数量 | ||
kubelet_runtime_operations_errors_total |
Kubelet 和 CRI 交互产生的错误(类型) | ||
kubelet_started_containers_total |
Kubelet 启动的 Container 总数 | ||
kubelet_started_pods_total |
Kubelet 启动的 Pod 总数 | ||
kubelet_volume_stats_available_bytes |
PV Volume 可以使用的磁盘空间 | ||
kube_node_status_allocatable kube_node_status_capacity |
节点的可分配的 资源 数量 | kube_node_status_allocatable{resource="pods"} 节点可分配的 Pod 的数量 |
|
kubelet_started_pods_total |
Counter |
已启动的 Pod 数量 | |
container_cpu_usage_seconds_total |
Counter |
Container 使用的 CPU | |
container_memory_usage_bytes |
Gauge |
Pod 使用的内存 | container_memory_usage_bytes{namespace="default"} |
kube_pod_container_status_restarts_total |
Counter |
Pod 的重启次数 |
nginx-ingress-controller 相关指标
配置 Prometheus 监控 Ingress-Nginx-Controller 指标 后,Prometheus 可以读取到 Ingress-Nginx-Controller 暴露的监控指标。
Grafana 中配置使用 Ingress-Nginx-Controller 指标示例
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
nginx_ingress_controller_requests |
Counter |
Ingress Nginx Controller 接收到的所有请求数,,包括各个状态码 | irate(nginx_ingress_controller_requests[2m]) - 请求速率 |
nginx_ingress_controller_nginx_process_connections |
连接数,包括各个状态码 | ||
nginx_ingress_controller_request_duration_seconds_sum |
请求持续时间的总和 请求持续时间是从请求进入 Ingress 控制器开始,到响应返回给客户端结束的整个时间 |
||
nginx_ingress_controller_request_duration_seconds_count |
请求持续时间的计数。 | 计算平均请求持续时间:平均请求持续时间 = 请求持续时间总和 / 请求持续时间计数 | |
nginx_ingress_controller_ingress_upstream_latency_seconds_sum |
upstream 占用时间的总和 upstream 占用时间是指请求从 Ingress 到达 upstream(backend)服务器的时间 |
||
nginx_ingress_controller_ingress_upstream_latency_seconds_count |
upstream 上游占用时间的计数 | 计算平均上游占用时间:平均上游占用时间 = 上游占用时间总和 / 上游占用时间计数。 |
node 相关指标
主机信息
包括 CPU 架构、内核版本、操作系统类型、主机名等,集中在指标 node_uname_info
中。
CPU
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
node_cpu_seconds_total |
Counter |
CPU 使用时间 | node_cpu_seconds_total{mode="idle"} - CPU 空闲时间 |
统计节点 CPU 使用率
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) |
Memory
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
node_memory_MemTotal_bytes |
Gauge |
总的内存 | |
node_memory_MemFree_bytes |
Gauge |
空闲内存 | |
node_memory_Cached_bytes |
Gauge |
Cache 内存 | |
node_memory_Buffers_bytes |
Gauge |
Buffers 内存 |
统计节点的 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 |
Network
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
node_network_receive_bytes_total |
Counter |
网卡接收的流量 | |
node_network_transmit_bytes_total |
Counter |
网卡发送的流量 |
网卡流量带宽
irate(node_network_receive_bytes_total{device!~"cni0|docker.*|flannel.*|veth.*|virbr.*|lo",kubernetes_io_hostname=~"$node"}[$prometheusTimeInterval]) |
Django model 使用
环境信息
- Python 3.10
- Django 4.1
在 Project/App 的 models.py
文件中创建 model
,当 model 定义完成,Django 会自动生产一个后台管理接口,允许认证用户添加、更改和删除对象,只需在管理站点上注册模型即可 [1]
创建 model
在 Project/App 的 models.py
文件中创建 model
from django.db import models |
对修改后的 model
进行 migrate
,以使在数据库中变更更改。
python manage.py makemigrations |
model 注册到后台
在 Project/App 的 admin.py
文件中注册 model
from django.contrib import admin |
更多有关 admin 配置方法,请参考 Django admin 配置