博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ansible2.4.1 playbook API 简单整合
阅读量:2338 次
发布时间:2019-05-10

本文共 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()] = 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

    def v2_runner_on_skipped(self, result, *args, **kwargs):

        self.host_skipped[result._host.get_name()] = result

class 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._result

        for host, result in self.callback.host_failed.items():

            self.results_raw['failed'][host] = result._result

        for 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/ansible

resource = ''

#默认使用hosts文件

forks = 100
# 开启多少线程协助

timeout = 30

# 设置超时时间

remote_user = 'ansible'
#ansible远程到目标机器所用的用户

become = None

#是否切换用户True、None

become_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/

你可能感兴趣的文章
如何使用C#解析JSON?
查看>>
如何从MySQL中的表中删除列
查看>>
我已经安装了哪个版本的Python?
查看>>
ng-if和ng-show / ng-hide有什么区别
查看>>
将Java InputStream的内容写入OutputStream的简便方法
查看>>
用Java复制文件的标准简洁方法?
查看>>
管理webpack中的jQuery插件依赖项
查看>>
删除可能不存在的文件的大多数pythonic方式
查看>>
如何在Eclipse中为Java文本编辑器更改字体大小?
查看>>
我们应该@Override接口的方法实现吗?
查看>>
ng-repeat定义次数而不是重复数组?
查看>>
选择语句以查找某些字段的重复项
查看>>
引导程序中“col-md-4”,“col-xs-1”,“col-lg-2”中数字的含义
查看>>
JavaScript ES6类中的私有属性
查看>>
List vs tuple,何时使用? [重复]
查看>>
默认情况下,如何以管理员身份运行Visual Studio?
查看>>
通过varargs参数可能导致堆污染
查看>>
Git学习笔记1 神奇的git stash
查看>>
Unable to locate package错误解决办法
查看>>
关于service中添加Transaction注解后,service无法注入bean
查看>>