2019-11-04-Linux监控和警报简介 Linux Monitoring 【翻译】Linux监视和警报简介 您是否曾经想设置一个过程监视器来在离线时向您发出警报,而无需花费数千美元的预算呢?每个系统管理员都有,这是执行的方法。 有些系统管理员喜欢自己写监控告警的东西,然而我们当中有些人必须去做这些事,因为没有充足的预算投入到监控告警上。企业级别的监控告警组件适用于有较多预算的公司,或者需要 100% 在线(运行)的重要任务、系统或服务。 有一些开源的监控告警组件,但是它们只运行在指定的操作系统上以及需要大量的时间去配置。大多数还要求将监控程序安装在受监控的端点上,这需要批准和部署的时间。更快、更轻松的方法就是自己写监控告警脚本,然后通过cron计划运行。本地化(每台服务器)监控警报的好处是,你可以单独设置告警阈值,而不必使用无法满足需求的全剧配置。 本文将引导你完成创建脚本的过程,该脚本每五分钟检查一次 Apache Web 服务器进程,如果它关闭了,则尝试重新启动它,如果它关闭了 30 秒以上且无法重新启动,则通过电子邮件发出告警。 大多数进程在运行时在 /run 目录下有一个进程 ID 文件(*.pid),其中很多进程都有自己的单独目录,其中包含各自的 PID 文件。在此示例中,Apache Web 服务器(httpd)具有一个 PID 文件:/run/httpd/httpd.pid。 我将此脚本命名为 apache.sh,并将其放置在根目录的主目录中。请确保该文件的权限为 rwxr-x---,以便其他用户无法执行或修改该文件。 $sudo chmod 750 apache.sh 注意:如果您没有安装 Apache,那么没关系,因为您可以将脚本中指向的 httpd.pid 文件替换成适用于系统的任何其他 PID 文件。 创建此类脚本的方法有很多,但这就是我的方法,并且可以正常工作。我用变量 FILE 标示了 PID 文件。我决定不是让 Apache Web 服务器宕机发送警报,而是让脚本尝试重新启动服务,然后再次检查。我又重复了两次,等待两次检查之间的间隔为 10 秒。如果 Apache 服务仍然关闭并且 30 秒后无法重新启动,则脚本向系统管理员团队发送电子邮件: #!/bin/bash FILE=/run/httpd/httpd.pid if ! [ -f "$FILE" ]; then systemctl start httpd.service fi sleep 10s if ! [ -f "$FILE" ]; then systemctl start httpd.service fi sleep 10s if ! [ -f "$FILE" ]; then systemctl start httpd.service fi sleep 10s if ! [ -f "$FILE" ]; then mail -s 'Apache is down' sysadmins@mydomain.com <<< 'Apache is down on SERVER1 and cannot be restarted' fi 你可以轻松的将 SMS 消息发送到团队通话手机。该脚本检查是否存在 httpd.pid 文件,如果未找到,则采取措施。 如果文件存在,则不执行任何操作。 没有人愿意每隔五分钟收到一封电子邮件或注意到服务已启动。 ...
2019-06-21-\_\_getattribute\_\_和\_\_getattr\_\_的区别
2019-06-21-__getattribute__和__getattr__的区别 Python 这两个方法在外形上有点相似,但是差距不小,后面的 getattr() 和 setattr()、delattr()类似于Java里的 setter,getter。 __getattribute__ 是啥子 __getattribute__ 是新式类才出现的。 Python Version 必要条件 类类型 <2.2 无 经典类 (2.2, 2.7) 无 经典类 (2.2, 2.7) 继承object 新式类 3.x 无 新式类 __getattribute__ 是属性访问拦截器,就是当这个类的属性被访问时,会自动调用类的 __getattribute__ 方法。 Python中只要是新式类,就默认存在属性拦截器,只不过是拦截后没有进行任何操作,而是直接返回。所以我们可以自己改写 __getattribute__ 方法来实现相关功能,比如查看权限、打印 log 日志等。如下代码,简单理解即可: class Student(object): def __init__(self, name, num): self.name = name self.num = num def __getattribute__(self, *args, **kwargs): if args[0] == "name": print("you want get attr({}),but will return {{value+1}}".format(args[0])) return str(object.__getattribute__(self,*args,**kwargs)) + "1" else: print("you don't want get attr name") return object.__getattribute__(self,*args,**kwargs) s1 = Student("Ash", 1) s2 = Student("Light", 2) print(s1.name) print(s2.name) print(s1.num) print(s2.num) 上述过程中如果访问的是 name 字段,就会打印日志,并且将返回值变为字符串并且后缀加上字符“1”。 ...
2021-03-29-cgroup在ubuntu的使用
2021-03-29-cgroup在ubuntu的使用 https://tech.meituan.com/2015/03/31/cgroups.html https://www.paranoids.at/cgroup-ubuntu-18-04-howto/ https://www.cnblogs.com/sparkdev/p/8296063.html Linux Ubuntu
2020-04-10-openVPN实践
2020-04-10-openVPN实践 Linux Network OPENVPN 实践 VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的连接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术。 操作均在 Ubuntu 18.04 server 下。 安装 安全前需要先安装 openssl 和 lzo。 $ sudo apt install openssl # oepnssl $ sudo apt install libssl-dev $ sudo apt install liblzo2-2 # lzo $ sudo apt install liblzo2-dev $ sudo apt install libpam0g-dev # pam $ apt install openvpn $ apt install easy-rsa 依靠 openvpn 实现 vpn 服务,依靠 easy-rsa 实现加密认证。 当通过 apt 安装完成后,主要的目录有: - /usr/sbin/openvpn 执行的二进制程序 - /etc/openvpn openvpn 需要的相关配置文件 - /usr/share/doc/openvpn openvpn 的帮助文档以及示例配置文件 - /usr/share/easy-rsa easy-rsa 生成密钥对的位置 生成密钥 配置 vars 首先需要修改 vars 文件。 ...
2020-04-09-iptables 常用策略
2020-04-09-iptables 常用策略 Linux Network iptables iptables 常用策略 iptables 防火墙常用的策略 拒绝进入防火墙的所有 ICMP 协议数据包 iptables -I INPUT -p icmp -j REJECT 允许防火墙转发除 ICMP 协议以外的所有数据包 iptables -A FORWARD -p ! icmp -j ACCEPT 说明:使用“!”可以将条件取反。 拒绝转发来自 192.168.1.10 主机的数据,允许转发来自 192.168.0.0/24 网段的数据 iptables -A FORWARD -s 192.168.1.11 -j REJECT iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT 说明:注意要把拒绝的放在前面,否则根据 ACCEPT 规则会直接进入。 丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包 iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP 封堵网段(192.168.1.0/24),两小时后解封。 iptables -I INPUT -s 192.168.1.0/24 -j DROP iptables -I FORWARD -s 192.168.1.0/24 -j DROP at now +2 hours at> iptables -D INPUT -s 192.168.1.0/24 -j DROP at> iptables -D FORWARD -s 192.168.1.0/24 -j DROP 关于 at 的使用,可以参考 linux/centos at指令详解。 ...
2020-04-09-ansible优化
2020-04-09-ansible优化 Linux Ops Ansible ansible 优化 ansible 好用是真的好用,但慢也是真的慢,最近一个新的需求,需要在节点上移除 10 个文件夹,再创建 10 个文件夹。可以通过 file 模块指定 state 为 absent 或 directory 来实现,但是速度是真的慢,从系统本身执行来说,创建文件夹不需要花费多少时间,就有了调优的想法。 下面用到了一个计时的 ansible 插件:ansible-profile。就一个 python 文件,使用方法就是将 callback_plugins 置于 playbook 文件所在的目录下即可。 测试用的 playbook 很简单,就是对集群节点机器(20台)创建 13 个目录,再移除 13个目录。 # test.yml --- - hosts: all remote_user: test gather_facts: True tasks: - name: create temp file: path: /root/tmp/{{ item }} state: directory with_items: - "01" - "02" - "03" - "04" - "05" - "06" - "07" - "08" - "09" - "10" - "11" - "12" - "13" - name: remove temp file: path: /root/tmp/{{ item }} state: absent with_items: - "01" - "02" - "03" - "04" - "05" - "06" - "07" - "08" - "09" - "10" - "11" - "12" - "13" 下面的调优主要会对两个文件进行更改,下面是这两个文件的原始状态。 ...
2020-03-11-ansible基本操作及应用
2020-03-11-ansible基本操作及应用 Linux [[Ansible]] [[Ops]] ansible 基本操作及应用 介绍 简介 ansible 是新出现的自动化运维工具,基于 Python 开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible 是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是 ansible 所运行的模块,ansible 只是提供一种框架。 主要包括: 连接插件 connection plugins:负责和被监控端实现通信 host inventory:指定操作的主机,是一个配置文件里面定义监控的主机 各种模块核心模块、command模块、自定义模块 借助于插件完成记录日志邮件等功能 playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务 相关链接: ansible 代码 ansible 官网 playbook 分享平台 特性 no agents:不需要在被管控主机上安装任何客户端 no server:无服务器端,使用时直接运行命令即可 modules in any languages:基于模块工作,可使用任意语言开发模块 yaml,not code:使用 yaml 语言定制剧本playbook ssh by default:基于 SSH 工作 strong multi-tier solution:可实现多级指挥 优点 轻量级,无需在客户端安装 agent,更新时,只需在操作机上进行一次更新即可 批量任务执行可以写成脚本,而且不用分发到远程就可以执行 使用 python 编写,维护更简单,ruby 语法过于复杂 支持 sudo 基本架构 核心引擎:即 ansible 核心模块(core modules):这些都是 ansible 自带的模块,ansible 模块资源分发到远程节点使其执行特定任务或匹配一个特定的状态 自定义模块(custom modules):如果核心模块不足以完成某种功能,可以添加自定义模块 插件(plugins):完成模块功能的补充,借助于插件完成记录日志、邮件等功能 剧本(playbook):定义 ansible 任务的配置文件,可以将多个任务定义在一个剧本中,由 ansible 自动执行,剧本执行支持多个任务,可以由控制主机运行多个任务,同时对多台远程主机进行管理 playbook 是 ansible 的配置、部署和编排语言,可以描述一个你想要的远程系统执行策略,或一组步骤的一般过程。如果 ansible 模块作为你的工作室工具,playbook 就是设计方案。在基本层面上,剧本可以用于管理配置和部署远程机器。在更高级的应用中,可以序列多层应用及滚动更新,并可以把动作委托给其他主机,与监控服务器和负载平衡器交互 连接插件(connection plugins):ansible 基于连接插件连接到各个主机上,负责和被管理节点实现通信。虽然 ansible 是使用 ssh 连接到各被管理节点,但它还支持其他的连接方法,所以需要有连接插件 主机清单(host inventory):定义 ansible 管理的主机策略,默认是在 ansible 的 hosts 配置文件中定义被管节点,同时也支持自定义动态主机清单和指定配置文件路径 ansible 采用 paramiko 协议库(Fabric 也使用这个),通过 ssh 或者 ZeroMQ 等连接主机。ansible 在控制主机主机将 ansible 模块通过 ssh 协议(或者 Kerberos、LDAP)推送到被管节点执行,执行完之后自动删除。控制主机与被管理节点之间支持 local、SSH、ZeroMQ 三种连接方式,默认使用基于 SSH 的连接。在规模较大的情况下使用 ZeroMQ 连接方式会明显改善执行速度。 ...
2020-03-04-oracle数据库基础概念
2020-03-04-oracle数据库基础概念 database Oracle Oracle 数据库基础概念 从版本来说,Oracle Database 有两个常用的版本,为 11g 12c 包括后面的 18c,19c 都算是源自于 12c。这两个版本目前占据的份额比较大,也算是很有特色的两个版本。 从数据库种类来分,可以分为 NoneCDB 和 CDB 两类。12c 之前只有 NoneCDB,12c 引入了 CDB 概念,即 容器数据库,与此同时出现 PDB 概念,即 可插拔数据库。容器是一个很大的空间,在它里面有很多个 PDB 组成。 RAC 全称 Real Application Clusters,官方翻译为真正应用集群,可以理解成 即时应用集群。它一般有两台或者两台以上同构计算机及共享存储设备构成,可提供强大的数据库处理能力。在早年的概念中 grid 等同于 RAC。如果对两台机器安装 RAC 服务,那么会自动生成一个 grid 用户。 ASM 全称 Automatic Storage Management,也就是自动存储空间管理。ASM旨在简化数据库数据文件,控制文件和日志文件的管理。为此,它提供了直接在数据库内部管理文件系统和卷的工具,允许数据库管理员使用标准Oracle环境中熟悉的SQL语句控制卷和磁盘。这个工具的出现简化了扩容的操作,有点 LVM 的味道。
2019-10-06-python的对象协议(Magic method)
2019-10-06-python的对象协议(Magic method) Python [[OOP]] Python 的对象协议 传闻中,掌握了 Python 的魔术方法,就掌握了 Python 面向对象的一切。可以说,面向对象的很多接口的实现靠的就是「对象协议」。说起来有点玄乎,实际操作起来就好了。 Python 是一门动态语言,Duck Typing 概念遍布其中,所以其中的 Concept 并不是以类型的约束为载体,而是使用称作为协议的概念。那什么是 Duck Typing 呢? Duck Typing 是鸭子类型,在动态语言中用的较多,是动态类型语言设计的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口决定,而是由当前方法和属性的集合决定。说白了就是并不关心对象是什么类型,只关心行为。 “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 现在来看看什么是协议吧,所谓协议,类似你讲中文,我也讲中文,我们就能交流,你讲英文,我学过英文(即实现了“听得懂英语协议”);简单的说,在python中我需要调用你的某个方法,你正好有这个方法,这就是协议,比如在加法运算中,当出现加号(+)时,那么按照数值类型相关的协议,python会自动去调用相应对象的__add__()方法,这就是协议。 构造协议、初始化协议和删除协议 每个人都知道一个最基本的魔术方法, __init__。通过此方法我们可以定义一个对象的初始操作。然而,当我调用 x = SomeClass() 的时候, __init__ 并不是第一个被调用的方法。实际上,还有一个叫做 __new__ 的方法,来构造这个实例。然后给在开始创建时候的初始化函数来传递参数。在对象生命周期的另一端,也有一个 __del__ 方法。我们现在来近距离的看一看这三个方法: __new__(cls, [...) __new__ 是在一个对象实例化的时候所调用的第一个方法。它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法。 __new__ 方法相当不常用,但是它有自己的特性,特别是当继承一个不可变的类型比如一个 tuple 或者 string。 __init__(self, […) 此方法为类的初始化方法。当构造函数被调用的时候的任何参数都将会传给它。(比如如果我们调用 x = SomeClass(10, ‘foo’)),那么 __init__ 将会得到两个参数 10 和 foo。 __init__ 在 Python 的类定义中被广泛用到。 __del__(self) 如果 __new__ 和 __init__ 是对象的构造器的话,那么 __del__ 就是析构器。它不实现语句 del x (以上代码将不会翻译为 x.del() )。它定义的是当一个对象进行垃圾回收时候的行为。当一个对象在删除的时需要更多的清洁工作的时候此方法会很有用,比如套接字对象或者是文件对象。注意,如果解释器退出的时候对象还存存在,就不能保证 __del__ 能够被执行。 放在一起的话,这里是一个 __init__ 和 __del__ 实际使用的例子。 ...
2019-01-11-Python执行系统命令及设置环境变量
2019-01-11-Python执行系统命令及设置环境变量 Python Linux Python中使用shell command 这个问题没什么太多难度,这里只是做个记录。 只使用标准库的情况下,有四种方法去实现。 方法一: os.system(cmd) 在子终端运行系统命令,不能获取命令执行后的返回信息以及执行返回的状态。 import os os.system('date') # 2019年 1月16日 星期三 18时14分21秒 CST 方法二: os.popen(cmd) 不仅执行命令而且返回执行后的信息对象(常用于需要获取执行命令后的返回信息) import os nowtime = os.popen('date') print nowtime.read() # 2019年 1月16日 星期三 18时14分21秒 CST 方法三: commands模块 方法 说明 getoutput 获取执行命令后的返回信息 getstatus 获取执行命令的状态值(执行命令成功返回数值0,否则返回非0) getstatusoutput 获取执行命令的状态值以及返回信息 import commonds status, output = commands.getstatusoutput('date') print status # 0 print output # 2019年 1月16日 星期三 18时14分21秒 CST 方法四:subprocess模块 这是最复杂的模块(实现系统指令),但也是功能最多的模块。学会了subprocess模块,再去看paramiko或者其他(实现系统指令)模块会更轻松。 The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several older modules and functions: ...