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

news2024/11/26 19:39:59

文章目录

      • 剧本功能
    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【电子通识】焊接常见的不良有哪些?

在焊接完成后的调试阶段,有时总会发生一些奇怪的异常。也许是因为在焊接过程中出现了一些莫名其妙的焊接缺陷, 这些焊接缺陷产生的原因各不相同。 在实际的SMT贴片加工或插件焊接中,我们一般会采取一些方法来避免这些焊接不良的现象。那么常见…

PyCharm2018图文安装教程、附录软件下载

软件简介 PyCharm 2018是一款IDE集成开发环境,主要功能包括代码调试、语法高亮、智能提示、单元测试、版本控制等,支持Python 3.7,改进search everywhere功能等,可以让用户快速的开发程序。 软件下载 复制链接浏览器打开 https…

HTML静态网页成品作业(HTML+CSS)—— 电影泰坦尼克号介绍网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

译译交友项目介绍

一、 项目背景 随着社会的进步,英语作为一种国际语言,很多人都在学习英语,然而现在很多人都会因为学习英语而烦恼,有时还会因为是一个人学习而感到枯燥。面对情绪的低落,往往会使学习更困难。因此,我打造了…

Protected and unprotected Meilisearch projects(/health)

Elasticsearch 做为老牌搜索引擎,功能基本满足,但复杂,重量级,适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求,极快,单文件,超轻量。 所以,对于中小型项目来说…

Qt 实战(4)信号与槽 | 4.1、信号与槽机制

文章目录 一、信号与槽机制1、基本概念2、信号与槽函数连接2.1、connect宏实现信号与槽连接2.2、Qt5新connect函数2.3、使用函数指针2.4、使用lambda表达式2.5、使用Qt Creator添加信号的槽函数 3、结论 前言: Qt信号与槽机制是一种用于处理对象间通信的强大机制&am…

2003远程桌面端口修改,Windows Server 2003远程桌面端口修改的专业操作指南

在网络安全日益受到重视的今天,修改Windows Server 2003远程桌面的默认端口已成为提高服务器安全性的常规操作。默认情况下,远程桌面使用的端口为3389,这一广为人知的端口号常常成为黑客攻击的目标。因此,通过修改远程桌面端口&am…

代码随想录-二叉树 | 111 二叉树的最小深度

代码随想录-二叉树 | 111 二叉树的最小深度 LeetCode 111 二叉树的最小深度解题思路代码难点总结 LeetCode 111 二叉树的最小深度 题目链接 代码随想录 题目描述 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

地推数据不再迷茫,Xinstall助你一臂之力!

在移动互联网时代,地推作为一种传统的推广方式,仍然占据着举足轻重的地位。然而,地推过程中产生的数据却常常让推广者感到头疼。数据分散、难以追踪、分析困难……这些问题不仅耗费了推广者大量的时间和精力,更可能导致决策失误&a…

vue30:v-model语法糖的本质

在Vue.js框架中,v-model 是一个指令,用于在表单输入和应用状态之间创建双向数据绑定。它本质上是语法糖,意味着它提供了一种更简洁的方式来编写代码,而不需要显式地编写额外的代码。 具体来说,v-model 背后实际上是由…

LeetCode | 20.有效的括号

这道题就是栈这种数据结构的应用,当我们遇到左括号的时候,比如{,(,[,就压栈,当遇到右括号的时候,比如},),],就把栈顶元素弹出,如果不匹配,则返回False,当遍历完所有元素后…

技术要转管理吗?PMP证书有用吗?

作为一名80后的IT项目经理,我从大学计算机专业毕业后就一直在.NET开发领域工作,直到获得PMP证书后转型成为项目经理。我的经历或许能为还在犹豫是否要从技术转型到管理岗位的学弟学妹们提供一些参考。 大多数人认为,计算机专业的大学毕业生通…

8.11 矢量图层线要素单一符号使用七(爆炸线)

文章目录 前言爆炸线(Lineburst)QGis设置线符号为爆炸线(Lineburst)二次开发代码实现爆炸线(Lineburst) 总结 前言 本章介绍矢量图层线要素单一符号中爆炸线(Lineburst)的使用说明&…

【大分享02】数字化转型下政务服务电子文件的规范归档与保存

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章,由北京华电园信息技术有限公司和华迪计算机集团有限公司联合完成,作者:董艳会、高鹏、汪艳。 PART 01 国家政策从机制和流程…

Attention与轻量级ResNet融合,低资源消耗下实现效率和性能完美平衡

注意力机制通过让模型关注图像关键区域提升了识别精度,而轻量级残差网络通过减少参数和计算量,实现了在低资源消耗下的优秀性能。 结合注意力机制与轻量级残差网络,既能让模型能够更高效地关注输入数据中的关键信息,提升模型处理…

一文了解Redis

一.什么是Redis 与MySQL一样,Redis也是客户端服务器结构的程序,是基于内存的键值对存储系统,属于NoSQL的一种。与很多键值对数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希&a…

Debain12 离线安装docker

官网教程&#xff1a;https://docs.docker.com/engine/install/debian/ 步骤 1. 解压 docker-deb.7z 安装包并上传Linux &#xff08;资源在PC端文章顶部&#xff09; 2. 安装 .deb 包 sudo dpkg -i ./containerd.io_<version>_<arch>.deb \./docker-ce_<vers…

AI机器人公众号小程序h5源码开源交付支持二开黑色风格版本

AI机器人系统对接OPENAI&#xff1a;开启智能新纪元 更新全新UI、新增全家桶模块、新增热榜板块、支持语音朗读、支持快速回答、支持AI绘图、支持文字一键生成图、支持导出pdf、支持导出word、支持导出文字、支持快速响应、支持中英翻译、支持markdown &#x1f680;一、引言…

[SWPUCTF 2022 新生赛]ez_1zpop(php反序列化之pop链构造)

[SWPUCTF 2022 新生赛]ez_ez_unserialize <?php class X {public $x __FILE__;function __construct($x){$this->x $x; }function __wakeup(){if ($this->x ! __FILE__) {$this->x __FILE__; }}function __destruct(){highlight_file($this->x);//flag is…

1秒揭秘:APP对接广告联盟,收益翻倍!

在当前数字时代&#xff0c;移动应用&#xff08;APP&#xff09;成为连接用户与服务的重要桥梁。 许多开发者通过开发APP并接入广告联盟&#xff0c;成功实现了收益的快速增长。 然而&#xff0c;对于初学者而言&#xff0c;从零开始开发一款能够有效对接广告联盟的APP&…