问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用Ansible 2.0 API的Python运行剧本

发布网友 发布时间:2022-04-23 15:40

我来回答

2个回答

懂视网 时间:2022-04-10 17:19

ansible 编写mysql_use模块的使用
今天使用ansible安装管理mariadb数据库的时候,碰到问题,在网上找不到对应的解决办法。然后自己查资料,终于写出,
查阅资料:编写如下脚本

[root@manager-161 playbook]# cat mysql.yaml 
- hosts: mysql
 tasks:

 - name: install mariadb
 yum: name=mariadb-devel,mariadb-server state=installed

 - name: install python-devel pip
 yum: name=python-devel,python2-pip state=installed

 - name: shell mtsql-python
 shell: ‘pip install MySQL-python‘

 - name: statr mariadb
 service: name=mariadb state=started enabled=yes

 - mysql_user:
 user: root
 password: sf123
 update_password: always

 - name: create wordpress
 mysql_db:
 name: ‘root‘
 login_host: ‘localhost‘
 login_password: ‘zsf123‘
 name: ‘wordpress‘
 state: ‘present‘

 - mysql_user:
 user: ‘root‘
 login_host: ‘localhost‘
 login_password: ‘zsf123‘
 user: ‘zzsf‘
 password: ‘zsf124‘
 priv: ‘*.*:ALL‘
 state: present

 - mysql_user:
 user: ‘root‘
 login_host: ‘localhost‘
 login_password: ‘zsf123‘
 user: ‘zzsf‘
 password: ‘zsf124‘
 priv: ‘*.*:ALL‘
 host_all: yes
 state: present

 - mysql_db:
 user: ‘root‘
 login_host: 127.0.0.1
 login_password: zsf123
 name: lt
 state: present

#mariadb安装之后没有密码,我们必须先更改root的密码
然后mysql需要安装mysql-python的模块
yum -y install python-devel,python2-pip
pip install mysql

ansible通过剧本管理mysql

标签:use   cal   book   login   password   man   star   解决   adb   

热心网友 时间:2022-04-10 14:27

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

import ansible.runner

runner = ansible.runner.Runner(
mole_name='ping',
mole_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','mole_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',
mole_path='/usr/lib/python2.7/site-packages/ansible/moles', 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(mole='shell', args=args), register='shell_out'),
dict(action=dict(mole='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的。如果需要加载,还是得使用临时文件的办法。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 如何通过SFTP在python连接后列出目录中的所有文件夹和文件 请问qq邮箱pop3与smtp怎么设置? 树莓派python是不是不能操作硬件PWM python 使用paramiko模块ssh远程linux服务器,linux服务器已经使用公钥... 谁用过python下ssh包paramiko python ssh登录网管后继续ssh登录其它机器,咋写接下来的代码?_百度... 远端运行本地python脚本 python 实现ssh的执行远端命令和scp的不同机器文件传输功能 如何在Python中scp远程拷贝文件 信号最强的4G或5G手机有哪些? 3G,4G,5G这几个网络有什么本质上的区别吗? 我想要了解一下是否有4G和5G的区别,有人明确的吗? 4g和5g的区别? 5G和4G到底有什么区别? word分栏如何底边对齐? word2003分栏后要求每栏的对齐方式不同怎么操作? word分栏后,左边3行和右边4行文字怎么做到整体上下对齐? word分栏对齐问题 word文档分栏怎么设置顶部对齐 word分栏后,两栏首行不在同一高度,怎样调到相同高度? python 句子中字母出现的次数 vivo登不上qq邮箱 已开启pop3等各种服务 和中秋节有关的古诗 与中秋有关的民俗典故都有哪些? QQ邮箱打开IMAP开启时有个验证密保是什么为什么我这里出不来 qq邮箱pop3登录失败,密码正确的 和中秋节有关的诗歌 为什么QQ邮箱设置总是鉴定失败,pop,IMAP什么的都已经点开了,还是不行,其他邮箱都好好的 怎样在QQ邮箱登录时需要密保认证 qq邮箱怎么设置开通pop3协议? QQ邮箱打开IMAP开启时验证密出不来怎么办? 关于中秋节的诗歌都有那些啊? 有关中秋节的诗句有什么 做砖胎膜的材料? 机箱如下图,联想拯救者y720小钢炮,求配置4000元吃鸡中特效。 哪位大佬能给个配置,真诚感谢! 想装台11代酷睿小钢炮,同时性能也得给力,麻烦大神推荐一套板U? 小钢炮主机用什么机箱 小钢炮,主板技嘉F2A85XN-WIFI,CPU AMD A85-5600K,金士顿4G*2,机箱乔思伯V3+,配置怎样 请问组装一台性能小钢炮电脑 联想y720小钢炮的主板有其他通用主板吗?,还有这个主机的配置支持,显卡限长,散热限长?