ansible API 常用模塊


常用模塊

用於讀取yaml,json格式的文件
from ansible.parsing.dataloader import DataLoader
#用於管理變量的類,包括主機,組,擴展等變量
from ansible.vars.manager import VariableManager
#用於創建和管理inventory,倒入inventory文件
from ansible.inventory.manager import InventoryManager
#ad-hoc 存儲着角色列表,任務,處理代碼塊
from ansible.playbook.play import Play
#ad-hoc ansible底層用到的任務隊列
from ansible.executor.task_queue_manager import TaskQueueManager
#回調基類,用來定義回調事件,比如返回失敗成功等信息
from ansible.plugins.callback import CallbackBase
#執行playbook
from ansible.executor.playbook_executor import PlaybookExecutor
#操作單個主機
from ansible.inventory import host
#操作單個主機組
from ansible.inventory import group

InventoryManager

#實例化需要兩個參數
"參數一為讀取yml文件的信息,需要實例化 DataLoader"
"參數二為讀取從那個位置讀取資產配置文件,多個可逗號分割"
intertory = InventoryManager(loader='',sources='')
#以字典的方式打印出主機和主機組相關信息
intertory.get_group_dict()
#獲取所有的主機
inventory.get_hosts()
#添加主機到指定主機組
"參數一指定主機地址"
"參數二指定主機端口"
"參數三指定主機群組,必須存在的群組"
inventory.add_host(host='1.1.1.1',port=2222,group='web_server')
#獲取指定的主機對象
inventory.get_host(hostname='1.1.1.1')

VariableManager

#實例化需要兩個參數
"參數一為讀取yml文件的信息,需要實例化 DataLoader"
"參數二為資產管理配置變量"
variable = VariableManager(loader=loader,inventory=inventory)
#獲取變量
variable.get_vars()
# 查看指定主機的詳細變量信息
"傳入的host是inventory.get_host獲得的主機對象"
host = inventory.get_host(hostname='1.1.1.1')
host_vars = variable.get_vars(host=host)
#設置主機變量方法 
"傳入的host是inventory.get_host獲得的主機對象"
host = inventory.get_host(hostname='1.1.1.1')
variable.set_host_variable(host=host,varname='ansible_ssh_pass',value='12345')
#添加擴展變量
"參數是一個字典多個逗號分割"
variable.extra_vars={'devops':'best'}

基於CMDB接口返回主機&主機信息進行動態執行

#!/usr/bin/env python
# -*- coding:utf-8 -*- 

import json 
import sys 
import os
import django
sys.path.append('../../')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "automation_ansible_api.settings")
django.setup()
from assets.models import Group

def Group_list():
    '''
        這個函數的目的是獲取所有主機以及群組的相關信息,必須是json格式,格式如下
        {
        "Devops": {
            "hosts": [
                "172.20.35.177",
                "172.20.35.16",
                "106.14.154.11",
                "139.196.90.14",
                "140.143.191.129"
            ]
        }
    }
    '''
    result = {}
    groups = Group.objects.all() #主機組的所有名字,多對多關系這里能反向查找出來
    for i in groups:
        if i.host_set.all():
            result[i.name] = {'hosts':[]}
            for x in i.host_set.all():
                result[i.name]['hosts'].append(x.ip_address)
    print(json.dumps(result,indent=4))

def Host_list(ip):
    '''
        這個函數目的是存儲一些變量,inventory的一些參數比如執行的用戶,密碼,端口等等,可返回空,根據自身需求
        {
            "ansible_ssh_host": "172.20.35.177",
            "ansible_ssh_user": "root"
        }
    '''
    print(json.dumps({
        "ansible_ssh_host": ip,
        "ansible_ssh_user": "root"},indent=4))

if __name__ == '__main__':
    '''
        一下兩個參數必須存在,這個是用於ansible去執行和發現的!
    ''' 
    if len(sys.argv) == 2 and (sys.argv[1] == '--list'): 
       Group_list()
    elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):
        Host_list(sys.argv[2])

ansible-api調用執行

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import json
from ansible.plugins.callback import CallbackBase
from 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 collections import namedtuple
#實例化解析yml
loader = DataLoader()
#實例化資產管理
'''
    2.4+的inventory必須有sources參數,參數路徑為動態執行的那個腳本!這里很坑我研究了一天!
'''
inventory = InventoryManager(loader=loader,sources='hosts') 
#實例化變量管理
variable_manager = VariableManager(loader=loader,inventory=inventory)
Options = namedtuple('Options',
                     ['connection',
                      'remote_user',
                      'ask_sudo_pass',
                      'verbosity',
                      'ack_pass',
                      'module_path',
                      'forks',
                      'become',
                      'become_method',
                      'become_user',
                      'check',
                      'listhosts',
                      'listtasks',
                      'listtags',
                      'syntax',
                      'sudo_user',
                      'sudo',
                      'diff'])
options = Options(connection='smart',
                       remote_user=None,
                       ack_pass=None,
                       sudo_user=None,
                       forks=5,
                       sudo=None,
                       ask_sudo_pass=False,
                       verbosity=5,
                       module_path=None,
                       become=None,
                       become_method=None,
                       become_user=None,
                       check=False,
                       diff=False,
                       listhosts=None,
                       listtasks=None,
                       listtags=None,
                       syntax=None)
play_source =  dict(
        '''
            hosts為執行的主機或者群組!
        '''
        name = "Ansible Play ad-hoc test",
        hosts = '139.196.90.14', 
        gather_facts = 'no',
        tasks = [
            dict(action=dict(module='ping', args='')),
            # dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
         ]
    )
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

class ModelResultsCollector(CallbackBase):
    def __init__(self, *args, **kwargs):
        super(ModelResultsCollector, self).__init__(*args, **kwargs)
        self.host_ok = {}
        self.host_unreachable = {}
        self.host_failed = {}
    def v2_runner_on_unreachable(self, result):
        self.host_unreachable[result._host.get_name()] = result
    def v2_runner_on_ok(self, result):
        self.host_ok[result._host.get_name()] = result
    def v2_runner_on_failed(self, result):
        self.host_failed[result._host.get_name()] = result
callback = ModelResultsCollector()
passwords = dict()
# 傳入自定義的callback
tqm = TaskQueueManager(
          inventory=inventory,
          variable_manager=variable_manager,
          loader=loader,
          options=options,
          passwords=passwords,
          stdout_callback=callback,
      )
result = tqm.run(play)
# 自定義格式化輸出,執行結果數據在result對象的_result屬性里
result_raw = {'success':{},'failed':{},'unreachable':{}}
for host,result in callback.host_ok.items():
    result_raw['success'][host] = result._result
for host,result in callback.host_failed.items():
    result_raw['failed'][host] = result._result

print(json.dumps(result_raw,indent=4))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM