#!/usr/bin/env python
# coding=utf-8
import os
import time
from ansible import context
from ansible.cli import CLI
from ansible.module_utils.common.collections import ImmutableDict
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager
class AnsibleDh(object):
def __init__(self, hostsFile="ansible-hosts"):
self.hostsFile = hostsFile
self.empty_file()
def empty_file(self):
"""
清空ansible hosts文件
:return: None
"""
if os.path.exists(self.hostsFile):
os.remove(self.hostsFile)
def add_host(self, lineContenet):
"""
把配置内容(一台主机信息)追加写入ansible hosts文件中
:param lineContenet: ansible hosts的一行内容
:return: None
"""
with open(self.hostsFile, encoding="utf-8", mode="a") as f:
f.write(lineContenet)
def cmd_palybook(self, playbook):
"""
执行剧本
:param playbook: playbook绝对路径
:return:
"""
loader = DataLoader()
context.CLIARGS = ImmutableDict(tags={}, listtags=False, listtasks=False, listhosts=False, syntax=False,
connection='ssh', module_path=None, forks=100, remote_user='root',
private_key_file=None, ssh_common_args='-o StrictHostKeyChecking=no',
ssh_extra_args='-o StrictHostKeyChecking=no', sftp_extra_args=None,
scp_extra_args=None, become=True, become_method='sudo', become_user='root',
verbosity=True, check=False, start_at_task=None)
inventory = InventoryManager(loader=loader, sources=(self.hostsFile,))
variableManager = VariableManager(loader=loader, inventory=inventory,
version_info=CLI.version_info(gitinfo=False))
try:
pbExec = PlaybookExecutor(playbooks=[playbook], inventory=inventory,
variable_manager=variableManager, loader=loader, passwords={})
res = pbExec.run()
except Exception as error:
print("[错误] Playbook执行异常")
print(error)
else:
# 备份ansible hosts文件
now = time.strftime("%Y%m%d-%H:%M:%S", time.localtime())
os.rename(self.hostsFile, self.hostsFile + '-' + now)
if __name__ == '__main__':
print('ok')