常用模塊
用於讀取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))