ansible检测链路状态和切换状态
控制机
ansible.cfg
callback_plugins = /usr/share/ansible/plugins/callback:/opt/ansible/plugins/callback
[ssh_connection]
ssh_args = -F /opt/ansible/ssh/ssh_config -o ControlMaster=auto -o ControlPersist=5m
control_path = /opt/ansible/ssh/ansible-ssh-%%h-%%p-%%r
pipelining = True
ssh_config
Host 69.169.xx.xx
User ansible
Port 29922
ForwardAgent yes
StrictHostKeyChecking no
Host 10.150.1.*
User ansible
Port 29922
ProxyCommand ssh -p 29922 ansible@69.169.xx.xx -W %h:%p
ForwardAgent yes
StrictHostKeyChecking no
Host 173.45.xx.xx
User ansible
Port 29922
ForwardAgent yes
StrictHostKeyChecking no
Host 10.160.1.*
User ansible
Port 29922
ProxyCommand ssh -p 29922 ansible@173.45.xx.xx -W %h:%p
ForwardAgent yes
StrictHostKeyChecking no
inventory
[dc]
69.169.xx.xx
[la]
173.45.xx.xx
[proxy-dc]
10.150.1.219
10.150.1.220
[proxy-la]
10.160.1.219
10.160.1.220
change_link.yaml
- hosts: proxy-dc
gather_facts: no
vars:
proxy_host: '221.228.xx.xx'
tasks:
- name: update /etc/hosts
template: src=templates/hosts.j2 dest=/etc/hosts owner=root group=root mode=0644
notify: restart dnsmasq
handlers:
- name: restart dnsmasq
service: name=dnsmasq state=restarted
demo example_play.py
以ansible用户身份登录远程机房内网服务器,sudo切换root权限,返回服务器的网卡流量、连接数、hosts指向
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase
def play_task(host, nic):
class ResultCallback(CallbackBase):
def __init__(self, *args, **kwargs):
self.results = None
def v2_runner_on_unreachable(self, result):
ip = result._host.get_name()
self.results = (ip, '', '', '', '')
def v2_runner_on_failed(self, result, *args, **kwargs):
ip = result._host.get_name()
self.results = (ip, '', '', '', '')
def v2_runner_on_ok(self, result, *args, **kwargs):
ip = result._host.get_name()
traffic_in = result._result['link_info']['in']
traffic_out = result._result['link_info']['out']
connection = result._result['link_info']['connection']
current_link = result._result['link_info']['current_link']
self.results = (ip, traffic_in, traffic_out, connection, current_link)
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check'])
variable_manager = VariableManager()
loader = DataLoader()
options = Options(
connection = 'ssh',
module_path = '/opt/ansible/plugins',
forks = 100,
become = True,
become_method = 'sudo',
become_user = 'root',
check = False
)
passwords = dict(vault_pass='secret')
results_callback = ResultCallback()
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list='/opt/ansible/inventory')
variable_manager.set_inventory(inventory)
play_source = dict(
name = 'Ansible Play',
hosts = host,
gather_facts = 'no',
tasks = [
dict(action=dict(module='link_info', args='interface=%s' % nic)),
]
)
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)
tqm = None
try:
tqm = TaskQueueManager(
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
options=options,
passwords=None,
stdout_callback=results_callback,
)
tqm.run(play)
finally:
if tqm is not None:
tqm.cleanup()
return results_callback.results
link_info模块
#!/usr/bin/env python
# -*- coding: utf-8 -*-
DOCUMENTATION = '''
---
'''
EXAMPLES = '''
---
'''
import re, socket
import datetime, time
import subprocess
from ansible.module_utils.basic import *
def unit_convert(data):
if data < 10**3:
return str(round(float(data), 2))
elif data > 10**3 and data < 10**6:
return str(round(float(data) / 10**3, 2)) + 'Kb'
elif data > 10**6 and data < 10**9:
return str(round(float(data) / 10**6, 2)) + 'Mb'
elif data > 10**9 and data < 10**12:
return str(round(float(data) / 10**9, 2)) + 'Gb'
elif data > 10**12 and data < 10**15:
return str(round(float(data) / 10**12, 2)) + 'Tb'
def get_traffic_info():
proc_stat = '/proc/net/dev'
traffic = []
with open(proc_stat, 'r') as f:
for line in f:
m = re.match('\s*(\S+):\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+', line)
if m:
traffic.append((m.group(1), int(m.group(2)), int(m.group(10))))
return traffic
def get_connection_info():
command = 'netstat -n |grep ^tcp |wc -l'
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = p.communicate()
return int(output)
def get_current_link_info():
hostfile = '/etc/hosts'
with open(hostfile, 'r') as f:
for line in f:
m = re.match('(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\S+)', line)
if m and m.group(2) == 'wx.service.live.tvmining.com':
return m.group(1)
return 'unknown'
def main():
module = AnsibleModule(
argument_spec = {
'interface': { 'default': 'em2', 'type': 'str'}
},
supports_check_mode = True
)
counter = 2
first = get_traffic_info()
time.sleep(counter)
second = get_traffic_info()
traffic = map(lambda x, y: (x[0], unit_convert(abs(x[1]-y[1])*8), unit_convert(abs(x[2]-y[2])*8)), first, second)
for name, receive, transmit in traffic:
if name == module.params['interface']:
traffic_in, traffic_out = receive, transmit
connection = get_connection_info()
current_link = get_current_link_info()
message = {
'in': traffic_in,
'out': traffic_out,
'connection': connection,
'current_link': current_link,
}
module.exit_json(changed=False, link_info=message)
if __name__ == '__main__':
main()
demo example_playbook.py
以ansible身份登录远程内网服务器,sudo切换root权限,执行change_link.yaml
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase
from ansible.executor.playbook_executor import PlaybookExecutor
Options = namedtuple('Options', \
['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'listhosts', 'listtasks', 'listtags', 'syntax'])
# 这些options项是必须的,缺少的话程序报错
options = Options(
connection = 'ssh',
module_path = '/path/to/mymodules',
forks = 100,
become = True,
become_method = 'sudo',
become_user = 'root',
check = False,
listhosts = None,
listtasks = None,
listtags = None,
syntax = None
)
loader = DataLoader()
variable_manager = VariableManager()
inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list='/opt/ansible/inventory')
variable_manager.set_inventory(inventory)
playbooks=['/opt/ansible/change_link.yaml']
pb = PlaybookExecutor(playbooks=playbooks, inventory=inventory, variable_manager=variable_manager, loader=loader, options=options, passwords=None)
pb.run()
ansible检测链路状态和切换状态的更多相关文章
- android fragment+ FragmentTabHost+viewpager 切换状态不保存的问题
转载请注明出处:http://blog.csdn.net/djy1992/article/details/46674169 @author dujinyang 难得有时间上来写博客. fragment ...
- Bootstrap switch 切换状态踩坑
Boostrap switch 下载地址(http://www.bootcss.com/p/bootstrap-switch/),同时配有一些简单的用例. 其中写到 Toggle State切换状态的 ...
- Animator状态快速切换问题
[Animator状态快速切换问题] 事情是这样的,我尝试在一帧内多次切换一些状态(当前状态为Idle的情况下): public Animator animator; void OnEnable() ...
- (笔记)Linux下检测网卡与网线连接状态
http://blog.chinaunix.net/space.php?uid=20357359&do=blog&cuid=1798479 Linux下检测网卡与网线连接状态,使用io ...
- (2.13)备份与还原--sql server数据库主要状态和切换路径
SQLSERVER数据库主要状态和切换路径 关键词:数据库状态 一个SQLSERVER数据库会处于很多种状态,例如 ONLINE .RESTORING .RECOVERING .RECOVERY_PE ...
- ARM 中断状态和SVC状态的堆栈切换 (异常)【转】
转自:http://blog.csdn.net/edwardlulinux/article/details/9261393 版权声明:本文为博主原创文章,未经博主允许不得转载. ARM 中断状态和SV ...
- 转载 iOS全局检测网络变化的实时状态
昨天浏览了cocoaChina,发现了一遍文章是优化Reachablity框架的出来的检测网络类,大家都知道这个Reachablity框架是用来检测网络变化的!但是也是有一点bug,事实上,基于此 ...
- Android软键盘状态的切换及其强制隐藏
MainActivity例如以下: package cc.c; import android.os.Bundle; import android.view.View; import android.v ...
- Flutter中TabBarView切换状态保存
TabBarView 类似于Android中的viewPager,但是默认是没有实现切换分页状态保存的.估计是出于节约内存的原因吧. 发现这个问题的时候,搜索了一下全网.大致就两种解决方案,1是修改源 ...
随机推荐
- MVC 介绍
1>.NUGET,发布软件,管理平台: 2>.Razor,mvc视图引擎,集中生成HTML代码模板@开始,有自己的格式,语法,如同web forms视图引擎web forms view e ...
- IO - FileUtils
Apache Commons IO好用的功能主要集中在工具类FileUtil中,包含了建立,删除,复制,移动,比较文件新旧,递归枚举目录清空目录,一次读取整个文件等.以下是一个我认为有用的列表: 1. ...
- 2016 Multi-University Training Contest 5 Two
本文转自:http://blog.csdn.net/queuelovestack/article/details/52096337 题意: 给你两个序列A和B 问两个序列有多少个子序列一样 例如{1, ...
- HDU 1272 小希的迷宫(并查集)
题解: 首先,init,find,union操作都是模版,多敲几遍,在记记,就没问题了. 然后,本题就是多了一个flag数组,记录数据是否出现过,最后记录最小,和最大,遍历一般他们的父亲,只有一个就是 ...
- cvc-elt.1: 找不到元素 'beans' 的声明
这次遇到的这个错误又坑爹又低级 , 是因为网上抄到了错误的xsd搞的. 这是网上抄到的 xsi:schemalocation=" http://www.springframework.org ...
- Win8下修改任務欄的資源管理器默認打開位置
不能像win7一樣右鍵屬性改了,但還是有辦法的. 新建一個文件夾,建立快捷方式,右鍵快捷方式,將目標改為%windir%\explorer.exe /n,/e,D:\Desktop 然後將該快捷方式拖 ...
- Apache Thrift学习之二(基础及原理)
Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详细介绍 Apache Thrift 的架构.开发和部署,并且 ...
- python中的生成器
什么是生成器? 生成器是一个包含了特殊关键字yield的函数.当被调用的时候,生成器函数返回一个生成器.可以使用send,throw,close方法让生成器和外界交互. 生成器也是迭代器,但是它不仅仅 ...
- Informix SDK對比
一.基本信息對比 表 1. Informix .NET Provider 和 IBM Data Server .NET Provider 的对比 特性 IBM Informix .NET Provid ...
- C++学习39 异常处理入门(try和catch)
编译器能够保证代码的语法是正确的,但是对逻辑错误和运行时错误却无能为力,例如除数为 0.内存分配失败.数组越界等.这些错误如果放任不管,系统就会执行默认的操作,终止程序运行,也就是我们常说的程序崩溃( ...