首页 > 编程知识 正文

api与python源码(api源代码)

时间:2023-12-14 13:33:51 阅读:315572 作者:ZJYZ

本文目录一览:

如何使用Ansible 2的API做python开发

在ansible1.9的时候,API是一个非常简单的东西。官方说“it's pretty simple”,真是又pretty又simple。

import ansible.runner

runner = ansible.runner.Runner(

module_name='ping',

module_args='',

pattern='web*',

forks=10

)

datastructure = runner.run()

到了ansible2.0以后,是“a bit more complicated”,Oh my,简直让人难受。

简洁和灵活是鱼和熊掌。

ansible2.0 API怎么用?

ansible2.0更贴近于ansible cli的常用命令执行方式,不同于上一版本只能发送单个命令或playbook;而更推荐用户在调用ansibleAPI的时候,将playbook的每个task拆分出来,获取每个task的结果。能够跟灵活处理在执行批量作业过程中的各种反馈。

将执行操作的队列模型,包含各类环境参数设置,归结到“ansible.executor.task_queue_manager”类中

将执行过程中的各个task的设置,或者说playbook中的编排内容,归结到“ansible.playbook.play”中

上述两个东西,几乎囊括了可以在执行过程中设置的所有参数,足够灵活,也让人抓狂,相当于需要自己写一个1.9版本中的runner。

他们的确也都是原生类,并非专用于外部调用。

ansible.executor.task_queue_manager

这是ansible的一个内部模块(ansible/executor/task_queue_manager.py)。初始化的源码如下:

class TaskQueueManager:

'''

This class handles the multiprocessing requirements of Ansible by

creating a pool of worker forks, a result handler fork, and a

manager object with shared datastructures/queues for coordinating

work between all processes.

The queue manager is responsible for loading the play strategy plugin,

which dispatches the Play's tasks to hosts.

'''

def __init__(self, inventory, variable_manager, loader, options, passwords, stdout_callback=None, run_additional_callbacks=True, run_tree=False):

self._inventory = inventory

self._variable_manager = variable_manager

self._loader = loader

self._options = options

self._stats = AggregateStats()

self.passwords = passwords

self._stdout_callback = stdout_callback

self._run_additional_callbacks = run_additional_callbacks

self._run_tree = run_tree

self._callbacks_loaded = False

self._callback_plugins = []

self._start_at_done = False

self._result_prc = None

……

创建时,需要的主要参数包括:

inventory -- 由ansible.inventory模块创建,用于导入inventory文件

variable_manager -- 由ansible.vars模块创建,用于存储各类变量信息

loader -- 由ansible.parsing.dataloader模块创建,用于数据解析

options -- 存放各类配置信息的数据字典

passwords -- 登录密码,可设置加密信息

stdout_callback -- 回调函数

ansible.playbook.play

ansible.playbook是一个原生模块,既用于CLI也用于API。从源码可以看出来:

try:

from __main__ import display

except ImportError:

from ansible.utils.display import Display

display = Display()

ansible.playbook.play(ansible/playbook/play.py)。初始化源码的介绍如下:

__all__ = ['Play']

class Play(Base, Taggable, Become):

"""

A play is a language feature that represents a list of roles and/or

task/handler blocks to execute on a given set of hosts.

Usage:

Play.load(datastructure) - Play

Play.something(...)

"""

最后,用task_queue_manager(play)来执行,老规矩,源码的官方解释。

def run(self, play):

'''

Iterates over the roles/tasks in a play, using the given (or default)

strategy for queueing tasks. The default is the linear strategy, which

operates like classic Ansible by keeping all hosts in lock-step with

a given task (meaning no hosts move on to the next task until all hosts

are done with the current task).

'''

一个完整的例子

# -*- coding:utf-8 -*-

# !/usr/bin/env python

#

# Author: Shawn.T

# Email: shawntai.ds@gmail.com

#

# this is the Interface package of Ansible2 API

#

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 tempfile import NamedTemporaryFile

import os

class AnsibleTask(object):

def __init__(self, targetHost):

Options = namedtuple(

'Options', [

'listtags', 'listtasks', 'listhosts', 'syntax', 'connection','module_path',

'forks', 'remote_user', 'private_key_file', 'ssh_common_args', 'ssh_extra_args',

'sftp_extra_args', 'scp_extra_args', 'become', 'become_method', 'become_user',

'verbosity', 'check'

]

)

# initialize needed objects

self.variable_manager = VariableManager()

self.options = Options(

listtags=False, listtasks=False, listhosts=False, syntax=False, connection='smart',

module_path='/usr/lib/python2.7/site-packages/ansible/modules', forks=100,

remote_user='root', private_key_file=None, ssh_common_args=None, ssh_extra_args=None,

sftp_extra_args=None, scp_extra_args=None, become=False, become_method=None, become_user='root',

verbosity=None, check=False

)

self.passwords = dict(vault_pass='secret')

self.loader = DataLoader()

# create inventory and pass to var manager

self.hostsFile = NamedTemporaryFile(delete=False)

self.hostsFile.write(targetHost)

self.hostsFile.close()

self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list=self.hostsFile.name)

self.variable_manager.set_inventory(self.inventory)

def ansiblePlay(self, action):

# create play with tasks

args = "ls /"

play_source = dict(

name = "Ansible Play",

hosts = 'all',

gather_facts = 'no',

tasks = [

dict(action=dict(module='shell', args=args), register='shell_out'),

dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))

]

)

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

# run it

tqm = None

try:

tqm = TaskQueueManager(

inventory=self.inventory,

variable_manager=self.variable_manager,

loader=self.loader,

options=self.options,

passwords=self.passwords,

stdout_callback='default',

)

result = tqm.run(play)

finally:

# print result

if tqm is not None:

tqm.cleanup()

os.remove(self.hostsFile.name)

self.inventory.clear_pattern_cache()

return result

写一个ansibleTask类,创建了上述的各类必要的配置信息对象,最后使用ansibleTask.ansiblePlay()函数执行。

inventory文件的动态生成

写上面的代码的过程中,碰到一个问题:inventory对象创建时需要一个实体的hosts文件,而文件需要动态生成。

生成的方法参考了这篇牛逼闪闪的文章。使用tempfile.NamedTemporaryFile这个方法来创建一个有名称的临时文件,可以选择关闭后删除或保留。上面的处理办法是:不删除,在执行完毕之后,通过os.remove(self.hostsFile.name)进行删除。

ps.经YiChenWang指出,inventory的创建参数host_list可以使列表。使用以下方式创建inventory也是可以的:

self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list=['xx.xx.xx.xx', 'xx.xx.xx.xx'])

不过,源码中指出,采用list格式参数是无法加载inventory data的。如果需要加载,还是得使用临时文件的办法。

如何学习Python开源安全框架,并掌握其API

先打好py基础!!!然后边啃边理解更深入且优秀的编程思想!只要哪天你感觉看代码就跟看小说似的无压力,那一切就容易啦。

我读过py好多优秀开源,如sqlmap,wapti,一些优秀库的实现。

然后,得有安全基本功,要不然也没法理解安全类的源码是什么个思想。

最后,得有架构基本功,否则根本不知道这些API为什么存在,框架与插件之间为何这样通信,为什么要这样分模块,有什么地方可以优化的等等。

万事开头难,啃吧,调试吧!越到后面会越轻松,然后来给我点个赞

api接口和python库的区别是什么?

API

接口属于一种操作系统或程序接口,而后两者都属于直接用户接口。

有时公司会将

API

作为其公共开放系统。也就是说,公司制定自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式

API。

从哪能找到python示例程序或源码

参考资源 1.Python网站,

2.诺基亚论坛,,“Python for Series 60 Platform API参考”

3.诺基亚论坛,,“用Python for Series 60 Platform编程”

4.Python for S60 Wiki

5.Python for S60开发伙伴讨论区

6.更多信息,

游戏算法......这个就复杂了,一个游戏可大可小,涉及的东西博大精深,你的意思应该是想看哈python s60上面的游戏源代码哇,呵呵我没有弄过,其实只要你熟悉这个语言和平台了 就可以按照自己的想法写

写游戏是种想法 python只是工具 s60只是平台, 我记得有个外国超人说过 大概的意思"只要你能读写显存和键盘输入就能写出DOOM来"

如何获取python模块的api

一:用C API为Python写C语言函数,以方便Python中调用 1. 首先实现一个特定原型的函数,用Python C API来实现的话,所有函数必须是这种原型。必须是类似这样的 PyObject *Fun(PyObject *self, PyObject *args) self应该是在用类的时候才会用到

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。