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 ImmutableDictfrom 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 可以是 subecome_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]#
ansible python 并发设置 ansible python3
转载文章标签 ansible python 并发设置 ansible不支持python3 json python sed 文章分类 Python 后端开发
-
ansible python代码 ansible python3
一、Ansible 安装 下载安装并解压 python 3.7 包安装 wget yum -y install wget下载 python 文件 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz (离线安装需提前准备压缩包)解压文件 tar zxvf Pytho
ansible python代码 自动化运维 ansible playbook 剧本 ansible 自动化运维