本文共 5518 字,大约阅读时间需要 18 分钟。
测试环境 centos 7.3 python 3.6.1 ansible 2.4.1
Ansible_Playbook_Api.py
#!/usr/bin/python
import json
import shutil from collections import namedtuple from ansible.parsing.dataloader import DataLoader from ansible.vars.manager import VariableManager from ansible.inventory.manager import InventoryManager from ansible.executor.playbook_executor import PlaybookExecutor from ansible.plugins.callback import CallbackBase#重写callbackbase
class ResultsCollector(CallbackBase): def __init__(self, *args, **kwargs): super(ResultsCollector, self).__init__(*args, **kwargs) self.host_ok = {} self.host_unreachable = {} self.host_failed = {} self.host_skipped = {} def v2_runner_on_unreachable(self, result,*args, **kwargs): self.host_unreachable[result._host.get_name()] = resultdef v2_runner_on_ok(self, result, *args, **kwargs):
self.host_ok[result._host.get_name()] = resultdef v2_runner_on_failed(self, result, *args, **kwargs):
self.host_failed[result._host.get_name()] = resultdef v2_runner_on_skipped(self, result, *args, **kwargs):
self.host_skipped[result._host.get_name()] = resultclass Runner(object):
def __init__(self, resource="/etc/ansible/hosts",*args, **kwargs,):
""" 初始化函数 """ self.resource = resource self.inventory = None self.variable_manager = None self.loader = None self.options = None self.passwords = None self.callback = None self.__initializeData() self.results_raw = {}def __initializeData(self):
""" 初始化ansible """Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'timeout', 'remote_user',
'ask_pass', 'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args', 'scp_extra_args', 'become', 'become_method', 'become_user', 'ask_value_pass', 'verbosity', 'check', 'listhosts', 'listtasks', 'listtags', 'syntax','diff'])self.options = Options(connection=connection, module_path=module_path, forks=forks, timeout=timeout,
remote_user=remote_user, ask_pass=False, private_key_file=None, ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=become, become_method=become_method, become_user=become_user, ask_value_pass=False, verbosity=None, check=False, listhosts=False, listtasks=False, listtags=False, syntax=False, diff=False)self.loader = DataLoader()
self.passwords = dict(vault_pass='') self.inventory = InventoryManager(loader=self.loader, sources=self.resource) self.variable_manager = VariableManager(loader=self.loader, inventory= self.inventory) def playbook_run(self,playbook_yml): """ run ansible palybook """self.callback = ResultsCollector()
playbook = PlaybookExecutor(playbooks = playbook_yml, inventory = self.inventory, variable_manager = self.variable_manager, loader = self.loader, options = self.options, passwords = self.passwords) playbook._tqm._stdout_callback = self.callback playbook.run()def get_result(self):
self.results_raw = {'success': {}, 'failed': {}, 'unreachable': {},'skipped':{}} for host,result in self.callback.host_ok.items(): self.results_raw['success'][host] = result._resultfor host, result in self.callback.host_failed.items():
self.results_raw['failed'][host] = result._resultfor host, result in self.callback.host_unreachable.items():
self.results_raw['unreachable'][host] = result._result['msg'] for host,result in self.callback.host_skipped.items(): self.results_raw['skipped'][host] = result._result return self.results_raw######################此设置为 全局设置 请谨慎修改,推荐默认######################################
#module_path = ['/usr/local/bin/ansible']
# ansible命令的执行路径: 获取方式(例子) # [root@autoplatform ~]# which ansible # /usr/local/bin/ansibleresource = ''
#默认使用hosts文件 forks = 100 # 开启多少线程协助timeout = 30
# 设置超时时间 remote_user = 'ansible' #ansible远程到目标机器所用的用户become = None
#是否切换用户True、Nonebecome_method = None
#切换用户的方法: su sudo 取决于你是什么系统 测试环境:centos7.3 使用su become_user = None #切换到哪个用户 #默认是不切换用户 可以在playbook里设置某条命令是否切换root/用户 执行,如果设置了就是所有的playbook都用root/用户 执行connection='smart'
################################################################if __name__ == "__main__":
if resource == '': playbook_yml = ['test.yml'] ansible = Runner() ansible.playbook_run(playbook_yml) print(json.dumps(ansible.get_result(), indent=4)) else: playbook_yml = ['test.yml'] ansible = Runner(resource) ansible.playbook_run(playbook_yml) print(json.dumps(ansible.get_result(),indent=4))####################################测试playbook#######################################
在同级目录下创建test.yml
test.yml
---
- hosts: all vars: dirname: test1 tasks: - name: crate file dir command: touch /tmp/{ { dirname }}##############################hosts文件#################################################
cat hosts
10.2.11.50:22 ansible_ssh_user=ansible ansible_ssh_pass='123456' ansible_su_pass='123456'
PS:我这里是用明文密码登陆目标机器 没有做免密登陆
配置明文方法:
ansible 不配ssh免密链接,直接用ssh用户密码连接,要先装sshpass。
sshpass安装
sshpass下载地址:
运行下列命令安装
tar -zxvf sshpass-1.05.tar.gz cd sshpass-1.05 ./configure make && make install
安装完成后输入sshpass出现如下提示即安装成功:
# sshpass Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters -f filename Take password to use from file -d number Use number as file descriptor for getting password -p password Provide password as argument (security unwise) -e Password is passed as env-var "SSHPASS" With no parameters - password will be taken from stdin -h Show help (this screen) -V Print version information At most one of -f, -d, -p or -e should be used
hosts 文件中添加用户密码,认证ssh连接【不推荐】
# hosts 192.168.69.132 ansible_ssh_user=root ansible_ssh_pass=root
注意:
如果使用sshpass需要修改ansible.cfg
把host_key_checking=False注销去掉。
转载地址:http://jugpb.baihongyu.com/