当前位置: 首页 > article >正文

ansible template 文件中如果包含{{}} 等非ansible 变量处理

在 Ansible 模板中,如果你的 Python 脚本里有大量 {}、f""、或者其他 Jinja 会误解析的语法,就需要用 {% raw %}…{% endraw %} 把它们包起来,只在需要替换变量的那一行单独“放行”。例如:

{% raw %}
#!/usr/bin/env python3
import subprocess
import re
import socket
import time
from datetime import datetime
{% endraw %}# 输出到的文件
PROM_FILE = "{{ node_exporter_textfile_dir }}/iotop_metrics.prom"{% raw %}
# 单位换算
def parse_size(size_str):size_str = size_str.strip()if size_str.endswith("/s"):size_str = size_str[:-2].strip()m = re.match(r"([\d\.]+)\s*([BKMGTP]?)(B)?", size_str, re.I)if not m:return 0.0val = float(m.group(1))unit = m.group(2).upper()unit_map = {"": 1/1024, "B": 1/1024,"K": 1, "M": 1024, "G": 1024**2,"T": 1024**3, "P": 1024**4,}return val * unit_map.get(unit, 1)# 用正则提取每列
iotop_line_re = re.compile(r"^\s*(\d+)\s+(\S+)\s+(\S+)\s+([\d\.]+\s+\S+/s)\s+([\d\.]+\s+\S+/s)\s+([\d\.]+\s+%)\s+([\d\.]+\s+%)\s+(.*)$"
)# 运行 iotop 并解析
def parse_iotop():res = subprocess.run(["sudo", "iotop", "-b", "-n", "1", "-P"],capture_output=True, text=True, check=True)lines = res.stdout.splitlines()total_read = total_write = 0.0for line in lines:if "Total DISK READ:" in line and "Total DISK WRITE:" in line:left, right = line.split("|", 1)total_read = parse_size(left.split("Total DISK READ:")[1].strip())total_write = parse_size(right.split("Total DISK WRITE:")[1].strip())breakprocs = []for line in lines:line = line.strip()m = iotop_line_re.match(line)if not m:continuepid, prio, user, d_read, d_write, swapin, io, cmd = m.groups()read_kb = parse_size(d_read)write_kb = parse_size(d_write)if read_kb == 0.0 and write_kb == 0.0:continuecmd = cmd.replace('"', '\\"')procs.append((pid, user, cmd, read_kb, write_kb))return total_read, total_write, procs# 输出 Prometheus 格式指标
def write_metrics():hostname = socket.gethostname()now = datetime.utcnow().isoformat()total_read, total_write, procs = parse_iotop()lines = []lines.append(f"# Timestamp: {now}")# 指标定义lines.append("# HELP proc_io_read_kbps Process disk read in KB/s")lines.append("# TYPE proc_io_read_kbps gauge")lines.append("# HELP proc_io_write_kbps Process disk write in KB/s")lines.append("# TYPE proc_io_write_kbps gauge")lines.append("# HELP proc_io_total_read_kbps Total disk read in KB/s")lines.append("# TYPE proc_io_total_read_kbps gauge")lines.append("# HELP proc_io_total_write_kbps Total disk write in KB/s")lines.append("# TYPE proc_io_total_write_kbps gauge")# 总量lines.append(f'proc_io_total_read_kbps{{hostname="{hostname}"}} {total_read}')lines.append(f'proc_io_total_write_kbps{{hostname="{hostname}"}} {total_write}')# 每进程for pid, user, cmd, r, w in procs:labels = f'hostname="{hostname}",pid="{pid}",user="{user}",command="{cmd}"'lines.append(f'proc_io_read_kbps{{{labels}}} {r}')lines.append(f'proc_io_write_kbps{{{labels}}} {w}')# 写入指标文件with open(PROM_FILE, "w") as f:f.write("\n".join(lines) + "\n")# 主循环(不启动 web,仅周期更新)
def main():while True:try:write_metrics()except Exception as e:print(f"[ERROR] {e}", flush=True)time.sleep(1)if __name__ == "__main__":main()
{% endraw %}
http://www.lryc.cn/news/2392651.html

相关文章:

  • Screen 连接远程服务器(Ubuntu)
  • 路由器、网关和光猫三种设备有啥区别?
  • vscode实时预览编辑markdown
  • 2505软考高项第一、二批真题终极汇总
  • 云原生安全基础:Linux 文件权限管理详解
  • A类地址中最小网络号(0.x.x.x) 默认路由 / 无效/未指定地址
  • [嵌入式实验]实验二:LED控制
  • 6.4.2_3最短路径问题_Floyd算法
  • <PLC><socket><西门子>基于西门子S7-1200PLC,实现手机与PLC通讯(通过websocket转接)
  • day 33 python打卡
  • 开发时如何通过Service暴露应用?ClusterIP、NodePort和LoadBalancer类型的使用场景分别是什么?
  • 【机械视觉】Halcon—【六、交集并集差集和仿射变换】
  • 深度学习核心网络架构详解(续):从 Transformers 到生成模型
  • AI智能混剪视频大模型开发方案:从文字到视频的自动化生成·优雅草卓伊凡
  • allWebPlugin中间件VLC专用版之截图功能介绍
  • 【JavaSE】异常处理学习笔记
  • Scratch节日 | 六一儿童节
  • 深度解析:跨学科论文 +“概念迁移表” 模板写作全流程
  • 深度剖析Node.js的原理及事件方式
  • VScode-使用技巧-持续更新
  • 主流 AI IDE 之一的 Windsurf 使用入门
  • 大数据量下的数据修复与回写Spark on Hive 的大数据量主键冲突排查:COUNT(DISTINCT) 的陷阱
  • Cursor 对话技巧 - 前端开发专版
  • 历年南京理工大学计算机保研上机真题
  • Web前端常用面试题,九年程序人生 工作总结,Web开发必看
  • HTML实战项目:高考加油和中考加油
  • Rk3568驱动开发_设备树点亮LED_11
  • 多功能文档处理工具推荐
  • 如何科学测量系统的最高QPS?
  • ORM 框架的优缺点分析