python Ansible API使用

Ansible版本2.6.4,記錄下ansible API使用,合入到運營系統(tǒng),會使用到ansible批量操作服務(wù)器唉工,ansible本身就是python寫的,所以對于python來說可以直接調(diào)用汹忠,有興趣了解更多可以去官網(wǎng)看看https://docs.ansible.com/ansible/latest/index.html

# coding:utf-8
#!/usr/bin/env 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.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase
from ansible.errors import AnsibleError
import ansible.constants as C

class ResultCallback(CallbackBase):
    """結(jié)果回調(diào)"""
    def __init__(self, *args, **kwargs):
        super(ResultCallback, self).__init__(*args, **kwargs)
        self.host_ok = {}
        self.host_unreachable = {}
        self.host_failed = {}
        self.ret = {
            'host_ok': '',
            'host_unreachable': '',
            'host_failed': ''
        }

    def v2_runner_on_unreachable(self, result):
        self.host_unreachable[result._host.get_name()] = result
        self.ret['host_unreachable'] = {result._host.name: result._result}

    def v2_runner_on_ok(self, result, *args, **kwargs):
        self.host_ok[result._host.get_name()] = result
        self.ret['host_ok'] = {result._host.name: result._result}

    def v2_runner_on_failed(self, result, *args, **kwargs):
        self.host_failed[result._host.get_name()] = result
        self.ret['host_failed'] = {result._host.name: result._result}



class AnsibleApi():
    def __init__(self, sources='conf/ansible/hosts', name="ansible Play",hosts=None,actions=None):
        '''
        創(chuàng)建參數(shù)淋硝,為保證每個參數(shù)都被設(shè)置雹熬,ansible使用可命名元組
        '''
        self.Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff'])
        self.options = self.Options(connection='ssh', module_path=['/to/mymodules'], forks=30, become=None, become_method=None, become_user=None, check=False, diff=False)

        '''初始化loader類'''
        self.loader = DataLoader()  # 用于讀取與解析yaml和json文件
        self.passwords = dict(vault_pass='secret')

        '''初始化結(jié)果回調(diào)方法,用于接收返回的結(jié)果'''
        self.results_callback = ResultCallback()

        '''指定inventory谣膳,即我們的ansible hosts文件竿报,使用路徑指定一個host文件,或者一個逗號分割host的字符串'''
        self.inventory = InventoryManager(loader=self.loader, sources=sources)

        '''合并所有不同的資源成一個統(tǒng)一的變量管理視圖继谚,這些由變量管理器完成'''
        self.variable_manager = VariableManager(loader=self.loader, inventory=self.inventory)
        '''play_source 創(chuàng)建我們?nèi)蝿?wù)的數(shù)據(jù)結(jié)構(gòu)烈菌,tasks里面就是我們定義的yaml文件所做的步驟'''

        if actions == None:
            print "no actions"
            raise AnsibleError
        if hosts == None:
            print  "no hosts"
            raise AnsibleError
        self.play_source = dict(
            name=name,
            hosts=hosts,
            gather_facts='no',
            tasks=actions,
                #dict(action=dict(module='shell', args='ls'), register='shell_out'),
                #dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
        )

    def _run_task(self):
        '''run task'''
        play = Play().load(self.play_source, variable_manager=self.variable_manager, loader=self.loader)
        tqm = None
        try:
            tqm = TaskQueueManager(
                inventory=self.inventory,
                variable_manager=self.variable_manager,
                loader=self.loader,
                options=self.options,
                passwords=self.passwords,
                stdout_callback=self.results_callback,
                # Use our custom callback instead of the ``default`` callback plugin, which prints to stdout
            )
            result = tqm.run(play)  # most interesting data for a play is actually sent to the callback's methods
        finally:
            # we always need to cleanup child procs and the structres we use to communicate with them
            if tqm is not None:
                tqm.cleanup()

            # Remove ansible tmpdir
            shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)


if __name__ == '__main__':
    '''
    使用舉例, ip:,號分割
    '''
    ip = 'localhost,'
    test_key = "key1\n \
                key2"

    actions = [
        dict(action=dict(module='shell', args='ls', register='shell_out')),
        dict(action=dict(module='authorized_key', args='user=brick key="%s"' % test_key))
    ]
    ansible_actions = AnsibleApi(sources='../conf/ansible/hosts', name="ansible test", hosts=ip, actions=actions)
    ansible_actions._run_task()

來自官網(wǎng)的python api example,簡單的封裝了一下花履,就可以用了僧界!其中每一步做了什么我都做了注釋,如果還需要了解更詳細的內(nèi)容臭挽,推薦讀下官方文檔,甚至可以讀下源碼咬腕,以后有空了再研究下源碼欢峰,現(xiàn)在業(yè)務(wù)忙也沒時間搞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涨共,隨后出現(xiàn)的幾起案子纽帖,更是在濱河造成了極大的恐慌,老刑警劉巖举反,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懊直,死亡現(xiàn)場離奇詭異,居然都是意外死亡火鼻,警方通過查閱死者的電腦和手機室囊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魁索,“玉大人融撞,你說我怎么就攤上這事〈治担” “怎么了尝偎?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹏控。 經(jīng)常有香客問我致扯,道長,這世上最難降的妖魔是什么当辐? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任抖僵,我火速辦了婚禮,結(jié)果婚禮上瀑构,老公的妹妹穿的比我還像新娘裆针。我一直安慰自己刨摩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布世吨。 她就那樣靜靜地躺著澡刹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耘婚。 梳的紋絲不亂的頭發(fā)上罢浇,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音沐祷,去河邊找鬼嚷闭。 笑死,一個胖子當(dāng)著我的面吹牛赖临,可吹牛的內(nèi)容都是我干的胞锰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兢榨,長吁一口氣:“原來是場噩夢啊……” “哼嗅榕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吵聪,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凌那,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吟逝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帽蝶,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年块攒,在試婚紗的時候發(fā)現(xiàn)自己被綠了励稳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡局蚀,死狀恐怖麦锯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琅绅,我是刑警寧澤扶欣,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站千扶,受9級特大地震影響料祠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澎羞,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一髓绽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妆绞,春花似錦顺呕、人聲如沸枫攀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽来涨。三九已至,卻和暖如春启盛,著一層夾襖步出監(jiān)牢的瞬間蹦掐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工僵闯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卧抗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓鳖粟,卻偏偏與公主長得像社裆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子向图,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容