python 调用linux内核api_python3 调用ansible api使用说明

python3 安装ansible 模块

pip3 install ansible

pip3 install ansible_runner

pip3 install ansible_inventory

pip3 install ansible_playbook

获取官方实例并修改

核心类介绍

导入类完整路径

功能用途

from ansible.module_utils.common.collections import ImmutableDict

用于添加选项。比如: 指定远程用户remote_user=None

from ansible.parsing.dataloader import DataLoader

读取 json/ymal/ini 格式的文件的数据解析器

from ansible.vars.manager import VariableManager

管理主机和主机组的变量管理器

from ansible.inventory.manager import InventoryManager

管理资源库的,可以指定一个 inventory 文件等

from ansible.playbook.play import Play

用于执行 Ad-hoc 的类 ,需要传入相应的参数

from ansible.executor.task_queue_manager import TaskQueueManager

ansible 底层用到的任务队列管理器

ansible.plugins.callback.CallbackBase

处理任务执行后返回的状态

from ansible import context

上下文管理器,他就是用来接收 ImmutableDict 的示例对象

import ansible.constants as C

用于获取 ansible 产生的临时文档。

from ansible.executor.playbook_executor import PlaybookExecutor

执行 playbook 的核心类

from ansible.inventory.host import Group

对 主机组 执行操作 ,可以给组添加变量等操作,扩展

from ansible.inventory.host import Host

对 主机 执行操作 ,可以给主机添加变量等操作,扩展

[root@dev-technology-215l shell]# cat ansible2.py

import json

import shutil

from ansible.module_utils.common.collections import ImmutableDict

from ansible.parsing.dataloader import DataLoader

from ansible.vars.manager import VariableManager

from ansible.inventory.manager import InventoryManager

from ansible.playbook.play import Play

from ansible.executor.task_queue_manager import TaskQueueManager

from ansible.plugins.callback import CallbackBase

from ansible import context

import ansible.constants as C

class ResultCallback(CallbackBase):

"""

重写callbackBase类的部分方法

"""

def __init__(self, *args, **kwargs):

super().__init__(*args, **kwargs)

self.host_ok = {}

self.host_unreachable = {}

self.host_failed = {}

self.task_ok = {}

def v2_runner_on_unreachable(self, result):

self.host_unreachable[result._host.get_name()] = result

def v2_runner_on_ok(self, result, **kwargs):

self.host_ok[result._host.get_name()] = result

def v2_runner_on_failed(self, result, **kwargs):

self.host_failed[result._host.get_name()] = result

class MyAnsiable2():

def __init__(self,

connection='local', # 连接方式 local 本地方式,smart ssh方式

remote_user=None, # ssh 用户

remote_password=None, # ssh 用户的密码,应该是一个字典, key 必须是 conn_pass

private_key_file=None, # 指定自定义的私钥地址

sudo=None, sudo_user=None, ask_sudo_pass=None,

module_path=None, # 模块路径,可以指定一个自定义模块的路径

become=None, # 是否提权

become_method=None, # 提权方式 默认 sudo 可以是 su

become_user=None, # 提权后,要成为的用户,并非登录用户

check=False, diff=False,

listhosts=None, listtasks=None,listtags=None,

verbosity=3,

syntax=None,

start_at_task=None,

inventory=None):

# 函数文档注释

"""

初始化函数,定义的默认的选项值,

在初始化的时候可以传参,以便覆盖默认选项的值

"""

context.CLIARGS = ImmutableDict(

connection=connection,

remote_user=remote_user,

private_key_file=private_key_file,

sudo=sudo,

sudo_user=sudo_user,

ask_sudo_pass=ask_sudo_pass,

module_path=module_path,

become=become,

become_method=become_method,

become_user=become_user,

verbosity=verbosity,

listhosts=listhosts,

listtasks=listtasks,

listtags=listtags,

syntax=syntax,

start_at_task=start_at_task,

)

# 三元表达式,假如没有传递 inventory, 就使用 "localhost,"

# 指定 inventory 文件

# inventory 的值可以是一个 资产清单文件

# 也可以是一个包含主机的元组,这个仅仅适用于测试

# 比如 : 1.1.1.1, # 如果只有一个 IP 最后必须有英文的逗号

# 或者: 1.1.1.1, 2.2.2.2

self.inventory = inventory if inventory else "localhost,"

# 实例化数据解析器

self.loader = DataLoader()

# 实例化 资产配置对象

self.inv_obj = InventoryManager(loader=self.loader, sources=self.inventory)

# 设置密码

self.passwords = remote_password

# 实例化回调插件对象

self.results_callback = ResultCallback()

# 变量管理器

self.variable_manager = VariableManager(self.loader, self.inv_obj)

def run(self, hosts='localhost', gether_facts="no", module="ping", args='', task_time=0):

"""

参数说明:

task_time -- 执行异步任务时等待的秒数,这个需要大于 0 ,等于 0 的时候不支持异步(默认值)。这个值应该等于执行任务实际耗时时间为好

"""

play_source = dict(

name = "Ad-hoc",

hosts = hosts,

gather_facts = gether_facts,

tasks = [

# 这里每个 task 就是这个列表中的一个元素,格式是嵌套的字典

# 也可以作为参数传递过来,这里就简单化了。

{"action":{"module": module, "args": args}, "async": task_time, "poll": 0}])

play = Play().load(play_source, variable_manager=self.variable_manager, loader=self.loader)

tqm = None

try:

tqm = TaskQueueManager(

inventory=self.inv_obj ,

variable_manager=self.variable_manager,

loader=self.loader,

passwords=self.passwords,

stdout_callback=self.results_callback)

result = tqm.run(play)

finally:

if tqm is not None:

tqm.cleanup()

shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)

def playbook(self,playbooks):

"""

Keyword arguments:

playbooks -- 需要是一个列表类型

"""

from ansible.executor.playbook_executor import PlaybookExecutor

playbook = PlaybookExecutor(playbooks=playbooks,

inventory=self.inv_obj,

variable_manager=self.variable_manager,

loader=self.loader,

passwords=self.passwords)

# 使用回调函数

playbook._tqm._stdout_callback = self.results_callback

result = playbook.run()

def get_result(self):

result_raw = {'success':{},'failed':{},'unreachable':{}}

# print(self.results_callback.host_ok)

for host,result in self.results_callback.host_ok.items():

result_raw['success'][host] = result._result

for host,result in self.results_callback.host_failed.items():

result_raw['failed'][host] = result._result

for host,result in self.results_callback.host_unreachable.items():

result_raw['unreachable'][host] = result._result

# 最终打印结果,并且使用 JSON 继续格式化

print(json.dumps(result_raw, indent=4))

return json.dumps(result_raw)

测试run ansible

[root@dev-technology-215l shell]# cat ansible_run_wc.py

from ansible2 import * #引用修改过的ansible2.py 的所有模块

import ansible_runner

import subprocess

import os, sys, json, datetime, time

ansible3 = MyAnsiable2(inventory='/data/ansible/host/hosts', connection='smart') #创建资源库对象

ansible3.run(hosts= "192.168.0.94", module="shell", args='pm2 ls | grep sk_service_design_calculate_rda | wc -l')

stdout_dict = json.loads(ansible3.get_result())

print(stdout_dict,type(stdout_dict))

print(stdout_dict['success']['192.168.0.94']['stdout'],'######wc')

运行结果:

[root@dev-technology-215l shell]# python ansible_run_wc.py

[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

{

"success": {

"192.168.0.94": {

"changed": true,

"end": "2020-07-06 14:59:30.529462",

"stdout": "3",

"cmd": "pm2 ls|grep sk_service_design_calculate_rda|wc -l",

"rc": 0,

"start": "2020-07-06 14:59:30.309994",

"stderr": "",

"delta": "0:00:00.219468",

"invocation": {

"module_args": {

"creates": null,

"executable": null,

"_uses_shell": true,

"strip_empty_ends": true,

"_raw_params": "pm2 ls|grep sk_service_design_calculate_rda|wc -l",

"removes": null,

"argv": null,

"warn": true,

"chdir": null,

"stdin_add_newline": true,

"stdin": null

}

},

"stdout_lines": [

"3"

],

"stderr_lines": [],

"ansible_facts": {

"discovered_interpreter_python": "/usr/bin/python"

},

"_ansible_no_log": false

}

},

"failed": {},

"unreachable": {}

}

{'success': {'192.168.0.94': {'changed': True, 'end': '2020-07-06 14:59:30.529462', 'stdout': '3', 'cmd': 'pm2 ls|grep sk_service_design_calculate_rda|wc -l', 'rc': 0, 'start': '2020-07-06 14:59:30.309994', 'stderr': '', 'delta': '0:00:00.219468', 'invocation': {'module_args': {'creates': None, 'executable': None, '_uses_shell': True, 'strip_empty_ends': True, '_raw_params': 'pm2 ls|grep sk_service_design_calculate_rda|wc -l', 'removes': None, 'argv': None, 'warn': True, 'chdir': None, 'stdin_add_newline': True, 'stdin': None}}, 'stdout_lines': ['3'], 'stderr_lines': [], 'ansible_facts': {'discovered_interpreter_python': '/usr/bin/python'}, '_ansible_no_log': False}}, 'failed': {}, 'unreachable': {}}

3 ######wc

ansible playbook 测试

ansible-playbook python 脚本

[root@dev-technology-215l shell]# cat ansible_playbook_test.py

from ansible2 import *

import ansible_runner

import subprocess

import os, sys, json, datetime, time

import urllib.request

ansible3 = MyAnsiable2(inventory='/data/ansible/host/hosts', connection='smart')

ansible3.playbook(playbooks=['test.yml'])

stdout_dict = json.loads(ansible3.get_result())

print(stdout_dict,type(stdout_dict))

#print(stdout_dict['success']['192.168.0.94']['stdout'])

test.yml

[root@dev-technology-215l shell]# grep -C5 192.168.0.94 /data/ansible/host/hosts

###rda-环境node高负载应用linux标准A组###

[rda-highload-node-service-linux-stdA]

192.168.0.94 ansible_ssh_user=root ansible_ssh_pass="Sxxx-xxxx"

- name: test server

hosts: 'rda-highload-node-service-linux-stdA'

tasks:

- name: online pm2 ls

raw: ls /data/

测试结果

[root@dev-technology-215l shell]# python ansible_playbook_test.py

[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

{

"success": {

"192.168.0.94": {

"rc": 0,

"stdout": "lost+found pm2-log pm2-web rsyslog samba xxxx-java xxxx-node source\r\n",

"stdout_lines": [

"lost+found pm2-log pm2-web rsyslog samba xxxx-java xxxx-node source"

],

"stderr": "Shared connection to 192.168.0.94 closed.\r\n",

"stderr_lines": [

"Shared connection to 192.168.0.94 closed."

],

"changed": true,

"_ansible_no_log": false

}

},

"failed": {},

"unreachable": {}

}

{'success': {'192.168.0.94': {'rc': 0, 'stdout': 'lost+found pm2-log pm2-web rsyslog samba xxxx-java xxxx-node source\r\n', 'stdout_lines': ['lost+found pm2-log pm2-web rsyslog samba xxxx-java xxxx-node source'], 'stderr': 'Shared connection to 192.168.0.94 closed.\r\n', 'stderr_lines': ['Shared connection to 192.168.0.94 closed.'], 'changed': True, '_ansible_no_log': False}}, 'failed': {}, 'unreachable': {}}

[root@dev-technology-215l shell]#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值