安装 Ansible
略,看我博客:# Ansible 环境搭建
创建 Ansible Playbook
在控制节点(192.168.92.19)上执行:
cd /root/ansible-playbook
mkdir -p roles/prometheus/{tasks,files}
# 将你手工部署的整个 docker-prometheus 目录复制到角色的 files 下
scp -r root@192.168.92.11:/data/docker-prometheus /root/ansible-playbook/roles/prometheus/files/
192.168.92.11:/data/docker-prometheus看我的文章:# Docker Compose 一键部署 Prometheus + Alertmanager + Grafana 完整监控方案
这里的ansible控制节点还是192.168.92.19,但是被控制节点(192.168.92.20)已经被我用快照还原为了初始状态
提醒:Docker Compose 默认查找 docker-compose.yml,这是标准做法。
项目的树形包结构
[root@ansible ansible-playbook]# tree
.
├── roles
│ ├── docker_install
│ │ ├── files
│ │ │ └── docker-compose-Linux-x86_64
│ │ ├── handlers
│ │ │ └── main.yml
│ │ └── tasks
│ │ └── main.yml
│ ├── mysql
│ │ ├── files
│ │ │ └── init.sql
│ │ └── tasks
│ │ └── main.yml
│ ├── nginx
│ │ ├── tasks
│ │ │ └── main.yml
│ │ └── templates
│ │ └── nginx.conf.j2
│ ├── prometheus
│ │ ├── files
│ │ │ └── docker-prometheus
│ │ │ ├── alertmanager
│ │ │ │ └── config.yml
│ │ │ ├── docker-compose.yml
│ │ │ ├── grafana
│ │ │ │ ├── config.monitoring
│ │ │ │ └── provisioning
│ │ │ └── prometheus
│ │ │ ├── alert.yml
│ │ │ ├── prometheus.yml
│ │ │ └── prometheus.yml.back
│ │ └── tasks
│ │ └── main.yml
│ ├── redis
│ │ └── tasks
│ │ └── main.yml
│ ├── springboot
│ │ ├── files
│ │ │ └── Springbootdemo-0.0.1-SNAPSHOT.jar
│ │ ├── tasks
│ │ │ └── main.yml
│ │ └── templates
│ │ └── Dockerfile.j2
│ ├── system_init
│ │ └── tasks
│ │ └── main.yml
│ └── vue
│ ├── files
│ │ └── dist
│ │ ├── assets
│ │ │ ├── 1-DxVeaUtM.jpg
│ │ │ ├── 2-U6Qjex4J.jpg
│ │ │ ├── yun-DW8jof7n.jpg
│ │ │ ├── index-CYqzScuv.js
│ │ │ └── index-Cp89o39-.css
│ │ ├── favicon.ico
│ │ └── index.html
│ └── tasks
│ └── main.yml
├── site.yml
└── site2.yml
32 directories, 29 files
编写prometheus/tasks/main.yml
目前 prometheus 角色缺少 tasks/main.yml,你需要创建它
#vi roles/prometheus/tasks/main.yml
---
- name: 创建监控部署目录
file:
path: /data/docker-prometheus #指定目录路径
state: directory #确保创建的是目录(如果已存在则不会报错)
mode: '0755' #设置目录权限为 755(所有者可读写执行,其他用户可读执行)
- name: 复制监控配置文件 #将角色中 files/docker-prometheus/ 目录下的所有配置文件复制到远程主机的 /data/docker-prometheus/ 目录。
copy:
src: docker-prometheus/ #Ansible 会从角色的 files 目录查找 docker-prometheus/ 目录
dest: /data/docker-prometheus/ #目标目录
mode: preserve #保留源文件的权限(不会覆盖文件权限)
- name: 创建 Grafana 数据卷
shell: docker volume create grafana_data 2>/dev/null || true
changed_when: false #因为卷创建成功后不会改变系统状态
- name: 初始化 Grafana 数据卷权限
shell: docker run --rm -v grafana_data:/var/lib/grafana alpine chown -R 472:472 /var/lib/grafana 2>/dev/null || true
changed_when: false
- name: 启动监控栈
shell: cd /data/docker-prometheus && /usr/local/bin/docker-compose up -d
changed_when: false #因为 docker-compose up -d 在容器已启动时不会改变状态
运行 Ansible Playbook
创建主 Playbook site2.yml
site2.yml 中的 roles 列表会严格按照定义的顺序依次执行。
在 ansible-playbook/ 目录下创建 site2.yml 文件:
- hosts: webservers
become: yes
roles:
- system_init # 1. 系统基础配置
- docker_install # 2. 安装 Docker、Docker Compose、Python 依赖
- prometheus # 3. 部署监控平台(Prometheus + Grafana + Alertmanager)
在 Ansible 控制节点(192.168.92.19)上执行 ,由于使用了 docker_network、docker_container 等模块,需要安装 community.docker 集合:
ansible-galaxy collection install community.docker
cd /root/ansible-playbook
ansible-playbook site2.yml
[root@ansible ansible-playbook]# ansible-playbook site2.yml
PLAY [webservers] **************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************
ok: [192.168.92.20]
TASK [system_init : 停止 firewalld 服务] ***************************************************************************************************
ok: [192.168.92.20]
TASK [system_init : 禁用 SELinux(临时)] **************************************************************************************************
ok: [192.168.92.20]
TASK [system_init : 永久禁用 SELinux(修改配置文件)] **************************************************************************************
ok: [192.168.92.20]
TASK [system_init : 备份原 yum 源并替换为阿里云源] *****************************************************************************************
changed: [192.168.92.20]
TASK [system_init : 安装基础工具包] ********************************************************************************************************
ok: [192.168.92.20]
TASK [docker_install : 移除旧版 Docker 组件] ***********************************************************************************************
changed: [192.168.92.20]
TASK [docker_install : 安装必要依赖包] *****************************************************************************************************
ok: [192.168.92.20]
TASK [docker_install : 下载 Docker CE 仓库文件] ********************************************************************************************
changed: [192.168.92.20]
TASK [docker_install : 替换仓库地址为华为云] ***********************************************************************************************
changed: [192.168.92.20]
TASK [docker_install : 安装 Docker CE] *****************************************************************************************************
changed: [192.168.92.20]
TASK [docker_install : 启动 Docker 服务并设置开机自启] *************************************************************************************
changed: [192.168.92.20]
TASK [docker_install : 创建 Docker 配置目录] ***********************************************************************************************
ok: [192.168.92.20]
TASK [docker_install : 配置镜像加速器] *****************************************************************************************************
ok: [192.168.92.20]
TASK [docker_install : 安装 pip] ***********************************************************************************************************
ok: [192.168.92.20]
TASK [docker_install : 安装 Python 依赖(requests 和 docker)] *****************************************************************************
ok: [192.168.92.20]
TASK [docker_install : 复制 Docker Compose 二进制文件] *************************************************************************************
ok: [192.168.92.20]
TASK [docker_install : 验证 Docker Compose 安装] *******************************************************************************************
ok: [192.168.92.20]
TASK [docker_install : 输出 Docker Compose 版本] *******************************************************************************************
skipping: [192.168.92.20]
TASK [docker_install : 创建 Docker 网络 app-network] ***************************************************************************************
ok: [192.168.92.20]
TASK [prometheus : 创建监控部署目录] *******************************************************************************************************
ok: [192.168.92.20]
TASK [prometheus : 复制监控配置文件] *******************************************************************************************************
ok: [192.168.92.20]
TASK [prometheus : 创建 Grafana 数据卷] ****************************************************************************************************
ok: [192.168.92.20]
TASK [prometheus : 初始化 Grafana 数据卷权限] **********************************************************************************************
ok: [192.168.92.20]
TASK [prometheus : 启动监控栈] *************************************************************************************************************
ok: [192.168.92.20]
PLAY RECAP *********************************************************************************************************************************
192.168.92.20 : ok=24 changed=6 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
验证部署
[root@ansible ~]# ansible webservers -m shell -a 'docker ps'
192.168.92.20 | CHANGED | rc=0 >>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
279a9342d318 grafana/grafana:9.3.16 "/run.sh" 7 hours ago Up 7 minutes 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp grafana
98aa6a7867ec prom/prometheus:v2.45.5 "/bin/prometheus --c..." 7 hours ago Up 7 minutes 0.0.0.0:9090->9090/tcp, [::]:9090->9090/tcp prometheus
e7698ac56148 prom/alertmanager:v0.27.0 "/bin/alertmanager -..." 7 hours ago Up 7 minutes 0.0.0.0:9093->9093/tcp, [::]:9093->9093/tcp alertmanager
763a31657f5b m.daocloud.io/gcr.io/cadvisor/cadvisor:v0.47.2 "/usr/bin/cadvisor -..." 7 hours ago Up 7 minutes (healthy) 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp cadvisor
b1317aba91a2 prom/node-exporter:v1.8.0 "/bin/node_exporter ..." 7 hours ago Up 7 minutes 0.0.0.0:9100->9100/tcp, [::]:9100->9100/tcp node-exporter
[root@ansible ~]# ansible webservers -m shell -a 'ss -lntp | egrep "3000|9090|9100|9093"'
192.168.92.20 | CHANGED | rc=0 >>
LISTEN 0 4096 0.0.0.0:3000 0.0.0.0:* users:(("docker-proxy",pid=2001,fd=8))
LISTEN 0 4096 0.0.0.0:9093 0.0.0.0:* users:(("docker-proxy",pid=2036,fd=8))
LISTEN 0 4096 0.0.0.0:9090 0.0.0.0:* users:(("docker-proxy",pid=2103,fd=8))
LISTEN 0 4096 0.0.0.0:9100 0.0.0.0:* users:(("docker-proxy",pid=2072,fd=8))
LISTEN 0 4096 [::]:3000 [::]:* users:(("docker-proxy",pid=2011,fd=8))
LISTEN 0 4096 [::]:9093 [::]:* users:(("docker-proxy",pid=2041,fd=8))
LISTEN 0 4096 [::]:9090 [::]:* users:(("docker-proxy",pid=2109,fd=8))
LISTEN 0 4096 [::]:9100 [::]:* users:(("docker-proxy",pid=2078,fd=8))



实验完毕!