ansible-Role角色批量按照node_export节点,并追加信息到Prometheus文件中

文章目录

      • 剧本功能
    • inventory.yaml文件定义
    • deploy.yaml角色定义
    • node_exporter_lock角色定义
    • 任务角色main.yaml
      • node_exporter_tasks.yml角色
      • 触发任务notify
      • extra_tasks.yml角色
      • prometheus_node_config.j2模板文件
    • 执行命令
    • 查看变量

剧本功能

功能1: 批量执行node_export节点,并判断操作系统,有俩份文件
功能2: 获取当前组并追加到ROle角色通用变量里面提供全部角色使用
功能3: 任务角色里面又分任务执行一个安装一个收集信息
功能:其他功能懒得总结了,大家看文章吧

inventory.yaml文件定义

[equipment:vars]  
group = "equipment" 
[equipment]
WA510-生产-设备管理09  ansible_internal_ip=xxxx  ansible_host=xxxx
WA485-生产-设备管理08  ansible_internal_ip=xxxx  ansible_host=xxxx

image.png

deploy.yaml角色定义

- name: 任务总线
  become: true
  gather_facts: yes
  hosts: oa 
  tasks:
    - name: 加载变量
      include_vars:
        file: ./vars/vars.yaml

    - name: 获取当前组名
      set_fact:
        group_name: "{{ group_names[0] }}"
      run_once: true

    - name: 生成 main.yml 文件
      lineinfile:
        path: "/root/ansible_role_k8s/init_roles/defaults/main.yml"
        regexp: '^group:'
        line: "group: {{ group_name }}"
      delegate_to: localhost  # 指定任务在本地执行
      run_once: true

    - name: 加载更新后的默认变量
      include_vars:
        file: "/root/ansible_role_k8s/init_roles/defaults/main.yml"  # 使用绝对路径
      delegate_to: localhost  # 指定任务在本地执行
      run_once: true

    - name: 执行 node_exporter 角色
      include_role:
        name: init_roles/node_exporter_lock
      when: "'node' in ansible_run_tags"
      tags: ['node']

    - name: 执行 init 角色
      include_role:
        name: init_roles/init
      when: "'ls' in ansible_run_tags"
      tags: ['ls']

/root/ansible_role_k8s/init_roles/defaults/main.yml文件如下

root@iZbp1bh3oeew2pt9bwrs4rZ:~/ansible_role_k8s/init_roles# cat ./defaults/main.yml
group: oa

node_exporter_lock角色定义

root@iZbp1bh3oeew2pt9bwrs4rZ:~/ansible_role_k8s/init_roles/node_exporter_lock# tree
.
├── files
│   ├── node_exporter
│   ├── node_exporter-1.8.1.linux-amd64.tar.gz
│   ├── node_exporter.service
│   └── 参数详解
├── handlers
│   └── main.yaml
├── tasks
│   ├── extra_tasks.yml
│   ├── main.6.5.yaml
│   ├── main.yaml
│   ├── main.yaml.bak
│   └── node_exporter_tasks.yml
└── templates
    ├── main.yml.j2
    └── prometheus_node_config.j2

4 directories, 12 files

任务角色main.yaml

- name: 执行 node_exporter 任务
  include_tasks: node_exporter_tasks.yml
  tags: ['node']

- name: 执行附加任务
  include_tasks: extra_tasks.yml
  tags: ['node']

image.png

node_exporter_tasks.yml角色

- name: 判断远程服务器有没有安装 node_exporter 服务
  shell: "pgrep -f 'node_exporter'"
  register: node_exporter_status
  ignore_errors: true
  tags: ['node']

- name: 判断远程服务器 9100 端口有没有被占用
  shell: "ss -lntp | grep ':9100'"
  register: port_status
  ignore_errors: true
  tags: ['node']

- name: 打印服务和端口占用情况
  debug:
    msg: "服务状态: {{ '存在' if node_exporter_status.rc == 0 else '不存在' }}, 端口状态: {{ '被占用' if port_status.rc == 0 else '未被占用' }}"
  tags: ['node']

- block:
    - name: 传输并解压 node_exporter 包到指定目录
      unarchive:
        src: /root/ansible_role_k8s/init_roles/node_exporter_lock/files/node_exporter-1.8.1.linux-amd64.tar.gz
        dest: /usr/local/bin/
        mode: '0755'
        remote_src: no

    - name: 判断操作系统是 CentOS 6、CentOS 7,或者 Ubuntu
      set_fact:
        os_version: "{{ ansible_distribution }} {{ ansible_distribution_major_version }}"

    - name: 传输并配置 node_exporter 服务文件(适用于 CentOS 6)
      copy:
        src: /root/ansible_role_k8s/init_roles/node_exporter_lock/files/node_exporter
        dest: /etc/init.d/node_exporter
        mode: '0755'
      when: os_version == 'CentOS 6'
      notify: 
        - Reload systemd
        - Enable and start node_exporter (CentOS 6)

    - name: 传输并配置 node_exporter systemd 服务文件(适用于 CentOS 7 和 Ubuntu)
      copy:
        src: /root/ansible_role_k8s/init_roles/node_exporter_lock/files/node_exporter.service
        dest: /etc/systemd/system/node_exporter.service
        mode: '0755'
      when: os_version != 'CentOS 6'
      notify: 
        - Reload systemd
        - Enable and start node_exporter
  when: port_status.rc == 1  # 仅当 9100 端口未被占用时执行整个 block
  tags: ['node']

- name: 记录未执行 block 任务的节点信息
  lineinfile:
    path: /var/log/ansible_node_exporter.log
    line: "Host {{ inventory_hostname }}: 服务状态: {{ '存在' if node_exporter_status.rc == 0 else '不存在' }}, 端口状态: {{ '被占用' if port_status.rc == 0 else '未被占用' }}"
  when: port_status.rc != 1  # 仅当 9100 端口被占用时执行
  delegate_to: localhost  # 在控制节点上执行,以便集中记录日志
  tags: ['node']

- name: 打印任务执行完成信息
  debug:
    msg: "任务执行完成"
  tags: ['node']

触发任务notify

main.yaml

- name: Reload systemd
  command: systemctl daemon-reload
  when: os_version != 'CentOS 6'

- name: Enable and start node_exporter
  systemd:
    name: node_exporter.service
    enabled: yes
    state: started
  when: os_version != 'CentOS 6'

- name: Enable and start node_exporter (CentOS 6)
  shell: chkconfig node_exporter on && service node_exporter start
  when: os_version == 'CentOS 6'

image.png

extra_tasks.yml角色

- name: 确保 prometheus_node 组已定义并且收集成功节点信息并去重
  assert:
    that: groups['prometheus_node'] is defined
    fail_msg: "The prometheus_node group is not defined in the inventory."
  run_once: true
  delegate_to: localhost
  tags: ['node']

- name: 收集成功节点信息
  set_fact:
    successful_nodes: "{{ groups['prometheus_node'] | map('extract', hostvars) }}"
  run_once: true
  delegate_to: localhost
  tags: ['node']

- name: 使用模板生成 Prometheus 配置片段
  template:
    src: prometheus_node_config.j2
    dest: "/tmp/prometheus_nodes_{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}.yml"
  delegate_to: localhost
  run_once: true
  tags: ['node']

- name: 在本地文件中追加成功节点信息
  shell: "cat {{ item }} >> /opt/prometheus/prometheus1.yml"
  with_fileglob:
    - "/tmp/prometheus_nodes_*.yml"
  delegate_to: localhost
  run_once: true
  tags: ['node']

image.png

prometheus_node_config.j2模板文件

{% for host in successful_nodes %}
  - targets:
    - "{{ host.ansible_host }}:9100"
    labels:
      instance: "{{ host.inventory_hostname }}-{{ host.ansible_host }}"
      namespace: '{{ namespace }}'
{% endfor %}

image.png

执行命令

ansible-playbook deploy.yaml --tags node

image.png

image.png

image.png

查看变量

root@iZbp1bh3oeew2pt9bwrs4rZ:~/ansible_role_k8s/init_roles# cat ./defaults/main.yml
group: oa

查看 追加node节点信息

cat /opt/prometheus/prometheus1.yml 

image.png

大概思路就是这样,需要完整Role角色的请私聊我

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706572.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记一次 .NET某工厂报警监控设置 崩溃分析

一:背景 1. 讲故事 前些天有位朋友在微信上丢了一个崩溃的dump给我,让我帮忙看下为什么出现了崩溃,在 Windows 的事件查看器上显示的是经典的 访问违例 ,即 c0000005 错误码,不管怎么说有dump就可以上windbg开干了。…

Python图像处理——基于Pytorch框架ResNet152特征提取的MNIST手写数字识别

1. 数据集介绍 MNIST手写数字数据集: http://yann.lecun.com/exdb/mnist/ MNIST 数据集一共有 7 万张图片,其中 6 万张是训练集, 1 万张是测试集。每张图片是 28 28 的 0−9 的手写数字图片组成。每个图片是黑底白字的形式,黑底…

前端技术回顾系列 10|TS 泛型在类和接口中的应用

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供动力。 上文回顾:约束泛型(Generic Constraints) 上一篇文章我们回顾了 泛型 在 TypeScript 中的高级用法 —— 泛型…

uniapp开发微信小程序预加载分包

微信小程序分包是一种优化小程序项目结构和性能的方式。它允许开发者将小程序代码包拆分成多个子包,在用户需要时动态加载这些子包,从而减少小程序的首次加载时间和主包的体积。(总体积不得大于20M,主包(共同文件静态资…

nest : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\nest.ps1,因为在此系统上禁止运行脚本。

完整报错: nest : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\nest.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkI D135170 中的 about_Execution_Policies。 问题原因: …

Ubuntu基础-vim编辑器

目录 前言: 一. 安装 二. 配置 三. 基本使用 1.使用 Vim 编辑文本文件 2.代码编辑 3.多窗口编辑 四. 总结 前言: Vim 是从 VI 发展出来的一个文本编辑器,具有代码补充、错误跳转等功能,在程序员中被广泛使用。它的设计理念是命令的组合&#xff…

Django后台忘记管理员的账号

使用命令启动项目: python manage.py runserver输入后缀/admin,进入后台管理员,如果此时忘记你先前设置的用户名与密码怎么办? 终端输入: python manage.py shell 输入以下内容,并查看返回结果&#xff…

ASM字节码插桩实现点击防抖

思路:在点击事件onclick的时候,将view的onclick在给定的时间给拦截掉。以前我们可能都是用一个util来拦截,这样在每个点击事件都得去判断,那么这里就用字节码插桩的形式来实现一下。 ASM的引入 dependencies {implementation gr…

【因果推断python】31_合成控制1

目录 一个了解无从知晓事情的超酷数学技巧 我们有时间 一个了解无从知晓事情的超酷数学技巧 当我们审视双重差分法时,我们有来自 2 个不同城市的多个客户的数据:阿雷格里港和弗洛里亚诺波利斯。数据跨越 2 个不同的时间段:在阿雷格里港进行…

关于头条项目经验面试题的总结

文章目录 前言一、论坛项目经典话术二、请你介绍一下你最近的项目吧2.1 话术1 三、你的公司的开发环境是怎么搭建的?四、登录你们是怎么做的?4.1 账号密码登录4.2 手机验证码发送4.2.1 手机验证码发送4.2.2 手机验证码登录 五、用户行为限流是怎么做的&a…

oracle 删除当前用户下所有表

荆轲刺秦王 通常呢 我们将正式环境的 oracle 数据库 导出成 dmp 文件,然后导入到测试环境或者本地环境,期间可能会出现各种问题。那么如何使错误的导入数据全部删除呢。可以这样做: 1. 本地虚拟机启动 oracle 服务 2. sqldeveloper 连接 o…

数据桥梁:无缝连接信息孤岛与分析前沿

在数字化浪潮席卷全球的今天,数据已成为推动社会进步和经济发展的重要力量。然而,在实际应用中,我们常常遇到的一个挑战是如何将分散、孤立的数据资源进行有效整合,打破“信息孤岛”,实现数据的无缝连接和高效利用。本…

【智能算法应用】基于粒子群算法的多尺度Retinex图像去雾方法

目录 1.算法原理2.粒子群算法的多尺度Retinex图像去雾方法3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】粒子群算法(PSO)原理及实现 多尺度Retinex算法 在Retinex算法中,雾化图像的形成可以总结为入射光和反射光的乘积: I ( x…

开源可二次开发的商城小程序源码系统源码 前后端分离 附带完整的安装包以及搭建部署教程

系统概述 本开源商城小程序源码系统是基于现代Web开发技术栈打造的一套高性能、易扩展的电商解决方案。它采用了前后端分离的设计模式,前端使用Vue.js或React等主流框架构建用户界面,后端则采用Node.js/Express、Spring Boot等技术栈处理业务逻辑与数据…

QT调用vs2019生成的c++动态库

QT调用vs2019生成的c动态库 dll库的创建方法: VS2019创建c动态链接库dll与调用方法-CSDN博客 加减法示范: 头文件 // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL3_EXPORTS // 符号编…

Linux Debian12使用podman安装xss-labs靶场环境

一、xss-labs简介 xss-labs靶场是一个专门用于学习和练习跨站脚本攻击(XSS)技术的在线平台。它提供了一系列的实验场景和演示,帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 二、安装podman环境 Linux Debian…

LVS/NAT负载均衡实操

添加规则,并做持久操作 1 添加规则 [rootlvs ~]# ipvsadm -A -t 10.36.178.183:80 -s wrr [rootlvs ~]# ipvsadm -a -t 10.36.178.183:80 -r 192.168.65.201:80 -m -w 3 [rootlvs ~]# ipvsadm -a -t 10.36.178.183:80 -r 192.168.65.202:80 -m -w 1[rootlvs ~]# ipvsadm -Ln …

第2章 Rust初体验4/8:提供标准库之外功能的Library Crate:简化包管理和依赖管理:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.4 故事2: 生成点数之和的随机答案 又是新的一天,大家的培训课又开始了哦!现在,我们的学员们开始用三种语言来实现故事2,加油! 2.4.1 Rust版故事2 2.4.1.1 提供标准库之外功能的Library Crate:简化包管理和依赖管理 贾克强:“我们的故事…

【JVM】JVisualVM的介绍、使用和GC过程

VisualVM介绍 VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几…

30 岁的程序员,要有 “归零“ 心态

大家好,我是码农先森。 古话说的 “三十而立”,正是担重之时,却大部分人在职场中都处于不上不下的尴尬境地。已经没有刚毕业时那股子冲劲,被生活和工作磨平了棱角。 在技术思想方面,似乎已经触及到了天花板&#xff…