python操作ansible api示例


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

import json
import shutil
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase
import ansible.constants as C

class ResultCallback(CallbackBase):
    """
    一個用於在結果出現時執行操作的回調插件示例;
    如果要將所有結果收集到單個對象中以便在執行結束時進行處理;
    請查看使用``json``回調插件或編寫自己的自定義回調插件。
    """
    def v2_runner_on_ok(self, result, **kwargs):
        """
        以 JSON 形式打印結果
        此方法可以將結果存儲在實例屬性中以便稍后檢索
        """
        host = result._host
        print(json.dumps({host.name: result._result}, indent=4))

# 由於 API 是為 CLI 構建的,因此需要始終設置某些選項,命名元組偽造的 args 解析選項對象
module_path = '/usr/lib/python2.7/site-packages/ansible/module'
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff'])
options = Options(connection='ssh', module_path=[module_path], forks=10, become=None, become_method=None, become_user=None, check=False, diff=False)

# 初始化所需的對象
loader = DataLoader() # 負責查找和閱讀 yaml、json、ini文件
print(loader)
# 設置ansible密碼
passwords = dict(conn_pass='coolops@123456')


# 實例化 ResultCallback 以便在進入時處理結果,Ansible 希望這是它的主要展示渠道之一
results_callback = ResultCallback()

# 創建 inventory 使用路徑將主機配置文件作為源,或以逗號分隔的字符串中的主機
inventory = InventoryManager(loader=loader, sources='127.0.0.1')
# inventory = InventoryManager(loader=loader, sources='/etc/ansible/hosts')

# 變量管理器負責合並所有不同的源,為您提供每個上下文中可用變量的統一視圖
variable_manager = VariableManager(loader=loader, inventory=inventory)

# 創建表示我們的 play 的數據結構,包括任務,這基本上是我們的 YAML 加載器在內部執行的操作
play_source =  dict(
        name = "Ansible Play",
        hosts = '127.0.0.1',
        gather_facts = 'yes',
        tasks = [
            dict(action=dict(module='shell', args='hostname'), register='shell_out'),
            #dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
         ]
    )

# 創建 play 對象, playbook 對象使用 .load 而不是 init 或 new 方法,這也將自動從 play_source 中提供的信息創建任務對象
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

# 運行它 - 實例化任務隊列管理器,它負責 forking 和設置所有對象以迭代主機列表和任務
tqm = None
try:
    tqm = TaskQueueManager(
              inventory=inventory,
              variable_manager=variable_manager,
              loader=loader,
              options=options,
              passwords=passwords,
              stdout_callback=results_callback,  # 使用我們的自定義回調而不是``default``回調插件,它打印到stdout
          )
    result = tqm.run(play) # 一個 play 的數據實際上是發送到回調的方法
finally:
    # 我們總是需要清理子進程和我們用來與它們通信的結構
    if tqm is not None:
        tqm.cleanup()

    # 刪除 ansible 臨時目錄
    shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)


免責聲明!

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



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