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是修改源 ...
随机推荐
- apache/php 开启 gzip压缩
1.php方式开启 原理: header("Content-Encoding: gzip"); echo gzencode('songjiankang'); 示例1: functi ...
- 别去研究C++
转载 YH,今天早晨起来.回想昨天,虽然吐槽了 C++ 的各种问题,但给别人打工,还是要靠 C++ 干活吃饭.我对待 C++ 的态度和云风不同,虽然他所说的 C++ 技术的事情我都懂都理解,而我感受到 ...
- Studio右键选项中没有Git?
从Git clone一个Project并打开后,都会习惯性的像使用Eclipse一样,选中工程右键,选择Git的对应版本控制选项. 如下图,你只看到了svn. 如何配置才能在右键选项中看到Git呢,我 ...
- TNT平台
1, TNT平台 本词条缺少信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! TNT平台中的开发平台是基于微软Jupiter平台的快速开发工具,开发者可以通过界面属性设定的方法来 ...
- Cassandra在Windows上安装及使用方法
http://archive.apache.org/dist/cassandra/2.1.2/ http://docs.datastax.com/en/landing_page/doc/landing ...
- ASP isPostBack
源地址:http://blog.163.com/budong_weimin_zh/blog/static/129198524201061995455589/ ASP.NET中IsPostBack详解 ...
- 93、App Links (应用程序链接)实例
•网页端statements.json文件配置说明 package_name :APP包的名. sha256.... : APP的签名. •应用Manifest文件声明说明 <ap ...
- Asteroids (最小覆盖)
题目很简单,但是需要推到出二分图最大匹配 = 最小覆盖 最小覆盖:证明过程http://blog.sina.com.cn/s/blog_51cea4040100h152.html Descriptio ...
- Django网站直接使用supervisor部署
python manage.py createsuperuser python manage.py migrate 生成网站的supervisor配置文件: echo_supervisord_conf ...
- 通过反射获取父类中的泛型参数对应的Class对象
假设有两个类:Dao 和 PersonDao,它们的代码如下: Dao: public class Dao<T> { private Class<T> clazz; T get ...