最近把Ansible升级到2.2.1,感觉变化比较大,花些时间对playbook api 的调用做下总结
重大更新:
- ansible.conf中添加了strategy:free属性, 配置该属性可以实现任务的异步执行,再也不用的等待所有机器执行完,才进入下个任务了。
- ansible api 和 ansible-playbook api 的调用方式
发现的问题:
Ansible Playbook api的调用
核心类
ansible.executor.task_queue_manager
- 将各类参数放到"ansible.executor.task_queue_manager"类中
- 将playbook 拆分成多个task 放入ansible.executor.task_queue_manager中
直接上源码
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
# make sure the module path (if specified) is parsed and
# added to the module_loader object
...
参数:
- inventory --> 由ansible.inventory模块创建,用于导入inventory文件 (也可以直接使用实例)
- variable_manager --> 由ansible.vars模块创建,用于存储各类变量信息
- loader --> 由ansible.parsing.dataloader模块创建,用于数据解析
- options --> 存放各类配置信息的数据字典
- passwords --> 登录密码,可设置加密信息
- stdout_callback --> 回调函数(可以自定义返回结果)
完整的例子:
class MyInventory(object):
"""
this is my ansible inventory object
"""
def __init__(self, loader, variable_manager, host_list, groupname='default_group'):
"""
:param loader:
:param variable_manager:
:param host_list: ex.:[{'hostname':'','ip':'','port':,'username':,'password':,'become_root_passwd':,'become':,}]
:param groupname:
"""
self.inventory = Inventory(loader, variable_manager, host_list=[])
# self.inventory.refresh_inventory()
self.set_inventory(host_list, groupname)
def get_inventory(self):
return self.inventory
def set_inventory(self, hosts, groupname, groupvars=None):
"""
add hosts to a group
"""
my_group = Group(name=groupname)
# if group variables exists, add them to group
if groupvars:
for key, value in groupvars.iteritems():
my_group.set_variable(key, value)
# add hosts to group
for host in hosts:
# set connection variables
hostname = host.get("hostname")
hostip = host.get('ip', hostname)
hostport = host.get("port")
username = host.get("username")
password = host.get("password")
become_root_passwd = host.get("become_root_passwd")
become = host.get("become", True)
my_host = Host(name=hostname, port=hostport)
my_host.set_variable('ansible_host', hostip)
my_host.set_variable('ansible_port', hostport)
my_host.set_variable('ansible_user', username)
my_host.set_variable('ansible_ssh_pass', password)
my_host.set_variable('ansible_become', become)
my_host.set_variable('ansible_become_method', 'su')
my_host.set_variable('ansible_become_user', 'root')
my_host.set_variable('ansible_become_pass', become_root_passwd)
for key, value in host.iteritems():
if key not in ["hostname", "port", "username", "password"]:
my_host.set_variable(key, value)
# add to group
my_group.add_host(my_host)
self.inventory.add_group(my_group)
class ResultsCallBack(CallbackBase):
def __init__(self, *args, **kwargs):
super(ResultsCallBack, self).__init__(*args, **kwargs)
self.host_ok = {}
self.host_unreachable = {}
self.host_failed = {}
def v2_runner_on_unreachable(self, result):
self.host_unreachable[result._host.get_name()] = result
def v2_runner_on_ok(self, result, *args, **kwargs):
self.host_ok[result._host.get_name()] = result
def v2_runner_on_failed(self, result, *args, **kwargs):
self.host_failed[result._host.get_name()] = result
class AnsiblePlaybookTask(object):
def __init__(self, host_list, **kwargs):
"""
:param host_list: [{'hostname':'','ip':'','port':,'username':,'password':,'become_root_passwd':,'become':,}]
"""
Options = namedtuple('Options',
['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check',
'listtags', 'listtasks', 'listhosts', 'syntax', 'stdout_callback'])
# initialize needed objects
self.loader = DataLoader()
self.variable_manager = VariableManager()
self.resultCallBack = ResultsCallBack()
self.options = Options(
listtags=None,
listtasks=None,
listhosts=None,
syntax=None,
connection='smart',
module_path=None,
forks=100 if not kwargs else kwargs.get('forks', 100),
become=True, become_method=None,
stdout_callback=self.resultCallBack,
become_user=None, check=False)
myInventory = MyInventory(self.loader, self.variable_manager, host_list)
self.inventory = myInventory.get_inventory()
def run_yaml(self, yml_path, extra_vars):
self.variable_manager.extra_vars = extra_vars
playbook = Playbook.load(yml_path, variable_manager=self.variable_manager, loader=self.loader)
p = playbook.get_plays()[0]
tqm = None
try:
tqm = TaskQueueManager(
inventory=self.inventory,
variable_manager=self.variable_manager,
loader=self.loader,
options=self.options,
passwords=None,
stdout_callback=self.options.stdout_callback,
)
result = tqm.run(playbook.get_plays()[0])
finally:
if tqm is not None:
tqm.cleanup()
return result
def get_result(self):
self.results_raw = {'ok': {}, 'failed': {}, 'unreachable': {}}
for host, result in self.resultCallBack.host_ok.items():
self.results_raw['ok'][host] = result._result
for host, result in self.resultCallBack.host_failed.items():
self.results_raw['failed'][host] = result._result
for host, result in self.resultCallBack.host_unreachable.items():
self.results_raw['unreachable'][host] = result._result
return self.results_raw
调用:
playbook = AnsiblePlaybookTask( [dict(hostname='XXX', ip='XXX', port=XXX, username="XXX",
password='XXX', become_root_passwd='XXX', become=XXX,
platform='XXX') ])
playbook.run_yaml(yml_path='XXX', extra_vars={})
playbook.get_result()
优化点:
- 可以在MyInventory中设置每个Host的自身属性,并在yml里调用
- 自定义callback,将结果按需要输出
分享到:
相关推荐
文件中的内容似乎没有完全提供,但根据标题和描述,我们可以推断这篇文档将详细阐述自动化运维工具Ansible的部署和管理。Ansible是一款强大的自动化工具,尤其在IT基础设施的配置管理、应用程序部署以及任务自动化等...
自动化运维工具Ansible学习笔记 Ansible是一个简单的自动化运维管理工具,可以用来自动化部署应用、配置、编排task(持续交付、无宕机更新等)。Ansible基于Pythonparamiko开发,分布式,无需客户端,轻量级,配置...
Linux自动化运维ansible概述与常用模块 Linux自动化运维是当前IT行业中非常热门的技术方向,Ansible是自动化运维工具之一,下面我们将对Ansible的概述和常用模块进行详细介绍。 1. 自动化运维的概念 自动化运维是...
ansible自动化运维ansible自动化运维ansible自动化运维ansible自动化运维
- 运维自动化发展历程及技术应用 - Ansible命令使用 - Ansible常用模块详解 - YAML语法简介 - Ansible playbook基础 - Playbook变量、tags、handlers使用 - Playbook模板templates - Playbook条件判断 when - ...
Ansible 是一种强大的运维自动化工具,它以简洁的 YAML 语法和无代理(agentless)的特性在IT领域中广受欢迎。本章内容主要涵盖了运维自动化的发展历程和技术应用,特别是如何使用 Ansible 来实现自动化。 运维自动...
Ansible自动化运维实践是指使用Ansible工具实现自动化运维的实践,Ansible是一款开源的自动化运维工具,旨在简化IT自动化任务。Ansible源自Red Hat,由一系列简单的YAML格式的配置文件组成。 Ansible的核心概念是...
当我们谈论"openssh升级ansible-playbook"时,意味着我们需要使用Ansible的Playbook来自动化OpenSSH的更新过程。 首先,让我们详细了解一下Ansible Playbook。Playbook是Ansible的核心概念,它是以YAML格式编写的...
自动化运维工具ansible使用教程.zip
自动化运维Ansible的使用 Ansible是一个自动化运维工具,主要用于配置和管理IT infrastructure。Ansible的核心程序是Host Lnventory,它记录了每一个由Ansible管理的主机信息,包括ssh端口、root账号密码、ip地址...
纯个人整理关于ansible方面的部署 及常用命令使用。包括playbook命令使用指导和参数含义。网上很全,但是这里整理的是最经常用到的。绝对实用。而且新手一看就会用。中级以上也会更熟悉
### 自动化运维工具 Ansible 详细部署 #### 基础介绍 ##### 简介 Ansible 是一款先进的自动化运维工具,采用 Python 编程语言开发而成。相较于其他传统工具如 Puppet、Chef 和 CFEngine 等,它具备更为便捷的操作...
**运维自动化之ANSIBLE——基于Python的高效运维框架** Ansible是一款开源的自动化工具,尤其在运维领域广泛应用,因其简洁的配置方式、无代理的部署模式以及强大的功能而备受青睐。它采用YAML语言(也称为Ansible ...
Ansible的另一个亮点是其基于YAML的 playbook,这是一种声明式语言,用于定义自动化任务和工作流,让运维工作变得简洁明了。 在“高维学院-运维开发工程师-Ansible基础-1.pdf”中,你将了解到Ansible的安装过程,...
《Ansible自动化运维技术与最佳实践.pdf》2016年5月份出版
Ansible是一款广受欢迎的自动化运维工具,它以其简洁的配置语法和无代理的特性,在IT行业中赢得了极高赞誉。本教材与笔记将深入探讨Ansible在自动化运维中的应用,帮助读者理解并掌握其核心概念和实践技巧。 首先,...
### Ansible自动化运维工具详解与实践 #### 一、Ansible简介 Ansible是一款非常流行的自动化运维工具,它主要用于简化日常运维工作中的重复性任务,提高运维效率。Ansible使用Python语言开发,其最大的特点之一...
6. Ansible Playbook基本使用 7. Ansible Playbook的结构及handler用法 8. Ansible变量之自定义变量 9. Ansible变量之fact 10. Ansible魔法变量及变量优先级 11. 使用lookup生成变量 12. Ansible Vault配置加密 13. ...